아래의 글은 마틴 파울러 지음 김지원 옮김, 『리팩토링 코드 품질을 개선하는 객체지향 사고법』,한빛미디어(2012)의 내용을 기반으로 작성하였습니다.

 

1. Duplicated Code ( 중복 코드 )

: 똑같은 혹은 유사한 코드 구조가 두 군데 있을 때는 그 부분을 하나로 통일하면 프로그램이 개선됨

> 메서드 추출, 메서드 상향, 템플릿 메서드 형성, 알고리즘 전환, 주변 메서드 추출, 모듈 추출

 

2. Long Method  (장황한 메서드 )

: 메서드 안의 로직이 위임 없이 길게 구현된 코드

> 메서드 추출, 메서드 호출로 전환, 메서드 체인으로 전환, 매개변수 세터를 객체로 전환, 객체를 통째로 전달, 조건문 쪼개기, 루프를 컬렉션 클로져 메서드로 전환

 

3. Large Class ( 방대한 클래스 )

: 기능이 지나치게 많은 클래스, 인스턴스 변수가 많고, 중복코드가 있을 확율이 높다

> 클래스 추출, 하위 클래스 추출, 모듈 추출, 클래스 추출, 관측 데이터 복제

 

4. Long Parameter List ( 과다한 매개변수 )

: 매개변수가 많은 경우, 수정도 많다. 

> 매개변수 세트를 매서드로 전환, 객체를 통째로 전달

 

5. Divergent Change  ( 수정의 산발 )

: 새로운 기능 추가에 3개의 메서드를 수정하고 추가 기능은 4개의 메서드를 수정해야하네 > 하나의 클래스를 여러 개의 객체로 분리하는 것이 좋음

> 클래스 추출

 

6. Shotgun Surgery ( 기능의 산재 )

: 수정할 때 마다 여러 클래스에서 수 많은 자잘한 부분을 고처야 한다면 이 문제

> 메서드 이동, 필드 이동, 클래스 내용 직접 삽입

 

7. Feature Envy ( 잘못된 소속 )

: 객체의 핵심은 데이터와 그 데이터에 속하는 프로세스를 한 데 묶는 기술

> 메서드 이동, 메서드 추출, 위임 패턴

 

8. Data Clumps ( 데이터 뭉치 )

: 유사한 데이터는 모이는 경향으로 객체로 만들어야 한다.

> 클래스 추출, 매개변수 세트를 객체로 전환, 객체를 통째로 전달

 

9. Primitive Obsession ( 기본타입에 대한 집착 )

: String은 primitive 타입이 아님, 문자열 날짜도 클래스로 존재, 기본타입 아님, 

> 데이터 값을 객체로 전환, 분류 부호를 클래스로 전환, 조건문에 분류 부호가 사용될 땐, 분류 부호를 하위 클래스로 전환, 분류 부호를 상태/전략 패턴으로 전환, 클래스 추출, 매개변수 세트를 객체로 전환, 배열을 객체로 전환

 

10. Switch Statement ( 스위치 문 )

: switch 문은 중복이 생기기 쉬움.

> 메서드 추출, 메서드 이동, 분류 부호를 하위 클래스로 전환, 분류 부호를 상태/전략 패턴으로 전환, 상속 구조를 만들었다면 조건문을 재정의로 전환

 

11. Parallel Inheritance Ierarchies ( 평행 상속 계층 )

: 기능의 산태의 특수한 상황, 한 클래스의 하위 클래스를 만들 때 마다, 매번 다른 클래스의 하위 클래스도 만들어야 한다.

> 메서드 이동, 필드 이동

 

12. Lazy Class ( 직무유기 클래스 )

: 리팩토링 이후 사용하지 않는 클래스는 삭제

> 계층 병햡, 클래스 내용 직접 삽입, 모듈 내용 직접 삽입

 

13. Speculative Generality ( 막연한 범용 코드 )

: 미리 만들어 놓은 기능, 필요 없는 기능

> 계층 병합, 클래스 내용 직접 삽입, 매개변수가 있으면 매개 변수 제거, 메서드명 변경

 

14. Temporary Field ( 임시 필드 )

: 인스턴스 변수가 특정 상황에서만 할당 되는 경우

> 클래스 추출, 널 검사를 널 객체에 위임

 

15. Message Chain ( 메시지 체인 )

: 연쇄적 요청이 발생하는 문제점

> 대리 객체 은폐, 메서드 추출, 메서드 이동

 

16. Middle Man ( 과잉 중개 메서드 )

: 과도한 위임의 반복

> 과잉 중개 메서드 제거, 메서드 내용 직접 삽입, 위임을 상속으로 전황

 

17. Inappropriate Intimacy ( 지나친 관여 )

: 서로 지나치케 밀접한 두 클래스

> 메서드 이동, 필드 이동, 클래스의 양방향 연결을 단방향으로 전환,  클래스 추출, 대리 객체 은폐, 상속을 위임으로 전환

 

18. Alternative Class with Differenct Interfaces ( 인터페이스가 다른 대용 클래스 )

: 기능은 같은데 시그너쳐가 다른 메서드

> 메서드 명 변경, 메서드 이동, 상위 클래스 추출

 

19. Incomplete Library Class ( 미흡한 라이브러리 클래스 )

: 수정이 어려운 라이브러리 클래스

> 외래 클래스에 메서드 추가, 국소적 상속 확장 클래스 사용

 

20. Data Class ( 데이터 클래스 )

: 필드의 읽기 쓰기 메서드만 들어 있는 클래스 , public 필드가 있으면 안됨

필드 캡슐화, 컬렉션 캡슌화, 쓰기 메서드 제거, 메서드 이동, 메서드 추출, 메서드 은폐

 

21. Refused Bequest ( 방치된 상속물 )

: 상속 받은 메서드나 데이터가 하위 클래스에서 더 이상 필요 없는 경우

> 메서드 하향, 필드 하향

 

22. Comment ( 불필요한 주석 )

: 주석이 잘 못된 코드를 감추는 용도

> 메서드 추출, 메서드 이름 변경, 어셜션 넣기

 

+ Recent posts