public Money calculatePay(Employee e)
throws InvalidEmployeeType {
switch (e.type) {
case COMMISSIONED:
return calculateCommissionedPay(e);
case HOURLY:
return calculateHourlyPay(e);
case SALARIED:
return calculateSalariedPay(e);
default:
throw new InvalidEmployeeType(e.type);
}
}
이상적인 인수 개수는 0개 (적을수록 좋다. 1개까지는 양호함)
인수는 개념을 이해하기 어렵게 만든다.
함수에 인수 1개를 넘기는 이유 (많이 쓰는 단항 형식)
인수에 질문을 던지는 경우
인수를 뭔가로 변환해 결과를 반환하는 경우 (변환 함수)
boolean fileExists(String fileName) {} // 변환 함수
passwordAttemptFailedNtimes(int attempts); // 이벤트 함수, 입력 인수만 있다.
플래그 인수
이항 함수/삼항 함수
인수 객체
인수 목록
동사와 키워드
부수 효과는 거짓말이다.
함수에서 한 가지를 하겠다고 해놓고선 남몰래 다른 짓을 하니까
때로는 예상치 못하게 클래스 변수를 수정한다. (교활하고 해롭다)
때로는 함수로 넘어온 인수나 시스템 전역 변수를 수정한다. (교활하고 해롭다)
출력 인수
// 3-6 UserValidator.java 부수 효과 예시
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(codedPhrase, password);
if ("Valid Password".equals(phrase)) {
Session.initialize();
return true;
}
}
return false;
}
}
명령 함수에서 오류 코드를 반환하는 방식은 명령/조회 분리 규칙을 미묘하게 위반한다.
오류 코드를 반환하면 호출자는 오류 코드를 곧바로 처리해야 한다는 문제에 부딪힌다.
반면 오류 코드 대신 예외를 사용하면 오류 처리 코드가 원래 코드에서 분리되므로 코드가 깔끔해진다.
Try/Catch 블록 뽑아내기
// 오류 코드 대신 예외를 사용한 코드
try {
deletePage(page);
registry.deleteReference(page.name);
configKeys.deleteKey(page.name.makeKey());
}
catch (Exception e) {
logger.log(e.getMessage());
}
// try/catch 블록을 별도 함수로 뽑아내는 편이 좋다.
public void delete(Page page) { // 오류를 처리하는 함수는 오류만 처리해야 마땅하다.
try {
deletePageAndAllReferences(page);
}
catch (Exception e) {
logError(e);
}
}
private void deletePageAndAllReferences(Page page) throws Exception {
deletePage(page);
registry.deleteReference(page.name);
configKeys.deleteKey(page.name.makeKey());
}
private void logError(Exception e) {
logger.log(e.getMessage());
}
모든 함수와 함수 내 모든 블록에 입구와 출구가 하나만 존재해야 한다고 말했다. (Return 하나)
loop 안에서 break나 continue, goto 안된다.
함수가 아주 클 때만 상당한 이익을 제공한다.
그래서 함수를 작게 만든다면 return, break, continue를 여러 차례 사용해도 괜찮다. (오히려 의도를 표현하기 쉬워짐)
goto는 큰 함수에서만 의미가 있다고 하지만 그냥 안 쓰는게..?