CleanCode 3章関数

5366 ワード

関数を作るには「読みやすい」「分かりやすい」「意図がはっきりしている」

1.小さくなる


1つ目のルール「小さめ!
第二条ルール「もっと小さく!」
作者は二十行も長いと言った.
if/else/hileのブロックも1行に並んでいます!

2.一つだけやる


当たり前のことですが、なかなかできません.関数は一つしかできない.
->抽象化レベルで、一つ!!(検証やレンダリングなどの単純なタスク以外)
これが難しい場合は、「意味のある名前で別の関数を抽出することができます」と、この関数は多くの仕事をしています.

3.下に移動するルール:コードを上から下へ読む


上から下まで物語のように読むのはいいコードです.
->1つの関数の後に抽象化の度合いが低い関数

4.叙述的な名前を使う

// 위보다 아래가 이해하기 더 쉽다
testTableHtml
SetupTeardownIncluder

5.関数パラメータが少ないほど良い


関数の理想的な引数は、0個(アイテムなし)->1個(単項)->2個(二項)です.3項目以上は避ける

6.付随効果を生み出さない

public class UserValidator {
	private Cryptographer cryptographer;
    
    public boolean checkPassword(String userName, String password) {
    	User user = UserGateway.findByName(userName);
        if (user != User.NULL) {
        	String codedPhrase = user.getPhraseEncodedByPassword();
            String phrase = cryptographer.decrypt(codedPharase, password);
            if ("Valid Password".equlas(phrase)) {
            	Session.initialize();
                return true;
            }
        }
        return false;
    }
}
ここで関数の副手効果はセッションです初期化()呼び出し.
明らかに、checkPassword関数はパスワードを確認する関数です.ただし、関数の呼び出し中にエラーが発生した場合、既存のセッション情報が削除される可能性があります.

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


関数は、ある操作を実行し、ある質問に答えるか、または両方を兼ねている必要があります.
// "username" 이 "unclebob"으로 설정되어있는지 확인하는 코드인가?
// 아니면 "username" 을 "unclebob"으로 설정하는 코드인지 불확실
public boolean set(String attribute, String value);
if (set("username", "unclebob"))

8.エラーコードではなく例外を使用

  • エラーコードを戻そうとすると、if文は複数のレベルのコードが重複するため、try/catchを使用するとコードがきれいになります.
  • ですが、それさえ構造が混乱するので、ブロックをtry/catchの個別関数として抽出することが望ましいです.