3장 함수(이어서)

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

위 함수의 문제는 다음과 같다.

  1. 함수가 길다 (직원 유형 추가 시 더 길어진다)
  2. 한 가지 작업만 수행하지 않는다
  3. SRP(Single Responsibility Principle)을 위반한다. (코드를 변경할 이유가 여럿이다)
  4. OCP(Open Closed Principle)을 위반한다

이 문제를 해결한 코드는 다음과 같다. 이렇게 상속 관계로 숨긴 후 절대 다른 코드에 노출시키지 않는다.

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)는 아주 이해하기 좋은 케이스다.