省略時に適用されるデフォルト値を明示的にコーディングすべきか
記述を省略した時に、何らかのデフォルト値が適用されるプログラムに対して、
- 「デフォルト値が自動設定されるなら、いちいち分かりきったことは書かなくていいべ」
と考えるか、
- 「自動設定されるデフォルト値でろうと、その値が設定されて欲しいのであれば書くべき」
と考えるか。
目次
例
例えば、何らかのデータを登録するための関数があったとする。
// ユーザ情報を保存する
hogeFugaApi.saveUser({
name: 'Normal Man',
age: 25
});
この saveUser()
関数のオプションには、ユーザの種類を特定する type
プロパティも隠れていて、上のように type
プロパティを指定しなかった場合は、自動的に type: 'member'
が設定される仕様だったとする。もし 'member'
以外の種類で登録する場合は以下のように書くワケだ。
// 管理者ユーザ情報を保存する
hogeFugaApi.saveUser({
name: 'Super Man',
age: 30,
type: 'admin'
});
今回問題にしたいのは、前者の Normal Man
のような場合。type
プロパティは省略可能だが、省略せず明記すると以下のようになる。
// ユーザ情報を保存する
hogeFugaApi.saveUser({
name: 'Normal Man',
age: 25,
type: 'member' // ← 記載を省略した時のデフォルト値と同じ
});
省略すれば type: 'member'
と書いたのと同じ状態になるワケだから、書かなくても良い、と考えるか。それとも、type: 'member'
を律儀に書くべき、と考えるか。というのが今回の話。
「省略すれば良い」派の考えを想像する
まずは「省略すれば良い」と思う人の考えを想像してみる。
- 省略時に適用される値をわざわざ書くのは、コード量も増えるし煩雑になるのでは
- そのオプションを省略した時に、何のデフォルト値が設定されるかは、リファレンスなどに書いてあるだろうから、分かりきったことは書かない
- デフォルト値になっていれb良かったところも、いちいち記述したせいで、書き間違いによってバグを埋め込んだりするリスクもあるだろう
「省略せず書くべき」派の考えを想像する
次は反対意見を想像してみる。
- デフォルト値であろうと、その値が設定されるべきなのであれば、多少冗長であっても明示的に指定した方が分かりやすい
- コードの読み手は、省略した時に何がデフォルト値になるのか分からないかもしれない
- 呼び出す関数 (ライブラリなど) 側の仕様変更によって、省略時のデフォルト値が変わるとも限らないから、明示した方が安全
双方のシチュエーションが若干異なる
両者の意見を想像して、じゃあどちらがより良いのだろうか〜、と考え始めたが、よくよく見直すと両者が想像するシチュエーションには若干の違いがあることに気付いた。
「省略して良い」派は、「単に書くのが面倒臭い」「書かなくても分かるっしょ」という利己的な思想も強いが、「デフォルト値だと思ってわざわざ書いた値が間違っていた場合はどうする?」という点を掘り下げていくと、「デフォルト値は何でも良い場合」があると思った。
すなわち、最初に書いたサンプルコードの場合、type
が member
になろうが admin
になろうがどうでも良い場合、というモノがあれば、記載を省略して何らかのデフォルト値を適用させてしまって良い、ということだ。
一方、「省略せず書くべき」派は、「明示することで読み手が分かりやすくなる」「呼び出し先の仕様変更も考慮して安全にしたい」という配慮が根本にあるが、コチラの場合は「確実に指定したい値が、たまたまデフォルト値と同じだっただけ」という場合が多い気がする。
すなわち、元々 type: 'member'
を設定しないといけない、と思ってコーディングしていたが、それがたまたま対象の関数のデフォルト値と一致していただけ、という考え方だ。この場合は「何でも良いデフォルト値を指定したい」のではなく、「type: 'member'
を指定したい」のだから、明示的に書きたくなる気持ちも分かるだろう。
どちらが「良いコード」?
それぞれの立場が論じるシチュエーションが若干異なるので、
- 省略時に適用されるデフォルト値が何の値であろうと構わないなら、省略しても問題ない
- その値を指定することに何らかの狙いがある (そしてそれがたまたまデフォルト値と同じだけ) なら、省略せず書いた方が安全
と判断しても良いだろう。
ただ、ほとんどの場合において、「省略時に適用される値が何でも良い」というパターンは発生しないのではないだろうか。例えば「性別未選択の場合」に、
null
とするのか- 空文字とするのか
- どの性別コードとも合致しない
-1
や0
などを入れるのか '未選択'
と文字列で入れるのか
これが「どの値でも良い」としているシステムって、なかなかないと思う。
そう思うと、「記載を省略した方が良い場合」は限りなく少なく、迷うくらいなら明記した方が良いと思う。
プログラムはよく「書いたとおりに動く」と言われる。「書いたとおりに動いた結果がバグっている」なら、書いてある内容を正せば直せる。しかし、「何も書いていない場所がバグっている」のは、バグの原因究明がより難しいと思う。そういう意味でも、書き間違いなどのリスクよりも、確実に書いたことによる「安全」「後の楽さ」を取った方が良いと思う。