3枚のクリーンコード


第三章関数


明確な意図を表す関数をどのように実現しますか?初めて読む人にプログラムの内部を直感的に理解させるには、関数にどのような属性を与えますか?

小さくする


関数はオーバーラップ構造を生成するまで大きくできません.関数のインデントは、1つまたは2つを超えることはできません.ドア、whileドアの中のコードが長くなったら、関数で割りましょう.

一つだけやろう


「関数は一つのことしかできません.」「ひとつ」の基準が少しぼやけていて・・・別の関数を意味のある名前で抽出できる場合、その関数は複数の操作が行われていると考えられます.

各関数の抽象レベルは1つしかありません。


抽象化度の高い関数と抽象化度の低い関数を混ぜて使用しないでください.
降格規則
1つの関数の後に抽象化の程度が低い関数があります.すなわち,プログラムを上から下へ読むと,関数抽象レベルが一度に1レベル低下する.

スイッチドア


スイッチドアを小さくするのは難しい.各スイッチゲートを低レベルクラスに隠すと、より効率的に記述できます.多形性を利用する.
※多形性
多形性とは,同じ資料型に複数のオブジェクトを導入し,複数の結果を得る性質を指す.

このような構造があれば...ManはPeople、WomanはPeopleと表現できる.これにより、1つのタイプで複数の実行結果を取得し、メンテナンスを容易にするためにオブジェクトを部品化することができます.
swtich(r.type){
	case 1:
    	return new Man(r)
    case 2:
        return new Woman(r)
}
このようにスイッチドアを抽象工場に隠す.ファクトリは、スイッチ文を使用して対応する派生クラスのインスタンスを生成します.適切な関数はインタフェースを介して呼び出されます.

記述名の使用


記述的な名前を使用すると、開発者の頭の中でも設計が明確になり、コードが改善されやすくなります.そして名前をつけるときは一致しなければなりませんincludeSetupAndTeardownPagesincludeSetupPagesなど...

関数パラメータ


関数の理想係数はゼロです.買収が少なければ少ないほどいい.また、できるだけ標識因数を使用しないでください.

付随効果を生じない


関数の中で一つのことをすることを約束して、それからこっそり別のことをします...害がある.多くの場合、時間的な結合または順序依存関係が発生します.たとえば、パスワードをチェックする関数でセッションを初期化できます...

コマンドとクエリーを分ける


関数は、アクションを実行するか、アクションに答えるか、または両方を実行する必要があります.両者を兼ねて混乱をもたらす.

エラー・コードではなく例外の使用

if (deletePage(page)==E_OK){
	if (registry.deleteReference(page.nae)==E_OK){
    	...
    }
}
このように一つ一つ誤りを捉え,ifゲートでつかむとオーバーラップ構造がより深刻になる.try-catchで一度につかむときれいですtry-catchブロックはできるだけ個別の関数として取ります.

繰り返さないで


アルゴリズムが変わってあちこち修正しなければならなくて、重複性はよくありません

構造化プログラミング


return break continueと書かないでください小さくすれば大丈夫ですが、大きな関数にはあまりよくありません.逆にgotoは、小さな関数ではなく大きな関数に書きます.

関数はどう書きますか。


最初から完璧に編むわけにはいかない...アドリブを乱すと、不器用なコードが完成します.次に、テストコードのユニットテストボックスを作成します.次に、コードを切り取り、名前を変更し、重複を除去し、切り取ります.この場合でも、単位テストは常に合格しなければならない.このようにするときれいな関数が生まれます.