リーダブルコード 7章。制御フロー(if文などの条件分岐)について
ここらへんは個人個人癖がついているとおもいますが、確かに読みやすい、読みにくいというのはあるのでなるべく汎用性のある規則を身につけたいと思います。
条件式の並び方
具体的に読みやすいコードと読みにくいコードを列挙して見ます。
1 2 3 4 5 |
× if( 10 < length ) ○ if( length > 10 ) × if( bytes_expected > bytes_received ) ○ if( bytes_received < bytes_expected ) |
一般的に条件式では
左 変化する値。比較する側の値
右 あまり変化しない値。比較される側の値
の形が一番自然のようです。おそらく人間の頭の構造がそうなっているんでしょうね。・・
ifelseの並び方
- 条件は否定より肯定系を使う。if(!debug)よりはif(debug)にする
- 単純な条件を先に書く
- 関心を引く条件や目立つ条件を先に書く
1は納得。例外としては否定形のほうが一般的なパターンですかね。
例えばPHPの空白条件なんかは下記のようなときに使われることのほうがおおいでしょう。
1 |
if( !empty( $var )) |
2,3は確かに衝突することのほうが多いかも。要は頭を疲れさせない並び方にするのがポイントってことでしょうか。
三項演算子
自分が初期のころそうだったんですが行数を短くすることにこだわりすぎてて、無理やり三項演算子を使ってました。コードを読みやすくするのが目的なので意味なく使うと当然読みにくくなります。
三項演算子が一番有効なのは変数が空かどうかをチェックする(あるいはそれに近い)パターンでしょう。短くすることが自己目的化して使いすぎないほうがいいですね。
do while ,go toを使わない
あまり推奨される記述方法ではないようです。自分は元々ほとんど使ってません。
関数は結果を早く返す
1 2 3 4 |
public boolean Contains (String str,String substr){ if( !empty( $var )) return false; if( substr.equals("") ) return true; |
ポイントとしては例外的な条件だったり、いらない条件をなるべく早めに除外してしまおうということですね。
これらを同一のif文の中に入れておくとネストが複数になり、複雑になって読みにくくなるからでしょう。
ネストを浅くする
基本ですね。一般的には2段ぐらいが上限かと思います。それ以外は見にくくなるのでメソッド化するか他の手法を考えましょう。
全体を通してポイントとしては流れがおいやすいか、頭に負担をかけないかといったことでしょうね。7割ぐらいは実行できているかな・・・