リーダブルコードを読む part7
こんにちはかわです。
アドベントカレンダー22記事目
前回の続きです
7章 制御フローを読みやすくする
1 条件の引数の並び順
左側 | 右側 |
---|---|
「調査対象の式」。変化する。 | 「比較対象の式」。あまり変化しない。 |
2 if/elseのブロックの並び順
- 条件は否定型より肯定形を使う。
- 単純な条件を先に書く。ifとelseが同じ画面に表示されるので見やすい。
- 関心を引く条件や目立つ条件を先に書く。
この優劣は衝突することがあるため、臨機応変に対応する。
3 三項演算子
行数を短くするよりも、他の人が理解するのにかかる時間を短くする。
基本的にはif/elseを使う。三項演算子は簡潔になるときだけ使用する。
4 do/whileループを避ける
do/whileのループは書き直せることが多い
何のループかをわからせるためにも先に書いたほうがいいかも
5 関数から早く返す
関数から早く返すことはいいことらしい。
returnを1つにしたいということは、
何らかのクリーンアップコードを実行したいから?
関数終了後に呼び出されるコードは各言語あるので調べてみるといい。
6 悪名高きgoto
c言語以外ではgotoは必要ない。
ー>同じことをする方法が他に存在するから。
基本的には使うな
7 ネストを浅くする
ネストが増える仕組み
機能を追加する際、コードを最も挿入が容易な場所に挿入した結果、
ネストが増えることが多い。
早めに返してネストを削除する
ネスト内部のループを削除する
ループ内で早めに返す場合continueを使う。
ただしcontinueはループを行ったり来たりするためわかりにくい。
気をつけるべき。
8 実行の流れを追えるかい?
プログラムの高レベルの「流れ」についても考えなくてはいけない。
構成要素 | 高レベルの流れが不明瞭になる理由 |
---|---|
スレッド | どのコードがいつ実行されるかわからない |
シグナル/割り込みハンドラ | 他のコードが実行される可能性がある |
例外 | いろんな関数呼び出しが終了しようとする |
関数ポインタと無名関数 | コンパイル時に判別できないので、どのコードが実行されるのかわからない |
仮想メソッド | object.virtualMethod()は道のサブクラスのコードを呼び出す可能性がある |
これらの構成要素を利用することで、コードが読みやすくなったり、
冗長性が低くなったりすることがある。
ただコード全体に占める割合を大きくしないことが大切。