リテラルが先か後か問題

http://d.hatena.ne.jp/nowokay/20090219#1235014270

ちょうどお仕事が忙しかった時期なので、化石レス。個別につっこむのはやめておいて結論だけ。

この議論、僕自身もスタイルの問題だとか状況判断、メリット/デメリットのトレードオフの問題だと思ってたけど、全然違ってた。

何故にリテラルを先にしないといけないとかというと、ソフトウェアは非情なまでに正確さを要求するからだ。なんでソースコードが情報元として貴重なのかというとノウハウの蓄積というのもあるけど、その正確さによるところも大きいと思う。

で、リテラルを先に書くと正確さを保てない。

  public boolean isSomeState(String state) {
    return "STARTED".equals(state)  || "PROCEED".equals(state);
  }

上のコードにstateがnullの場合にプログラマがどういう態度を取っているのか明らかになっていない。そもそもstateがnullableなのかも判断がつかない。規約でnull == stateみたいなのを付ける付けないという規約があったとしても規約が守られてない可能性も考慮しないといけないからどう頑張ったとしてもCarefullなコードになる。

当然、頭の中に無駄なコストもかかることになるので、オブジェクト指向的でもない。

  public boolean isSomeState(String state) {
    return state.equals("STARTED")  || state.equals("PROCEED");
  }

それに対してリテラルを後ろにした場合はnull対する態度を正確に書かざるを得ない。上の例ならメソッドがnullを許容しないことは明らかだ。nullを許容する場合はstate == nullを付けないとアウトなので、どっちにしてもロジックは正確に表される。

こっちは書いてある通りなだけなので、頭の中にかかるコストも最小限に抑えられてる。


結局の所、リテラルを先にするか?後にするか?という問いは、正確さを要求してくるソフトウェアに対して正確さで対抗するのか?不正確さで対抗するのか?という問いであって、ソフトウェアエンジニアなら後者を選択してはいけないというお話。

トレードオフも状況判断も必要ない。