読者です 読者をやめる 読者になる 読者になる

Murga

個人的に言いたいコト・主張・気持ち。

ヨーダ記法は Null であることの意味を考えないバカの表れ

Java において String#equals() で比較をする時に、「対象の変数が null の場合に起こる NullPointerException を回避するために定数を先に書け」と言われて、それまでプログラミングしたことなかった新人の俺でさえ嫌悪感が凄くて、結局「つか null チェックしないのが悪いんじゃん、そんなに null が嫌なら StringUtils#equals() でも使え」と言って現場のコーディングルールを変えたことがある。

ヨーダ記法の違和感は、自然な英語として読んだ時に主述が逆転することにある。だが、英語ができない人間はそもそもソースコードを「英文」とは捉えていないので、当然変数名もメソッド名もグチャグチャ、テキトーな英語使って平気で regist() メソッドとか作っちゃう。彼らは自ら書くコードさえ、ただの召喚魔法みたいにしか認識できていないのだろう。

そして、日本語の脳でコードを読むと、「(定数) と (対象の変数) が同じ値なら」と自然に読み替えられるので、主述の逆転に違和感が持てないのかもしれない。

しかし、equals() メソッドの持ち主は誰か、といったオブジェクト指向の考え方を少しでも持っていれば、「この定数が、対象の変数と同値なら」という条件の書き方は違和感を持てるはずだ。その場の主役は「対象の変数」なのだから主語が逆で、「対象の変数が、その定数と同値なら」と表現すべきである。

英語ができないでコードを書いている人間は総じて日本語についても理解する気がないので、こっちが主語だ述語だといくら説明しても響かない。「そんなもんよくわかんねえよ」とシャッターを下ろしてしまっている。そうなるとこちらはもう暴力で邪魔な奴を追放するしかなくなる (…が、暴力も振るえないので転職するワケだ)。

その処理でぬるぽの恐れがあるなら、それに対する例外を設計しないといけないのである。「対象の変数が null でも動くようにしてしまって、本当にいいのか?」ということだ。ダメなのであれば、別のバリデーションロジックと例外ハンドリングを設ける必要があるのだし、null を許容するなら null チェックのロジックを入れ、null の場合の操作を明確にすべきなのである。そして、「null でも構わないけど比較はしたい」のであれば、StringUtils なり、Java8 からなら Optional なりを使えばいいのである。

それを、コードを自然に読めなくする「主述の入れ替え」という手法で逃げようとするのは愚の骨頂だと思っている。そんな中途半端な知識のまま仕事してるからお前のコードも日本語もワケ分かんねえんだ。