見た目,
えっ? いつも適当に付けてるから,
おいおい……そういうのは良くないな。プログラミングの半分は設計で残り半分は名前付け,
そ,
名前が付いていない条件に名前を付けたり,
そう言われると,
複雑な条件には名前を付けよう
if文などで条件式を書くとき,
条件式を別の関数に分ける
たとえばJavaScriptにおいて,
- JPEG
- JPG
- jpeg
- jpg
またPNGファイルと判断する拡張子は次の2種類とします。
- PNG
- png
これを素直に書くとリスト1のようになります。しかし,
リスト1 長すぎる条件式
function doSomething(fileName) {
var extension = getExtensionFromFileName(fileName);
// 条件式が長すぎて読みづらい
if (extension === "JPEG" ||
extension === "JPG" ||
extension === "jpeg" ||
extension === "jpg" ||
extension === "PNG" ||
extension === "png") {
// ファイルに対して処理を行う
}
}
そこでリスト2のように,isJPEG
,isPNG
と名前を付けて,isJPEG()
やisPNG()
の詳細は知らなくても,
リスト2 条件式を別関数に抽出する
// JPEG ファイルの判別をisJPEG() として抽出する
function isJPEG(extension) {
return (extension === "JPEG" ||
extension === "JPG" ||
extension === "jpeg" ||
extension === "jpg");
}
// PNG ファイルの判別をisPNG() として抽出する
function isPNG(extension) {
return (extension === "PNG" ||
extension === "png");
}
リスト3 抽出した関数を使って判断する
function doSomething(fileName) {
var extension = getExtensionFromFileName(fileName);
// 条件式がシンプルになり読みやすくなる
if (isJPEG(extension) || isPNG(extension)) {
// ファイルに対して処理を行う
}
}
変数を使用する
真偽値を返す関数であっても,
例として,g_
という関数を見てみます。この関数は指定したファイルの中身を取得するための関数で,g_
は真偽値が返される仕様であるため,
リスト4 条件式の中での副作用のある関数呼び出し
if (!g_file_get_contents(file_name, &contents,
&length, &gerror)) {
/* エラー処理 */
}
しかしg_
は4つも引数を取るため,
また,g_
の仕様を知らない人がこのコードをデバッグしようとしたとき,
さらに言えば,
このような場合には,g_
の戻り値を一度succeeded
という名前の変数に代入するとよいでしょう。この関数の仕様を知らない人にとっても,
リスト5 副作用のある関数呼び出しを条件式の外に出す
gboolean succeeded = g_file_get_contents(file_name,
&contents,
&length,
&gerror);
if (!succeeded) {
/* エラー処理 */
}
条件には真偽型であることがわかる名前を付ける
先ほどの例でも見たように,
- available
(利用できる), downloadable (ダウンロードできる) のような具体的な状態を表す形容詞 - connected
(接続された), succeeded (成功した), failed (失敗した) のような具体的な動詞の受動態 - is,
has, can, shouldなどの接頭辞を伴ったhasAttributeやisPNGのようなフレーズ
Rubyのメソッド名においては,connected?
のように名付けるという慣習もあります。
たとえば,getConnectedStatus()
という名前であったことがありました。この関数は真偽値を返す関数で,
リスト6 条件式の中の関数が何を返しているかわかりにくい
if (getConnectedStatus()) {
/* 接続状態の処理 */
} else {
/* 切断状態の処理 */
}
しかし,getConnectedStatus()
という名前からは,
このときはリスト7のように,is
を付け,Status
を外して,isConnected()
という関数名に変更しました。これは状態を取得する関数での話ですが,connected
という1単語にしてもよいでしょう。
リスト7 条件式の中の関数が真偽値を返すことがわかりやすい
if (isConnected()) {
/* 接続状態の処理 */
} else {
/* 切断状態の処理 */
}