반응형
로버트 마틴의 클린 코드(Clean Code) 3장 요약
3장 함수
▷ 작게 만들어라
명확한 근거는 없지만, 저자의 경험담에 의하면 함수를 작게 만드는 것이 좋다고 한다.
- 함수를 만드는 첫째 규칙은 '작게', 두 번째 규칙은 '더 작게'. 함수는 100줄을 넘어서는 절대로 안 되고, 20줄도 긴 편이다. 각 함수가 명백하게 이야기 하나를 표현하도록 작게 줄여야 한다. 이는 곧 if / else 문, while 문 등에 들어가는 블록은 한 줄이어야 한다는 의미다. 대개 블록에서 함수를 호출하고, 그렇게 되면 바깥을 감싸는 함수가 작아져서 코드 이해가 쉬워진다.
▷ 한 가지만 해라
함수는 한 가지를 해야한다. 그 한 가지를 잘 해야한다. 그 한 가지만을 해야 한다.
한 가지 일이라는 표현이 조금 애매하다. 그래서 이 책에서는 다음과 같은 기준을 제시하고 있다.
- 주어진 함수 이름 아래에서 추상화 수준이 하나인 단계만 수행한다면 그 함수는 한 가지 작업만 한다.
- 함수의 이름의 의미를 유지하면서 함수를 줄일 수 없다면, 그 함수는 한 가지 일을 한다고 판단한다. 또, 함수의 내용 중에서 어떤 부분을 의미있는 이름을 가진 부분으로 추출할 수 있다면 그 함수는 여러 일을 하고 있다고도 판단할 수 있다.
▷ 함수 당 추상화 수준은 하나로
함수 내 모든 문장의 추상화 수준은 동일해야한다.
- 위에서 언급한 한 가지 일만을 하기 위해선 함수 내의 코드들의 추상화 수준이 모두 동일해야한다. 만약 한 함수 내에서 추상화 수준이 다양하게 섞인다면 읽는 사람에게 혼란을 주게된다. 이를 위해서 코드를 작성할 때 위에서 아래로 읽히는(내려가기 규칙) 코드를 작성하는 것이 좋다.
▷ Switch 문
Switch 문의 사용을 자제하거나, 사용하더라도 숨긴다.
switch문은 본질적으로 N가지를 처리하기 때문에 작게 만들기 어렵다.
아래 코드는 다음과 같은 문제가 존재한다.
- 함수가 길다. 새로운 직원 유형을 추가하면 더욱 길어진다.
- '한 가지' 작업만 수행하지 않는다.
- SRP(Single Responsibility Principle)을 위반한다.
- OCP(Open Closed Prinicple)을 위반한다.
public Money calculatePay(Employee e) throws InvalidExployeeType {
switch (e.type) {
case COMMISSIONED:
return calculateCommissionedPay(e);
case HOURLY:
return calculateHourlyPay(e);
case SALARIED:
return calculateSalariedPay(e);
default:
throw new InvalidExployeeType(e.type);
}
}
아래와 같이 switch문을 상속 관계로 추상 팩토리에 숨겨서 노출되지 않도록 하고, 다형성을 이용해 적절한 Employee 파생 클래스의 인스턴스를 생성하도록 수정한다.
하지만 이렇게 작성이 힘든 불가피한 상황이 발생할 수 있으며, 저자 역시 이 규칙을 위반한 경험이 있다고 한다.
public abstract class Employee {
public abstract boolean isPayday();
public abstract Money calculatePay();
public abstract void deliverPay(Money pay);
}
public interface EmployeeFactory {
public Employee makeEmployee(EmployeedRecord r) throws InvalidEmployeeType;
}
public class EmployeeFactoryImpl implements EmployeeFactory {
public Employee makeEmployee(EmployeeRecord r) throws InvalidEmployeeType {
switch (r.type) {
case COMMISSIONED:
return new CommissionedEmployyee(r);
case HOURLY:
return new HourlyEmployee(r);
case SALARIED:
return new SalariedEmployee(r);
default:
thorw new InvalidEmployeeType(r.type);
}
}
}
▷ 서술적인 이름을 사용하라
반응형
'프로그래밍 도서 > 클린 코드(로버트 마틴)' 카테고리의 다른 글
Clean Code] 7장 오류 처리 (0) | 2023.10.07 |
---|---|
Clean Code] 4장: 주석 (0) | 2023.09.10 |
Clean Code] 2장: 의미 있는 이름 (0) | 2023.08.25 |