1. 작게 만들자 - 최대한 짧은 함수를 만들자
짧은 함수가 명백하고, 하나의 이야기를 표현할 수 있으면 최고의 함수라고 말할 수 있다.
- 블록과 들여 쓰기
if/else문 while문 등에 들어가는 블록은 한 줄이 적당하다. 또한 중첩 구조가 1단이나 2단을 넘지 말자
2. 한 가지만 하도록 하자 - 한 가지 작업을 하는 함수를 만들자
''함수는 한 가지를 해야 한다. 그 한 가지를 잘해야 한다. 그 한 가지만을 해야 한다."라는 유명한 충고가 있는데, 이때 한 가지라는 의미는 추상화 수준을 말한다.
추상화 수준이란?
어떤 함수를 구성할 때 큰 개념에서 파생된 개념들로 나아가면서 단계적으로 나눠졌을 때 같은 단계를 같은 추상화라고 한다.
만약 의미 있는 이름으로 다른 함수를 추출할 수 있다면 그 함수는 '여러 작업'을 하는 것이라 할 수 있다.??
또한 한 함수에서 여러 섹션으로 잘 나눠진다면 이것 또한 '한 가지' 작업을 하는 함수가 아닌 것이다.
3. 위에서 아래로 코드 읽기 - 이야기와 같은 형식의 함수를 만들자.
이야기와 같은 형식의 함수란 마치 책을 읽듯 순서대로 읽으면 함수의 기능을 파악할 수 있는 함수이다.
함수 안에 또 다른 함수가 호출된다면 추상화 수준이 낮은 함수이고 이 또한 순서가 위에서 아래 (추상화 수준)라고 볼 수 있다.
4. SWITCH문 사용을 자제하자.
switch문은 작게 만들기 힘들다.
따라서 다형성(polymorphism)을 이용해 저 차원 클래스에 숨기고 절대 반복하지 않도록 하자.
//그냥 평범한 SWITCH문
public Money calculatePay(Employee e){
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. Single Responsibility Principle를 위반한다.
SRP란?
한 가지 클래스를 원하는 사용자가 둘 이상일 때 단일 책임 원칙을 위반한다고 말할 수 있다.
( 예 ) Book 클래스에 책을 사고 싶은 사람과 작성하는 사람에 관한 메소드가 둘 다 존재한다.
3. 새 직원을 추가할 때마다 새로운 코드를 추가 & 기존 코드 변경을 해야 하기 때문에 Open Closed Pricipal을 위반한다.
4. 위 함수와 구조가 동일한 함수가 무한정 존재할 수 있다. ( 예 ) isPayDay(Employee e, Date date);
해결방법 : switch문을 추상 팩토리에 숨기면 된다.
public abstract class Employee{
public abstract boolean isPayday();
public abstract Money calculatePay();
public abstract void deliverPay(Money pay);
}
====================================================
public interface EmployeeFactory{
public Employee makeEmployee(EmployeeRecord r);
}
====================================================
public class EmployeeFactoryImpl implements EmployeeFactory{
public Employee makeEmployee(EmployeeRecord r){
switch(r.type){
case COMMISSIONED:
return new CommissionedEmployee(r);
case HOURLY:
return new HourlyEmployee(r);
case SALARIED:
return new SalariedEmployee(r);
default:
return new InvalidEmployeeType(r.type);
}
}
}
아직 SWITCH문을 리팩토링하는 방법에 대해서 헷갈려, 직접 SWITCH문을 리팩토링하는 방법을 정리해보았다.
https://withseungryu.tistory.com/144
참고 : 클린 코드 ( 로버트 C. 마틴 )
'CLEAN CODE' 카테고리의 다른 글
CLEAN 함수 (3) (0) | 2021.06.01 |
---|---|
CLEAN 함수 (2) (0) | 2021.06.01 |
스위치 문 리팩토링( Refactoring Switch statement ) (0) | 2021.05.27 |
CLEAN 코드 네이밍 (2) (0) | 2021.05.24 |
CLEAN 코드 네이밍 ( 1 ) (0) | 2021.05.24 |