条件演算子(三項演算子)を可読性低いとか言わせない

  • 181
    いいね
  • 2
    コメント
この記事は最終更新日から1年以上が経過しています。

C系構文規則の言語で出てくる、単に三項演算子とも呼ばれる条件演算子という演算子があります。

【真偽値式】 ? 【真の場合に評価する式】 : 【偽の場合に評価する式】

この条件演算子、可読性を損なうとして使用を禁止とするコーディング規約が定められることがあり、そのたび議論を呼びます。このくらい読めないでプログラマかよ、いや実際読みにくいよ、などなど。

しかし、改行とインデントでこういう書き方をすれば可読性は良好なんじゃないですかねというご提案。

単独で使う場合

= 【真偽値式】
    ? 【真の場合に評価する式】
    : 【偽の場合に評価する式】

真の場合、偽の場合の式がボリュームのあるものの場合に可読性が落ちません。
行コメントも加えやすくなります。

入れ子で使う場合

条件演算子の入れ子など論外、という方もいらっしゃると思います。でもこんな書き方なら?

= 【真偽値式1】 ? 【真偽値式1が真の場合の式】
: 【真偽値式2】 ? 【真偽値式2が真の場合の式】
: 【真偽値式3】 ? 【真偽値式3が真の場合の式】
: 【真偽値式4】 ? 【真偽値式4が真の場合の式】
: 【真偽値式5】 ? 【真偽値式5が真の場合の式】
              : 【すべて偽だった場合の式】

switch文や連想配列で微妙に表現しきれない多条件分岐があっても、if-elseを連ねることなくさらっと表現できます。しかもこれも行コメントが加えやすいですね。

入れ子で使う場合その2・単独使用タイプの応用

前項のswitch的な入れ子でなく本当に複雑な入れ子になったビジネスロジックというのもあって、まあそういうのはどう書いたって可読性は悲惨なんですが、最初の方式のインデンテーションだとまあ最低限の読みやすさは確保できるんじゃないですかねという例。

これが

boolean 立ち会いの必要性 = 
    一戸建てである
        ? 門や戸の鍵が締まっている
        : オートロックである
          && 開けてくれる管理人がいない
          && ガスメーターが屋内にある;

と、こんな感じ。東京ガスの説明よりは可読性高くありません?

重要な注意:PHPではネストの結合則が違う

たった今twitterでいただいた重要なコメントの反映。

「C系の構文規則の言語」にはおそらくPHPも含まれることになると思いますが、PHPの条件演算子はほかのほとんどの言語のものと違い、左結合です。
なので、この記事の方式で「読みやすく」した入れ子記述をすると見た目とまったく違った解釈をされます。この記事の記法提案に関してPHPだけは例外とお考えください。