함수를 만들 때는 '읽기 쉽고', '이해하기 쉽고', '의도가 분명'해야한다
첫째 규칙 "작게!"
둘째 규칙 "더 작게!"
20줄도 길다고 저자는 말한다
if/else/while 에 들어가는 블록도 한 줄로!
당연한 이야기지만 지키기 어려운 일이다. 함수는 무조건 한 가지 일만을 잘 해야한다
-> 추상화 수준에서 한 가지 일!! (확인이나 랜더링 같은 단순 작업 빼고)
이것이 어렵다면 "의미있는 이름으로 다른 함수를 추출할 수 있다"면 그 함수는 여러 작업을 하고 있는 것이다!
위애서 아래로 이야기처럼 읽히는 것이 좋은 코드다
-> 한 함수 다음에는 추상화 수준이 한 단계 낮은 함수가 온다
// 위보다 아래가 이해하기 더 쉽다
testTableHtml
SetupTeardownIncluder
함수에서 이상적인 인수 개수는 0개(무항) -> 1개(단항) -> 2개(이항)이다. 3개(삼항) 이상은 가능하면 피하는 편이 좋다
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 함수는 말 그대로 암호를 확인하는 함수이다. 그런데 내용에는 함수를 호출하다가 잘못하면 기존 세션정보를 지워버릴 수 있는 가능성이 존재한다.
함수는 뭔가를 수행하거나, 뭔가에 답하거나 둘 중 하나만 해야한다.
// "username" 이 "unclebob"으로 설정되어있는지 확인하는 코드인가?
// 아니면 "username" 을 "unclebob"으로 설정하는 코드인지 불확실
public boolean set(String attribute, String value);
if (set("username", "unclebob"))