[리팩터링 2판] 11장: API 리팩터링

0

API?

  • 모듈과 함수는 소프트웨어를 구성하는 빌딩 블록이며, API는 이 블록들을 끼워 맞추는 연결부다.

함수 매개변수화 하기

두 함수의 로직이 아주 비슷하고 단지 리터럴 값만 다르다면

플래그 인수 제거하기

플래그 인수란: 호출되는 함수가 실행할 로직을 호출하는 쪽에서 선택하기 위해 전달하는 인수

호출하는 쪽에서 boolean 값으로 리터럴 값을 건네야 한다.(불리언 아니여도댐)
호출되는 함수는 그 인수를 제어 흐름을 결정하는데 사용해야 한다.

함수 매개변수화 하기 기법

  • 리터럴: 계산 과정에 필요한 상수

플래그 인수 제거하기

  • 플래그 인수: (함수 안에서) 로직 선택에 사용

왜 하는가

"호출할 수 있는 함수들이 무엇이고 어떻게 호출해야 하는지를 이해하기 어려워지기 때문"
호출자가 간단하길 바라는 저자의 성향 반영

명확한 이름을 가진 함수명으로 호출하는것이 boolean 값을 넘겨주는 것보다 명확

없애지 말아야 할 때?

함수 하나에서 플래그 인수를 두개 이상 사용한다면... (M x N 경우의 수의 함수)
단, 함수 하나가 너무 많은 일을 하고 있다는 의미일수도

객체 통째로 넘기기

오 이거 좋지.. 책임 떠넘기기 기법
레코드를 통째로 넘기면 변화에 대응하기 쉽다.
변수 추상화의 이점과 유사!

책임 떠넘기기 기법 2번째

예시 이상해,,, 이미 anEmployee 객체를 파라미터로 넘겼는데 굳이..? 좀 억까인데

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

왜? 중복 피하기

  • 피호출 함수가 스스로 쉽게 결정할 수 있는 값을 매개변수로 보내는 것도 일종의 중복이다

다시말해 -> 그 값을 결정하는 책임을 피호출 함수에게 넘기겠다는 것

그럼 언제 하지 말아야 하는가?

  • 결과로 (피호출 함수에) 원치 않는 의존성이 생길 떄

세터 제거하기

생성자를 팩터리 함수로 바꾸기

생성자 constructor 의 제약

서브클래스를 리턴할 수 없다
생성자 이름 고정
일반 함수가 기대되는 곳에 사용할 수 없다.

함수를 명령으로 바꾸기

명령?

함수를 그 함수만을 위한 객체 안으로 캡슐화하면 더 유용해지는 상황이 있다.
이런 객체를 가리켜 '명령 객체' 혹은 단순히 '명령'이라 한다.

왜 명령 객체인가

  • 함수 메커니즘보다 유연하게 함수 제어하고 표현
  • 되돌리기 같은 보조 연산 제공
  • 수명주기 정밀 제어하는데 필요한 매개변수 생성 메서드 제공
  • 상속과 훅을 이용하여 맞춤형
  • 일급함수를 지우너하지않은 프로그래밍 언어를 사용할 때 일급함수의 기능 대부분을 흉내낼 수 있따.

(Java는 일급함수 지원 노노)

profile
🇰🇷🇺🇸 #Back-End Engineer

0개의 댓글