리팩터링 11장-1

jhcho·2022년 5월 14일
0

리팩토링 2판

목록 보기
7/8

API 리팩터링-1

11.1 질의함수와 변경함수 분리하기

겉보기 부수효과가 있는 함수와 없는 함수는 명확히 구분하는 것이 좋다. 질의함수(읽기함수)는 모두 부수효과가 없어야 한다. 이를 '명령-질의 분리'라고도 한다.

예제 생략.

11.2 함수 매개변수화하기

두 함수의 로직이 아주 비슷하고 단지 리터럴 값만 다르다면, 그 다른 값만 매개변수로 받아 처리하는 함수 하나로 합쳐서 중복을 없앨 수 있다.

예제 생략.

11.3 플래그 인수 제거하기

플래그 인수란 호출되는 함수가 실행할 로직을 호출하는 쪽에서 선택하기 위해 전달하는 인수다.
플래그 인수를 사용하면, 호출할 수 있는 함수들이 무엇이고 어떻게 호출해야 하는 지를 이해하기 어려워진다. 플래그 인수가 있으면 함수들의 기능 차이가 잘 드러나지 않는다.

플래그 인수를 제거하면 코드가 깔끔해짐은 물론 프로그래밍 도구에도 도움을 준다. 코드 분석 도구는 프리미엄 로직 호출과 일반 로직 호출의 차이를 더 쉽게 파악할 수 있게 된다.

// before
aShipment.deliveryDate = deliveryDate(anOrder, true);
aShipment.deliveryDate = deliveryDate(anOrder, false);

function deliveryDate(anOrder, isRush) {
  if (isRush) {
    // rush일 때 호출할 로직
  } else {
    // rush가 아닐 때 호출할 로직
  }
}
// after
function rushDeliveryDate(anOrder) {
  // rush일 때 호출할 로직
}

function regularDeliveryRate(anOrder) {
  // rush가 아닐 때 호출할 로직
}

aShipment.deliveryDate = rushDeliveryDate(anOrder);
aShipment.deliveryDate = regularDeliveryRate(anOrder);

11.4 객체 통째로 넘기기

레코드를 통째로 넘기면 변화에 대응하기 쉽다. 함수가 더 다양한 데이터를 사용하도록 바뀌어도 매개변수 목록은 수정할 필요가 없다. 그리고 매개변수 목록이 짧아져서 일반적으로는 함수 사용법을 이해하기 쉬워진다.

하지만 함수가 레코드 자체에 의존하기를 원치 않을 때, 특히 레코드와 함수가 서로 다른 모듈에 속한 상황이라면 이 리팩터링을 수행하지 않는다.

한편, 한 객체가 제공하는 기능 중 항상 똑같은 일부만을 사용하는 코드가 많다면, 그 기능만 따로 묶어서 클래스로 추출할 수도 있다.

예제 생략.

11.5 매개변수를 질의 함수로 바꾸기

매개변수 목록은 함수의 동작에 변화를 줄 수 있는 일차적인 수단이다. 매개변수 목록은 중복은 피하는 게 좋으며 짧을수록 이해하기 쉽다.

피호출 함수가 스스로 쉽게 결정할 수 있는 값을 매개변수로 건네는 것도 일종의 중복이다. 호출하는 쪽은 간소하게 만드는 것이 좋다. 즉, 책임 소재를 피호출 함수로 옮긴다.

매개변수 제거 시 피호출 함수에 원치 않는 의존성이 생긴다면 매개변수를 질의함수로 바꾸지 말아야 한다. 제거하려는 매개변수의 값을 다른 매개변수에 질의해서 얻을 수 있다면 안심하고 질의 함수로 바꿀 수 있다.

이때 대상 함수가 참조 투명해야 한다. 즉, 함수에 똑같은 값을 건네 호출하면 항상 똑같이 동작해야 한다.

11.6 질의 함수를 매개변수로 바꾸기

함수 안에서 전역 변수를 참조한다거나, 제거하길 원하는 원소를 참조하는 경우가 있다. 이때는 해당 참조를 매개변수로 바꿔 해결할 수 있다. 참조를 풀어내는 책임을 호출자로 옮기는 것이다.

이런 상황 대부분은 코드의 의존관계를 바꾸려 할 때, 예컨대 대상 함수가 더 이상 특정 원소에 의존하길 원치 않을 때 일어난다.

이 리팩터링의 단점은 호출자가 복잡해진다는 것이다. 이 문제는 결국 책임 소재를 프로그램의 어디에 배정하느냐의 문제로 귀결되는 것으로, 항상 정답이 있는 것은 아니다.

예제 생략.

reference

profile
hello wirld

0개의 댓글