コードの見た目がそろったら,
せ,
難しく考える必要はないさ。たしかにデザインパターンみたいな有名な設計技法はいろいろあるけど,
粒度?
大きな実装は適切な粒度に分割しよう
放っておくと実装は肥大化する
プログラムを開発していると,
リスト1は,
リスト1 肥大化した実装
var ForceAuthAtStartup = {
// Thunderbird が起動したあとにこのメソッドが実行されると仮定する
onMailStartupDone: function() {
// ① UI を非表示にする
document.documentElement.style.visibility = "hidden";
// ②認証が必要な受信サーバを収集する
var allServers = MailServices.accounts.allServers;
var servers = [];
for (let i = 0, maxi = allServers.length, server; i < maxi; ++i) {
let server = allServers.queryElementAt(i, Ci.nsIMsgIncomingServer);
if (server.type != "none")
servers.push(server);
}
// ③各受信サーバに認証を試行する
var successCount = 0;
var failureCount = 0;
servers.forEach(function(server) {
server.verifyLogon({
OnStartRunningUrl: function() {},
OnStopRunningUrl: function(url, exitCode) {
// ④個々の受信サーバで認証に成功したかどうかを判別する
if (Components.isSuccessCode(exitCode))
successCount++;
else
failureCount++;
// ⑤すべてのサーバの処理が終わったら,全体の成否を判定する
if (successCount + failureCount == servers.length) {
// ⑥全体の成否の判定結果に応じて処理を行う
// ⑦すべて成功ならUI を再表示する
if (successCount == servers.length)
document.documentElement.style.visibility = "";
else // ⑧そうでないならThunderbird を終了する
Cc["@mozilla.org/toolkit/app-startup;1"]
.getService(Ci.nsIAppStartup)
.quit(Ci.nsIAppStartup.eAttemptQuit);
}
}
}, MailServices.mailSession.topmostMsgWindow);
}
}
};
リスト1の実装は,
しかし,
思いつくまま作業を進めた場合や,
このような肥大化した実装をより良い設計に改める方法としては,
- 注1)
- ここでは,
ツールバーやボタン, メール一覧など, ユーザの目に見える部分を指します。
解決しようとしている問題を切り分けよう
プログラムの中での実装の単位の大きさは,
しかし,
初級者と中・
問題を切り分ける基準としてわかりやすいのは,
- Thunderbirdの起動時に全体の処理を開始する
- UIの状態を変える
(表示・ 非表示の切り替え, 終了など) - 受信サーバで認証する
(認証を試行して, 成功したか失敗したか判断する)
- 注2)
- 絶対的な指標ではなく,
相対的な大小を言い表す言葉です。