「最後行ではtrueを返すよう作れ」?

http://q.hatena.ne.jp/1169893354
こんなネタがあったんだ.

戻り値がbool型の関数です。何の処理をするものかは無視してください。
この関数、最終行でfalseを返しています。これはやめろと注意されたことがあります。
(最後行ではtrueを返すよう作れということ)

答:NO.
そんなことに拘る暇があったら,良いコードを書く勉強をしろ.最後で返す値がtrueかfalseかなどは,コードの善し悪しにほとんど影響しない.良いコードを書いた結果として「最終行でtrueを返す」ということはあるが,最終行でtrueを返したからと言って良いコードになるとは限らない.

また「最後ではtrueを返すべき」という説自体も極めて珍しい.


ちょっと面白いのがこの意見.

逆に電気回路を組んだり、シーケンサーでラダーソフトを組んだりする場合は「true」派ですね。非常停止回路を組むときとかを考えるとは、やはり「全ての条件をクリアした時、初めて正常を返す」ようにしておかないと、人命をおびやかすことにもなりかねないからです。

こういう話はあるかもしれない.特に「nullを返すな*1」なんてのはこのパターンだ.

話を戻して、プログラミングではその逆です。
最後に「false」を返すようにしておけば、いろんな条件式を経て、全ての正常条件をクリアした時、「異常」を返すので条件の入れ忘れ等があっても、最悪の事態は免れるからです。

残念だけどプログラムでは,trueを返すのとfalseを返すのとどちがより危険になるかは,一般的には決まらない.


この例では一応言語は規定していないみたいだけど,そもそもJavaのように例外機構のある言語では,真の意味で「異常」を表すのは例外であって戻り値ではない.trueだろうとfalseであろうと,戻り値を返すのは「正常終了」だ.*2

あと,もし必要であれば引数チェックは最初にするので,異常系チェックのコードが最初にくるのは普通ですね.*3

public boolean isEditMode(int param){
    if( (param < MIN) || (param > MAX) ){
        throw new IllegalArgumentException();
    }

  〜なんらかの処理〜
  if (param > 80){
    return true;
  }
  return false;
}

*1:長さ0配列や空文字列,その他「何もしないオブジェクト」を返すなどの基本的テクニックがある.

*2:まあぶっちゃけCOBOLerなんかだと,このレベルではそういう発想さえないらしいけどね.

*3:もちろん前だけとは限らず,中でも後でも必要になった時点で,いくらでもチェックを入れる.