CLEAN CODE

CLEAN 함수 (1)

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

 

스위치 문 리팩토링( Refactoring Switch statement )

아래는 많은 함수들에 쉽게 사용되고 있는 Switch structure (스위치 문)이다. switch(typeCode) case type1: return data specific to type1 case type2: return data specific to type2 case type3: return da..

withseungryu.tistory.com

 

참고 : 클린 코드 ( 로버트 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