4 Switch문 (if/else)을 피할 수는 없다
본질적으로 switch문은 N가지를 처리한다. 불행히도 switch문을 완전히 피할 방법은 없다.
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);
}
}
위 함수의 문제는 다음과 같다.
이 문제를 해결한 코드는 다음과 같다. 이렇게 상속 관계로 숨긴 후 절대 다른 코드에 노출시키지 않는다.
public abstract class Employee {
public abstract boolean isPayday();
public abstract Money calcuatePay();
public abstract void deliverPay(Money pay);
}
public interface EmployeeFactory{
public Employee makeEmployee(EmployeeRecord r) throws InvalidEmployeeType;
}
public class EmployeeFactoryImpl implements EmployeeFactory {
public Employee makeEmployee(EmployeeRecord r) throws InvalidEmployeeType {
switch (r.type) {
case COMMISSIONED :
return new CommissionedEmployee(r);
case HOURLY :
return new HourlyEmployee(r);
case SALARIED :
return new SalariedEmployee(r);
default:
throw new InvalidEmployeeType(r.type);
}
}
}
5 서술적인 이름을 사용하라
<aside> 💡 코드를 읽으면서 짐작했던 기능을 수행하면 깨끗한 코드다
</aside>
이름을 붙일 때는 일관성이 있어야 한다. 모듈 내에서 함수 이름은 같은 문구, 명사, 동사를 사용하자
boolean isTestable
void includesetupAndTeardownPages
함수 인수
<aside> 💡 함수에서 이상적인 인수 개수는 0개(무항)다
</aside>
다음은 1개고, 다음은 2개다. 3개는 가능한 피하는 편이 좋다.
최선은 입력 인수가 없는 경우이며, 차선은 입력 인수가 1개 뿐인 경우다.
SetupTeardownIncluder.render(pageData)는 아주 이해하기 좋은 케이스다.