期待値は左か右か

つまらない論争なんですが、値を比較をするするときに期待値を演算子の左と右のどちらに置くべきなのでしょう。つまり、

if (value == expected)

と書くべきか、

if (expected == value)

と書くべきかという問題です。

私は前者にすべきと考えています。

もし、valueがexpectedと等しいならば、

というように自然言語では興味の対象の方が前に先に来ます。コードでもそれに合わせた方が自然で読みやすいと思います。

一方で、期待値の方を左にするべきという流儀もあります。彼らの主張は、

if (expceted = value)

と書き間違えたときに、expectedが定数ならばコンパイル時にエラーとなるので誤りを検出できるということです。センスがない主張だと思います。これだと感情論になってしまうので、理屈をつけて反論すると、

  • そんな間違いは少ないし、あってもテストで必ず見つけれられる。
  • それよりも、()の中で代入すること自体を禁止すれば良いのではないか。

となります。後者について、

if ((fp = fopen("filename", "w")) == NULL) 

こういう書き方がCの教科書に載っていますが読みにくいので非常に嫌いです。規約でこれは禁止して、ビルド時にこういう文が入ってるかを検査するべきなのです。そうすれば、===を間違えるなんてミスもなくせます。

以上は可読性原理主義者の主張かもしれませんが困ったことがあります。JUnitassertEquals

assertEquals(expected, actual);

と、期待値の方を左に書かなければならないのです。

個々の主張よりも統一感の方が大事です。バラバラのコードよりは、間違った主張で統一されたコードの方がましです。

JUnitを使うと私の主張との整合性が取れなくなります。この場合、JUnitとの不整合は目をつぶるべきなのか、私が折れるべきなのか……悩ましいところです。

Code Complete 第2版 上 完全なプログラミングを目指して

Code Complete 第2版 上 完全なプログラミングを目指して

The Art of Readable Code (Theory in Practice)

The Art of Readable Code (Theory in Practice)