ぺんちゃん日記

食と歴史と IT と。 Web の旅人ぺんじろうが好奇心赴くままに彷徨います 。

【AutoHotkey】連想配列を使って警告メッセージボックスを表示する処理を簡潔に書く。後編

f:id:yasushiito:20190403184928p:plain
前回からの続きです。

問題だらけのマイツール。

これまでのソースコードを見ていただければ分かりますが、処理の続行が不可能な時に黙ってアプリケーションを終了しています。
これはいけません。
プログラムが正常に処理を終わらせるのは当たり前。
プロとアマチュアで差が出るのは異常な状況に出くわしたケースでユーザが混乱しないような丁寧さを実現できているかてところです。
動けばよかろうで手っ取り早く作業を完了させてしまうのはダメな習慣です。
こんなプログラムをコピペして大量生産してしまうの、それこそ負の遺産です。
被害が小さいうちに例外書類を用意したいと思います。

どんな方法が良いか。

例外の対処方法はいろいろありますが、最も簡単確実なのはメッセージの表示でしょう。
ユーザに問題が起きた理由と対処方法をメッセージして対応してもらうことになります。
ただしメッセージボックスは実装が楽ですが、OK ボタンでリアクションしてあげないと先に進まないので自分には嬉しくありません。
タイマーをセットして一定時間が経過したらウィンドウを閉じてもいいかくらいに思ってましたが、 Auto HOT key のメッセージボックスは第4パラメータで数値を与えるだけで簡単に実現できます。
すごく便利じゃ。

目標。

メッセージを出して中断する処理はそこら中にあります。
全てのスクリプトにあると言っても過言ではありません。
頻繁に使う機能ですから可能であれば1行で簡潔に済ませたい。
メッセージの出力と処理の離脱の二つを行って欲しいです。
ここでif 文を使ってしまうと最低2行使ってしまいます。
そこで関数ライブラリにまとめることにします。
警告コードを渡せば、その警告コードにふさわしいメッセージを表示するわけです。

実装してみる。

条件と警告コードをパラメータで渡せば、条件の判断とメッセージの出力とアプリケーションからの離脱を行いたいです。
悩ましいのは誰がいつどこでメッセージを用意するかです。
include を使えば関数を読み込みながら初期化もしてくれるかなと期待しましたが、初期化はできても変数の参照ができません。
どうしても変数の参照と初期化は別のファイルになります。
メッセージはグローバル変数に持つことにします。
呼び出す側はメッセージを入れた変数を用意して初期化する責任があります。

こんな感じでどうでしょうか。
if 文は呼び出し側においたほうが可読性が良さそうな気もします。


メッセージを初期化する処理はこんな感じです。

呼び出す側はこんな感じに事前に変数を初期化してメッセージを設定してもらいます。

そして処理本体はこんな感じ。
多分ソースコードの12行目くらいにあると思いますが、メッセージを出力する条件とメッセージコードを渡しています。


まとめ。

それほどコードの可読性を失わずに警告メッセージを表示できるようになりました。
グローバル変数の初期化をもうちょっとスマートにする方法は今後の課題とします。

この記事に登場するAutohotkey スクリプトについて

この記事の中で私が作成したプログラムは、全て自由に使うことができます。
詳しくはこちら