2023年7月29日土曜日

if文の使い方で「if (a() == true) 」と「if (true == a()) 」ではどちらの方が一般的な書き方ですか?

https://jp.quora.com/if%E6%96%87%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9%E3%81%A7-if-a-true-%E3%81%A8-if-true-a-%E3%81%A7%E3%81%AF%E3%81%A9%E3%81%A1%E3%82%89%E3%81%AE%E6%96%B9%E3%81%8C%E4%B8%80%E8%88%AC%E7%9A%84%E3%81%AA%E6%9B%B8%E3%81%8D

並べ替え
 · 
フォロー

後者はヨーダ記法ですね!

'Strong is Vader'

変数を左辺に書くと比較式を書いたつもりが代入式になってしまうことがあるというジェダイの教えがあります!

if ( a = true ) // aにtrueが代入されるため、条件式が常に真になってしまう!

そこで定数を左辺に書くことにより、誤って代入式を書いた際はコンパイルエラーになるという技をマスターヨーダが編み出しました。

if ( true = a ) // 定数に代入はできないのでコンパイルエラー

しかしその後多くの言語で、そもそもif文内に代入式を書けない言語仕様が一般的になりました。

if ( a = true ) // 比較式ではないのでコンパイルエラー

しかし古い教えを学んだジェダイ達は、脳死で定数を左辺に書くことに慣れすぎてしまい、定数を左辺に書かないと不安を感じるようになってしまっていました。

柔軟な考えのマスターヨーダはとっくにヨーダ記法を廃止しましたが、頭の固い弟子達は頑なにヨーダ記法を守り続けています。これがジェダイの分裂を推し進め、多くのジェダイが暗黒面に堕ちる比較演算子戦争は今も続いています。

 · 
フォロー

aという関数自体がbool型を返しているのでif(a())だけでいいです。むしろboolを返す関数はis_、has_のような名前に変えることをお勧めします。

if (is_even(1))

これが一番すっきりしませんか?

 · 
フォロー

言語を問わずに言うなら、真偽の比較において、

  1. if(a()==true) 

を選びます。なぜなら

もしa()が真なら

と読み下せるからです。ifという自然言語の単語を使っているのは伊達じゃないです。

逆だと以下になりますが、意味違いますよね。

もし真がa()なら

英語なら

if a() is true

ですね。代入式を間違えて書くのを防ぐみたいな理屈を聞いたことがあるかもしれませんが、少なくともこの場合はa()は右辺値なので左右を入れ替えなくても=と間違って書いたときにエラーとなる可能性が高いでしょう(言語による)。

いずれにせよ、値を問おうとする式を比較演算子の左辺に書くのは基本です。

3 > a

ではなく

a < 3

と書きます。3がaより大きいかどうかを問いたいのではなく、aが3より小さいかどうかを問いたいからです。但し数値が区間内にあるかどうかを判断したい場合は別で、

0 < a && a < 10

みたいに書くことはあります。

割と詳しい人が、if(a() == true)はif(a())と書くべきと主張する事もありますが、それが言えるのはif文が真偽値型しか受け付けない静的型言語であることと、述語として認識される関数名であること、例えばif(x.is_xxx())みたいに読み下せる関数名であることが前提になります。

そうでなければ、if(a() == true)と書くことによって、例えば空リストを返す関数をifに渡すことで意味を曖昧にすることを避け、boolean型に強制できるということと、読み下せるという利点が生まれ、それはif(a())では得られない利点なので、全く問題はありません。

0 コメント:

コメントを投稿