変数名(特に真偽値変数の変数名)は「事象」を書くか「目的」を書くか
問
変数名を指定する際、「事象」に倣って定めますか?それとも「目的」に倣って定めますか?
理由も合わせて教えてください。
「事象」および「目的」という単語の意味は、下記例を参考にしてください。
わからなければ随時聞いていただけると幸いです。
/**
* 事象に倣って変数名を定める例
*/
// textがnullであることを表す
hasNullText = text === null
// 例えばoperatingEnvironmentが `:{uuid}-production` という文字列の場合
// ({uuid}にはUUID文字列が入るものとする)は本番環境であることを表す
isProduction = /:.{36}-production/.test(operatingEnvironment)
/**
* 目的に倣って変数名を定める例
*/
// テキストがnullの場合はエラーデータとする判定時に使う変数
isErrorData = text === null
// 本番環境ではキャッシュを利用する判定時に使う変数
enabledCache = /:.{36}-production/.test(operatingEnvironment)
背景
「ちゃんと意味のある変数名を付けなさい!」
このように言われて育ってきたプログラマーの皆様におかれましては、常日頃から「意味のある変数名」を探して東奔西走しているかと存じ上げます。
しかし、「意味のある変数名」というのは、抽象的ではないでしょうか?
誰に何を伝えれば「意味のある変数名」と言えるのでしょうか?
その一例として、変数名は何を表しているべきか?という問題があります。
具体的には、誰に対して変数名が理解しやすい物であるべきか?と言い換えてもいいかもしれません。
例として挙げました、「事象」に倣って変数名を定める場合、および、「目的」に倣って変数名を定める場合とは、すなわち以下の通りです。
- 「事象」に倣って変数名を定める
- 変数の値を決定づける事象から変数名を定める
- 変数の値を決定づける事象自体が複雑な場合に、何を
- (どちらかといえば)変数定義者に優しい
- 「目的」に倣って変数名を定める
- 変数利用時の目的から変数名を定める
- 変数定義箇所だけを参照して定義している理由を把握しやすい
- (どちらかといえば)変数利用者に優しい
それぞれメリット/デメリットがあると考えています。
個人的に思いついた例としては、以下の通りですが、他にも様々な理由が挙げられるはずです。
// ✅ どのような事象が重要であるかわかりやすい
hasNullText = text === null
isProduction = /:.{36}-production/.test(operatingEnvironment)
isStaging = /:.{36}-staging/.test(operatingEnvironment)
// ❌ textがnullであることとTypeErrorの関係がわかりづらい
if (hasNullText) {
throw new TypeError()
}
// ✅ 本番環境でのみキャッシュすることがわかりやすい
setCache(isProduction)
// ✅ 複数の目的で同じ変数を利用しやすい
addProbe(isProduction)
// ❌ 本番環境かつステージング環境といった、判定値が複数の場合にはデータ初期化することがわかりづらい
resetData(isProduction && isStaging)
// ✅ どのような目的で定義しているかわかりやすい == 変数が不要になった際に削除しやすい
isErrorData = text === null
enabledCache = /:.{36}-production/.test(operatingEnvironment)
// ❌ 同じ事象であったとしても、目的ごとに定義し直す必要がある
shouldAddProbe = /:.{36}-production/.test(operatingEnvironment)
shouldReset = /:.{36}-(production|staging)/.test(operatingEnvironment)
// ✅ 変数定義の時点に戻っても判定値の設定方法がわかりやすい場合には、目的とTypeErrorの関係がわかりやすい
if (isErrorData) {
throw new TypeError()
}
// ❌ 変数だけ見ても「そりゃそうじゃ」としか言えない場合がある
setCache(enableCache)
addProbe(shouldAddProbe)
// ✅ 判定値が複数の場合でもデータ初期化することがわかりやすい
resetData(shouldReset)
皆様は、どのようにして以上を区別していますか?
それとも区別していないのであれば、どのように変数名を考えていますか?
また、混ざってもいいと考えられている場合は、どちらがどちらと意識していますか?
ご指導、ご鞭撻のほど、よろしくお願いいたします。