プログラミングをしていると、if
や、for
など、基本的な構文をよく利用する場面に出くわします。
ある条件を満たせば、次の処理を走らせる場合など、ちょっとしたプログラムを組むだけで複雑怪奇になりやすい。
読み手に伝わりやすいように、コメントアウトと段落を上手く駆使してプログラムを書くクセをつけましょう。
複雑な条件などを、後から自身で見直す時や、レビューしてくれる人に分かりやすく伝えるために、コードは書くべきです。
今回は AND OR編 として、「読みやすいコード」を少し深堀してみましょう。
if 構文でORとANDが入り乱れる場合
まず、ORとANDの判定が入り乱れる場合は ()(カッコ)
を付けた方が読み手に優しく、意図しない判定での事故が減ります。
例えば、以下の if 文に三つのORとANDが入るだけで 既に読み手にわかりにくいです。
if (A && B) || (A && C) || (A && D) { // 各条件をどれか満たせば処理が走る }
この条件を解説すると、「AとBが共にTrue(&&)、または(OR)、AとCが共にTrue、または、AとDが共にTrueである場合、処理を走らせる」(この時点で、もーややこいわ汗)
後から自身が見直したり、特に読み手(レビュワー)にとっては、ぱっと見分かりづらいです。
読み手により短い時間で伝えるには、
- どういった判定なのか
- なぜこの判定をしているのか
のコメントが欲しいところです。
その場合は、下記のように改行しちゃいます。
例: Aを「雑種」、それ以外を「動物の種類」とする。
if ( (A && B) // 雑種でイヌ || (A && C) // または雑種でネコ || (A && D) // または雑種でウサギ ) :
これで、各行がコメント付きで「何の条件で満たすのか」が明確になりましたね。
「または (OR) 」もさほど頭で考える必要もないかと。
AND ORをシンプルに書く
ちなみに、この判定自体は下記のように置き換えられます。
if (A // 動物種が雑種 && (B || C || D)) : // かつ(イヌ・ネコ・ウサギ)のいずれかの場合
「A」の部分は一つにまとめてしまって、違いは動物の種類しかないので、まとめてORさせる書き方も可能なんですね。
より、シンプルになり、改行を挟むことによって、動物の種類にフォーカスすることができました。
関数を使って条件をシンプルに
関数を使えばよりスマートに置き換えることが可能です。各ペットのデータが配列の場合はin_array
でまとめて判定もできます。(その場合は ()(カッコ)
が無くても読み間違えない )
※ 以下のプロパティ名、hybridが「雑種」、pet_idが「各動物種類ID」とします。
// 雑種かつ(イヌ-ID:10・ネコ-ID:20・ウサギ-ID:30)のいずれかの場合 if ($hoge->hybrid === 1 && in_array($hoge->pet_id, [10, 20, 30])) :
同じ目的の処理でも、ずいぶん違う書き方ができます。
データ型によっては、関数を利用してよりスマートに書くことができますね。
最後に
とはいえ、プログラミングを始めて間もない人には、ある程度コードに書き慣れるまでは、レビュワーに読みやすくとか、考えすぎる必要はないです。まずは期待通りに動くことが大切。(逆にプログラムを書けなくなるので)
とりあえずは、「自分が期待(やりたい)ことは何か?」を明確にし、期待する結果が得られてから、ソースコードの見やすさ、違う側面からの意図などに考慮し、改良(リファクタリング)していけばよいと思います。