3장

중복된 코드

한 클래스의 서로 다른 두 메소드 안에 같은 코드가 있는 경우 : Extract Method

동일한 수퍼클래스를 갖는 두 서브클래스에서 같은 코드가 있는 경우 : Extract Method 후 Pull Up Method

비슷하지만 같지는 않다면 : 비슷한 부분 Extract Method 후 Form Template Method 사용 가능한지 확인

같은 작업을 하지만 다른 알고리즘을 사용한다면 : 두 알고리즘 중 더 명확한 것 선택해서 Substitute Algorithm 사용

서로 관계 없는 두 클래스에서 중복된 코드가 있는 경우 : Extract Class 사용한 다음 양쪽에서 이 새로운 클래스를 사용

긴 메소드

  • 어떤 것에 대해 주석을 달아야 할 필요를 느낄 때마다 대신 메소드를 작성하라

단지 한 줄의 코드라 할지라도 그것이 설명을 필요로 한다면 메소드로 뽑아낼 가치가 있다.

  • 메소드 길이를 줄이기 위해선 Extract Method

  • 메소드에 파라미터와 임시변수가 많다면

임시변수를 제거 하기 위해 Replace Temp with Query
긴 파라미터 리스트는 Introduce Parameter Object와 Preserve Whole Object로 짧게 할 수 있음
그래도 많다면 Replace Method with Method Object라는 중장비 동원해야 할 때
  • 조건문과 루프 또한 메소드 추출이 필요하다는 신호 : Decompose Conditional

거대한 클래스

  • 지나치게 많은 인스턴수 변수

Extract Class

새로 만들 클래스가 서브클래스로서 의미가 있으면 Extract Subclass

  • 코드가 많은 클래스

클라이언트가 클래스를 어떻게 쓰게 할 지 결정하고 각각의 사용 방법에 대해 Extract Interface

긴 파라미터 리스트

대부분의 변경은 객체를 넘겨서 해결

이미 알고 있는 객체에 요청하여 파라미터의 데이터를 얻을 수 있으면

  • Replace Parameter with Method

한 객체로부터 주워 모은 데이터 뭉치를 그 객체 자체로 바꾸기 위해

  • Preserve Whole Object

객체와 관계 없는 여러 개의 데이터 아이템이 있는 경우

  • Introduce Parameter Object

확산적 변경

한 클래스가 여러 종류의 변경 때문에 시달리는 경우

  • Extract Class 사용해서 특정 원인에 대해 변해야 하는 것들을 묶어줌

산탄총 수술

확산적 변경과 반대

하나를 변경했을 때 많은 클래스를 고쳐야 하는 경우

  • Move Method, Move Field를 사용해서 변경해야 할 부분을 모두 하나의 클래스로

  • 기존의 클래스 중에서 메소드나 필드가 옮겨갈 후보가 적당히 없다면 새로 하나 만들어라

데이터 덩어리

  • Extract Class

Switch 문

Switch문에 코드를 추가하려면 중복된 모든 switch문 찾아 바꿔줘야 함

Switch 보면 항상 다형성을 생각해야 함

만약 하나의 메소드에만 영향을 미치는 몇 개의 경우가 있다면, 굳이 바꿀 필요 없다.

  • 이런 경우 다형성은 과하다

  • Replace parameter with Explicit methods

  • 만약 조건 중 null이 있는 경우라면 Intruduce Null Object

메시지 체인

  • 클라이언트가 어떤 객체를 얻기 위해 다른 객체에 물어보고, 또 다른 객체에 물어보고 ...

  • Hide Delegate

데이터 클래스

필드와 각 필드에 대한 get/set 메소드만 가지고있는 클래스

약간의 책임을 가질 필요가 있다.

get/set 메소드가 다른 클래스에서 사용되는지 찾아보고 동작을 데이터 클래스로 옮기기 위해

  • Move Method 시도

  • 메소드 전체 옮길 수 없을 땐 Extract Method

그 후에 get/set 메소드에 대해 Hide Method를 사용할 수 있다

거부된 유산

  • 서브클래스가 부모 클래스로부터 주어진 것을 원치 않을 땐 단지 필요한 몇개만 고른다

  • 새로운 형제 클래스 만들고 Push Down Method, Push Down Field 사용해서 사용되지 않는 메소드를 모두 형제 메소드로 옮겨라

Last updated