個人的にはいまだにヨーダ強要な弊社規約にも物申したいところではあるが
import java.util.*; public class Main { public static void main(String[] args) throws Exception { List<Object> someList = new ArrayList<>(); /* some operation */ if (null != someList) { if (true != someList.isEmpty()) { for (Object element : someList) { System.out.println(element); } } else { System.out.println("List is empty."); } } else { System.out.println("List is null."); } } }
使い方ヒント: 「これは臭う」という行を見付けたら、各行のをクリックしてマーキングしておきましょう(要Twitter OAuth認証)
InternalServerE さん
誤解があるようですが、別にこの投稿はヨーダ記法がウンコだと言いたいわけではありません。 諸説あることも理解しています。 確かにアピールポイントに書くべき内容ではなかったかもしれません。 これは私のミスです。
その上で あえて 反論させていただきます。
ヨーダ記法は条件式として等値比較と代入を取り違えたときにコンパイラエラーを発生させることによってバグを事前に予防するというノウハウと理解しています。
しかし、Java においては条件式として利用可能なのは boolean 型のみであり、もし等値比較と代入を取り違えればヨーダ記法でなくても型エラーが発生します。
ゆえに Java に限ってはヨーダ記法である意味がないのです
(ただし、boolean のラッパークラス変数にnull
を代入してしまった場合に関しては実行時にこそエラーになりますがコンパイラは捕捉してくれません。 ですので 9 行目はギリギリ意味があるかもしれません)
(boolean 型の等値比較と代入を取り違えたときはどうかって? それこそが私がこれを投稿した理由です)。
一方で Java で意味のある、見た目がヨーダライクなノウハウにif ("some_strings".equals(s))
というものがあります。
これはif (s.equals("some_strings"))
とするとs
がnull
だったときに発生するぬるぽを抑制するという意味があります。
これもぬるぽを隠蔽してしまうのが正しいのかという議論はあると思いますが、null
が入る可能性を承知のうえで、その場合は偽としたいと思っている場合、Null チェックを書き足すよりもスマートな方法でしょう。
世の中に普及しているという事実は正当性を担保するものではありません。
たとえば、セキュリティに厳しい金融企業のサイトほど、しつこく「定期的にパスワードを変更しろ」と通知してきます。 しかしパスワードを定期変更することでセキュリティを向上することはないということはいまや提唱者さえも認めています。
世の中に普及しているから問題ないのだ、という理屈は「伝統に訴える論証」と呼ばれ、誤謬あるいは詭弁の一種です。
今更気づいた。なんか俺、面倒な方に絡まれちゃってる。。
コメント投稿には、twitter認証が必要です。
Twitter認証
ヨーダ云々は人により意見の割れる話題であり、有名なOSSのソースにも割と普通に登場しているくらい、市民権も得たコードスタイルだったりもする。一概にウンコと呼んでしまうのは価値観が偏っている印象。
それよりも、コードの階層を不必要に深く書いてることの方がずっと気になる。