鍵となる考え:条件やループなどの制御フローはできるだけ「自然」にする。コードの読み手が立ち止まったり読み返したりしないように書く。
条件式の引数の並び順
if (10 <= length)
よりも、
if (length >= 10)
の方が読みやすい。
左側:「調査対象」の式。変化する。
右側:「比較対象」の式。あまり変化しない。
※個人的には、数学の記法(1 < 2 < 3)の流れで、不等号の向きを決め打ち(<)にすることが多いのだけど、等号・不等号も含めた包括的なルールとしては、「左が調査対象、右が比較対象」の方が良いかも。
あと、
if (obj = NULL) // 本当は if (obj == NULL) としたい
というバグを防ぐために
if (null == obj)
とする記法(本書では「ヨーダ記法」と呼ばれている)は、現代のコンパイラは if (obj = NULL)と書くと警告を出してくれる
ので、過去のものになりつつある
とされているけど、コンパイラを介さないインタプリタ言語では現代でも実用性がある。
if/else ブロックの並び順
- 条件は否定形よりも肯定形を使う。例えば、if (!debug)ではなく、if (debug) を使う。
- 単純な条件を先に書く。if と else が同じ画面に表示されるので見やすい。
- 関心を引く条件や目立つ条件を先に書く。
三項演算子
鍵となる考え:行数を短くするよりも、他の人が理解するのにかかる時間を短くする。
基本的には if/else を使おう。三項演算子はそれによって簡潔になるときにだけ使おう。
do/while ループを避ける
私の経験では、do-statement は、エラーや混乱の原因になることが多い。(中 略)私は条件が「前もって」書かれている方が好きだ。そのため、私は do- statement を避けることが多い。
関数から早く返す
ガード節
public boolean Contains(String str, String substr) {
if (str == null || substr == null) return false;
if (substr.equals("")) return true;
...
}
悪名高き goto
C言語以外では、goto はほとんど必要ない。
ネストを浅くする
ネストが増える仕組み:既存のコードの変更を少なくしつつ条件分岐を付け足す、といった場合に増えやすい
対策:変更するときにはコードを新鮮な目で見る。一歩下がって全体を見る。
実行の流れを追えるかい?
コードの流れを追いにくくする構成要素:
- スレッド
- 例外
- 関数ポインタと無名関数
- 仮想メソッド