본문 바로가기

Today I Learned

리팩터링 2판 챕터11 - API 리팩터링(1)

1. 질의 함수와 변경함수 분리하기

질의 함수란 7.4에서 처음 나왔는데, 값을 계산하여 리턴시키는 함수다.

'겉보기 부수효과' 없는 반환 함수를 추구해야한다.

겉보기 부수효과란? 입출력 변경이나, 데이터 값이 변형되는 경우를 말한다.

 

* 명령-질의 분리 (질의함수는 모두 부수효과가 없어야 한다.)

https://martinfowler.com/bliki/CommandQuerySeparation.html

 

 

2. 함수 매개변수화하기

함수의 로직이 비슷한 경우, 매개변수 값만 바꿔서 여러 곳에 적용하도록 하자. 그러면 함수의 유용성이 커진다.

범위를 다루는 함수는 중간 대역부터 리팩터링을 시작하고, 대역의 상한를 쓸 때는 Infinity를 이용하자.

 

 

3. 플래그 인수 제거하기

불리언 플래그는 코드를 읽을 때 뜻을 정확히 전달하지 못하기 때문에, 명시적인 함수를 만들어서 제공하는 것이 좋다. true 값 하나만 가지고는 의미를 파악하기 힘들다. 플래그 인수가 두 개 이상이면 꼭 리팩터링하도록 하자.

 

이처럼 불리언 플래그를 써서 호출할 때

 
function bookConcert(aCustomer, isPremium){
	if(isPremium){ ... }
}

 

의미를 알 수 없는 true 값을 만나게 된다.

bookConcert(aCustomer, true);
 

 

명시적인 함수를 사용하면 깔끔해진다.

premiumBookConcert(aCustomer);

 

 

4. 객체 통째로 넘기기

매개변수를 두어 개 넘기는 것보다 레코드를 통째로 넘기고 함수 본문에서 필요한 값을 꺼내는 편이 좋다.

 

 

5. 매개변수를 질의 함수로 바꾸기 (↔️ 질의 함수를 매개변수로 바꾸기)

매개변수는 함수의 변동 요인이다. 중복은 피하고 짧을수록 좋다.

다만, 참조 투명을 지키도록 하자. 함수에 똑같은 값을 건네 호출하면 항상 똑같이 동작해야 한다.

 

 

6. 질의 함수를 매개변수로 바꾸기 (↔️ 매개변수를 질의 함수로 바꾸기)

5번 기법과는 반대로, 전역변수를 참조하거나 의존 관계를 바꾸고 싶을 때 해당 기법을 사용한다.

호출자가 복잡해지는 단점이 있다.

 

 

7. 세터 제거하기

세터 제거하기가 필요한 두 가지 상황이 있다.

1) 무조건 접근자 메서드를 통해서만 필드를 다루려고 할 때.

2) 클라이언트에서 생성자를 사용해 객체를 생성할 때.