티스토리 뷰

반응형

마틴 파울러 - 리팩터링 (2판) 의  10장 내용 중 좋았던 것들 기록 ✏️✏️


 

10.4 조건부 로직을 다형성으로 바꾸기 

 

 

조건부 로직(특히 switch문)을 다형성으로 바꾸는 것은 오브젝트에서도 많이 나온 내용이다.

어디서부터 시작할 지 막막할 수 있는 리팩토링인데,

리팩터링 과정을 절차화해주셔서 진행하기 쉽게 해주신 게 좋았다. 

 

[ 절차 ]

(아래 절차는 책이랑 다르게 제가 순서를 조금 수정한 부분이 있습니다!)

 

1단계

다형적 동작을 표현하는 클래스들이 아직 없다면 만들어준다.

조건부 로직 함수를 슈퍼클래스로 옮긴다. (조건부 로직이 온전한 함수로 분리되어 있지 않다면 먼저 함수로 추출한다)

 

2단계

적합한 인스턴스를 알아서 만들어 반환하는 팩터리 함수도 함께 만든다. 

호출하는 코드에서 팩터리 함수를 사용하게 한다.

 

3단계

서브클래스 중 하나를 선택한다. 서브클래스에서 슈퍼클래스의 조건부 로직 메서드를 오버라이드한다.

조건부 문장 중 선택된 서브클래스에 해당하는 조건절을 서브클래스 메서드로 복사한 다음 적절히 수정한다.

 

4단계

다른 서브클래스들도 각 조건절을 해당 서브클래스에서 메서드로 구현하게 해준다.

(각 서브클래스마다 3단계를 다 해주라는 뜻)

 

5단계

슈퍼클래스 메서드에는 기본 동작 부분만 남긴다.

혹은 슈퍼클래스가 추상 클래스여야 한다면, 이 메서드를 추상으로 선언하거나 서브클래스에서 처리해야 함을 알리는 에러를 던진다. 

 

 

 

[ 예시 ]

 

새의 종에 따른 깃털상태와 비행속도를 알려주는 코드이다. 

 

 

다형성으로 바꾸는 리팩토링을 시작해보자

 

 

## 1단계

 

✔️ 다형적 동작을 표현하는 클래스 만들기 (슈퍼클래스, 서브클래스 만들기)

✔️ 조건부 로직 함수를 슈퍼클래스로 옮기기

 

 

우선 plumage()랑 airSpeedVelocity()를 Bird라는 클래스로 묶는다. 

Bird 클래스에 조건부 로직 코드들을 옮겨준다. 

 

 

 

그리고 종별 서브클래스를 만든다.

 

 

 

## 2단계

 

✔️ 팩터리 함수 만들기

✔️ 호출하는 코드에서 팩터리 함수를 사용하도록 하기

 

 

적합한 서브 클래스의 인스턴스를 만들어줄 팩터리 함수를 만든다. 

 

 

그리고 나서 객체를 얻을 때 팩터리 함수를 사용하도록 수정한다. 

 

 

## 3단계

 

✔️ 서브클래스에서 슈퍼클래스의 조건부 로직 메서드를 오버라이드하기 

 

 

필요한 클래스 구조가 준비 되었으니 두 조건부 메서드를 처리할 차례다. plumage()부터 시작하자.

switch문의 절 하나를 선택해 해당 서브클래스에 오버라이드한다. 

 

유럽제비부터 해주자. 

 

 

## 4단계 

 

✔️ 다른 서브클래스에서도 슈퍼클래스의 조건부 로직 메서드를 오버라이드하기 

 

 

다른 절들도 동일하게 해준다. 

 

 

 

## 5단계

 

✔️ 슈퍼클래스 메서드에는 기본 동작 부분만 남기기

 

 

슈퍼클래스의 메서드는 기본 동작용으로 남겨놓는다. (기존에 있던 switch문이 지워졌음)

 

 

 

 

그리고.. 

위와 똑같은 과정을 airSpeedVelocity()에도 수행한다. 

그럼 Bird 슈퍼클래스와 여러 서브클래스들이 이렇게 완성된다. 

 

 

 

그리고..

책에서 예제가 하나 더 나오는데 이것도 좋음!

 

 

 

10.5  특이 케이스 추가하기 

 

 

코드베이스에서 특이케이스에 대해 똑같이 반응하는 코드가 여러 곳이라면 그 반응들을 한 데로 모으는 게 효율적이다. 

두가지 예시를 소개해주신다. 

 

1) 다형성을 이용해서 서브클래스를 만드는 방식

2) 단순한 값을 위해 클래스까지 동원하는게 좀 과할 때 쓰는 변환 함수 

예를들어 딕셔너리를 사용하는 경우 특이 케이스를 대응해야할 때 enrich 함수를 만들어쓰는 방식을 소개해주신다. 

(저자는 본질은 같고 부가 정보만 덧붙이는 변환 함수의 이름을 "enrich(보강)" 라고 하고, 형태가 변할 때만 "transform" 이라는 이름을 쓰신다고 하신다) 

 

 

10.6 Assertion 추가하기 

 

 

- assertion은 프로그램이 어떤 상태임을 가정한 채 실행되는 지를 다른 개발자에게 알려주는 훌륭한 소통도구이다. 

 

- 어서션은 시스템 운영에 영향을 주면 안되므로 어서션을 추가한다고 해서 동작이 달리지지는 않는다. 

 

- 프로그래머가 일으킬만한 오류에만 어서션을 사용한다. 데이터를 외부에서 읽어온다면 그 값을 검사하는 작업은 어셔선의 대상인 가정이 아니라 예외처리로 대응해야하는 프로그램 로직의 일부로 다뤄야한다. 

 

- 어셔선을 남발하는 것 역시 위험하다. '반드시 참이어야 하는' 것만 검사한다. 

 

 

반응형
댓글