CleanCode 3장 함수

함수를 만들 때는 '읽기 쉽고', '이해하기 쉽고', '의도가 분명'해야한다

1. 작게 만들어라

첫째 규칙 "작게!"
둘째 규칙 "더 작게!"

20줄도 길다고 저자는 말한다

if/else/while 에 들어가는 블록도 한 줄로!

2. 한 가지만 해라

당연한 이야기지만 지키기 어려운 일이다. 함수는 무조건 한 가지 일만을 잘 해야한다
-> 추상화 수준에서 한 가지 일!! (확인이나 랜더링 같은 단순 작업 빼고)

이것이 어렵다면 "의미있는 이름으로 다른 함수를 추출할 수 있다"면 그 함수는 여러 작업을 하고 있는 것이다!

3. 내려가기 규칙: 위에서 아래로 코드가 읽혀야 한다

위애서 아래로 이야기처럼 읽히는 것이 좋은 코드다
-> 한 함수 다음에는 추상화 수준이 한 단계 낮은 함수가 온다

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;
    }
}

여기서 함수의 부수 효과는 Session.initialize() 호출이다.

분명 checkPassword 함수는 말 그대로 암호를 확인하는 함수이다. 그런데 내용에는 함수를 호출하다가 잘못하면 기존 세션정보를 지워버릴 수 있는 가능성이 존재한다.

7. 명령과 조회를 분리해라

함수는 뭔가를 수행하거나, 뭔가에 답하거나 둘 중 하나만 해야한다.

// "username" 이 "unclebob"으로 설정되어있는지 확인하는 코드인가?
// 아니면 "username" 을 "unclebob"으로 설정하는 코드인지 불확실
public boolean set(String attribute, String value);
if (set("username", "unclebob"))

8. 오류코드보다 예외를 사용해라

  • 오류코드를 반환하려다 보면, if 문으로 여러단계로 중첩되는 코드를 야기하기 때문에 try/catch 를 사용하면 코드가 깔끔해진다.
  • 하지만 그조차도 구조에 혼란을 일으키기 때문에 블록을 try/catch를 별도 함수로 뽑아내는 편이 더 좋다.

좋은 웹페이지 즐겨찾기