* Duplicated Code (중복된 코드)

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

  - 동일한 수퍼클래스를 갖는 두 서브클래스에서 같은 코드가 나타나는 경우 : Extract Method, Pull Up Method, Form Template Method, Substitute Algorithm

  - 관계가 없는 두 클래스에서 중복된 코드가 있는 경우 : Extract Class

 

* Long Method (긴 메소드)

  - 주석이 있는 부분 : Extract Method

  - 조건문과 루프가 있는 경우 : Decompose Conditional

 

* Large Class (거대한 클래스)

  - 많은 변수가 있는 경우 : Extract Class

  - 클래스가 모든 인스턴스 변수를 사용하지 않는 경우 : Extract Class, Extract Subclass

  - 코드가 많은 클래스 : Extract Class, Extract Subclass

  - GUI 클래스 인 경우 : Duplicate Observed Data

 

* Long Parameter List (긴 파라미터 리스트)

  - 객체에 요청하여 파라미터의 데이터를 얻을 수 있는 경우 : Replace Parameter with Method

  - 한 객체로부터 주워 모은 데이터 뭉치를 그 객체 자체로 바꿀 수 있는 경우 : Perserve Whole Object

  - 객체와 관계 없는 여러 개의 데이터 아이템이 있는 경우 : Introduce Parameter Object

  - 파라미터 리스트가 지나치게 길거나 자주 변경되는 경우 : 종속성 구조(dependency structure)를 생각해 볼 필요가 있다

 

* Divergent Change (확산적 변경) : 한 클래스가 다른 이유로 인해 다른 방법으로 자주 변경되는 경우

  - Extract Class

 

* Shotgun Surgery (산탄총 수술) : 변경을 할 때마다 많은 클래스를 조금씩 수정해야 하는 경우

- Move Method, Move Field

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

- Inline Class

 

* Feature Envy (기능에 대한 욕심)

- 어떤 값을 계산하기 위해 다른 객체에 있는 여러 개의 get 메소드를 호출하는 경우 : Move Method

- 메소드의 특정 부분만 해당하는 경우 : Extract Method, Move Method

 

* Data Clump (데이터 덩어리)

- 함께 몰려다니는 데이터의 무리 : Extract Class, Introduce Parameter Object, Preserve Whole Object

 

* Primitive Obsession (기본 타입에 대한 강박관념)

 

* Switch statement (Switch 문)

 

* Parallel Inheritance Hierarchies (평행 상속 구조)

 

* Lazy Class (게으른 클래스)

 

* Speculative Generality (추측성 일반화)

 

* Temporary Field (임시 필드)

 

* Message Chains (메세지 체인)

 

* Middle Man (미들 맨)

 

* Inappropriate Intimacy (부적절한 친밀)

 

* Alternative Classes with Different Interface (다른 인터페이스를 가진 대체 클래스)

 

* Imcomplete Library Class (불완전한 라이브러리 클래스)

 

* Data Class (데이터 클래스)

 

* Refused Bequest (거부된 유산)

 

* Comments (주석)

 

내일 이어서...

+ Recent posts