2012-06-28

if (条件A || 条件B) の条件文が長くなったら、どこでコードを折り返すか?

先日、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++ など) が使える言語なら幸せだけど、そういう言語を使っていない場合もある。

そういう場合に備えて、一つ頭の隅に入れておいてもらえれば。

なお、これはあくまでぼくのやり方にすぎない。他に良い方法があれば、是非、ブログの記事にして欲しい。

No comments:

Post a Comment