클린코드
함수
작게 만들어라
다시 말해 if 문과 while 문등에 들어가는 블록은 한줄이여야 된다. 함수는 중첩구조가 생길만큼 커져서는 안된다.
한 가지만 해라
함수는 한가지만 해야 된다
함수당 추상화 수준은 하나로
내려가기 규칙 코드는 위에서 아래로 이야기처럼 읽혀야 된다. 한함수 다음에는 추상화 수준이 낮은 함수가온다.
switch 문
스위치문은 작게 만들기 어렵다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| package com.github.sejoung.function;
public class Patroll {
private final static int COMMISSIONED = 1;
private final static int HOURLY = 2;
private final static int SALARIED = 3;
public Money calculatePay(Employee e) throws InvalidEmployeeTypeException { switch (e.type) {
case COMMISSIONED: return calculateCommissionedPay(e); case HOURLY: return calculateHourlyPay(e); case SALARIED: return calculateSalariedPay(e);
default: throw new InvalidEmployeeTypeException(e.type); } }
private Money calculateCommissionedPay(Employee e) { return new Money(); }
private Money calculateHourlyPay(Employee e) { return new Money(); }
private Money calculateSalariedPay(Employee e) { return new Money(); }
}
|
위에 calculatePay 함수는 몇가지 문제점이 있다.
함수가 길다. 새직원을 추가하면 더 길어진다.
한가지 작업만 수행하지 않는다.
SRP 원칙을 위반한다. 코드를 변경할 이유가 여럿이다.
OCP 원칙을 위반한다. 새직원을 추가할때마다 코드를 변경한다.
1 2 3 4 5 6 7 8 9 10 11 12
| package com.github.sejoung.function.switch2;
import com.github.sejoung.function.switch1.Money;
public abstract class Employee { public abstract boolean isPayday(); public abstract Money calculatePay(); public abstract void deliverPay(Money pay); }
|
1 2 3 4 5 6 7 8 9 10
| package com.github.sejoung.function.switch2;
import com.github.sejoung.function.switch1.InvalidEmployeeTypeException;
public interface EmployeeFactory { public Employee makeEmployee(EmployeeRecord r) throws InvalidEmployeeTypeException; }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| package com.github.sejoung.function.switch2;
import com.github.sejoung.function.switch1.InvalidEmployeeTypeException;
public class EmployeeFactoryImpl implements EmployeeFactory {
private final static int COMMISSIONED = 1;
private final static int HOURLY = 2;
private final static int SALARIED = 3;
public Employee makeEmployee(EmployeeRecord r) throws InvalidEmployeeTypeException { switch (r.type) { case COMMISSIONED: return new CommissionedEmployee(); case HOURLY: return new HourlyEmployee(); case SALARIED: return new SalariedEmployee(); default: throw new InvalidEmployeeTypeException(r.type); } }
}
|
밥 아저씨가 참을수있는 스위치문 사용법
참조