先日、Twitter でタイトルの様な質問に出会った。この問いに簡単に答えたのだけど、140 字では全てを伝えきれないので、改めてブログのエントリーにする。
前置き
短い if 文をこう書くとする。
if (条件A || 条件B) 省略
if 文の中が長くなった時、読みづらい。
if (とっても長〜〜〜い条件A || とっても長〜〜〜い条件B) 省略
この時、どう書くのが良いか? 一例としてこんなのがある。
if (
とっても長〜〜〜い条件A ||
とっても長〜〜〜い条件B
) 省略
||
を条件式の後ろに置く書き方。
私見
ぼくは ||
を条件式の前に置く書き方を好む。
if (
とっても長〜〜〜い条件A
|| とっても長〜〜〜い条件B
) 省略
インデントが少し崩れる。これはデメリットとして認める。
それよりも、「OR」である事が行頭を見るだけで分かるメリットを強調したい。「前置き」に例示した行末に置くやり方だと、行末まで目を動かさないと、条件式が ||
で繋がっていることを確認できない。
ぼくらは最初から if (条件A || 条件B)
というコードを見ているので「OR」だと分かっているけれども、実際にコードを読む時はそれが「OR」なのか「AND」なのか分かっていない。行頭に置けば、初めて読むコードでも一目瞭然になる。
if (
とっても長〜〜〜い条件A
|| とっても長〜〜〜い条件B
|| とっても長〜〜〜い条件C
|| とっても長〜〜〜い条件D
|| とっても長〜〜〜い条件E
) 省略
条件文が複雑になった時も、読みやすい。理解しやすい。
if (
(
とっても長〜〜〜い条件A
|| とっても長〜〜〜い条件B
)
&&
(
とっても長〜〜〜い条件C
|| とっても長〜〜〜い条件D
|| とっても長〜〜〜い条件E
)
) 省略
分かりやすい、ということはバグが減るということ。コーディング一つ取っても、少し気を配るだけでバグを減らせる。
あとがき
本来、こういった長い条件文は、別関数にするのが定石。
ただ、プロファイルを見たらループの中の if 文の条件文がネックになってて、関数呼び出ししないコードにすることでプログラムの致命的な遅さが解決する... なんて泥臭いケースがある。マクロ (Lisp など) やインライン関数 (C99, C++ など) が使える言語なら幸せだけど、そういう言語を使っていない場合もある。
そういう場合に備えて、一つ頭の隅に入れておいてもらえれば。
なお、これはあくまでぼくのやり方にすぎない。他に良い方法があれば、是非、ブログの記事にして欲しい。