숙력된 사람의 직관만큼 코드의 냄새를 맡는 정확한 기준은 없다.
1. 기이한 이름 Mysterious Name
•
함수 선언 바꾸기
•
변수 이름 바꾸기
•
필드 이름 바꾸기
이름만 잘지어도 문맥을 파악하느라 해맬 시간을 크게 절약할 수 있다.
2. 중복 코드 Duplicated Code
•
함수 추출하기
•
문장 슬라이드하기
•
메서드 올리기
3. 긴 함수 Long Function
코드를 이해하고, 공유하고, 선택하기 쉬워진다는 장점은 함수를 짧게 구성할 때 나오는 것이다.
→ 하지만, 결국 함수 이름을 잘 지어놓으면 본문 코드를 볼 이유가 사라짐
•
함수 추출하기
•
임시 변수를 질의 변수로 바꾸기
•
매개변수 객체 만들기
•
객체 통째로 넘기기
•
함수를 명령으로 바꾸기
•
조건문 분해하기
•
조건문을 다형성으로 바꾸기
•
반복문 쪼개기
4. 긴 매개변수 목록 Long Parameter List
•
매개변수를 질의함수로 바꾸기
•
객체 통째로 넘기기
•
매개변수 객체 만들기
•
플래그 인수 제거하기
•
여러 함수를 클래스로 묶기
5. 전역 데이터 Global Data
•
변수 캡슐화하기
6. 가변 데이터 Mutable Data
•
변수 캡슐화하기
•
변수 쪼개기
•
문장 슬라이드하기 & 함수 추출하기
•
질의 함수와 변경 함수 분리하기
•
세터(setter) 제거하기
•
파생 변수를 질의 함수로 바꾸기
•
여러 함수를 클래스로 묶기
•
여러 함수를 변환 함수로 묶기
•
참조를 값으로 바꾸기
7. 뒤엉킨 변경 Divergent Change
뒤엉킨 변경은 단일 책임 원칙(Single Responsibility Principle)이 제대로 지켜지지 않을 때 나타난다.
•
단계 쪼개기
•
함수 옮기기
•
함수 추출하기
•
클래스 추출하기
8. 산탄총 수술 Shogun Surgery
산탄총 수술은 뒤엉킨 변경과 비슷하면서도 정반대다.
•
함수 옮기기
•
필드 옮기기
•
여러 함수를 클래스로 묶기
•
여러 함수를 변환함수로 묶기
•
단계 쪼개기
•
함수 인라인하기
•
클래스 인라인하기
9. 기능 편애 Feature Envy
•
함수 옮기기
•
함수 추출하기
◦
전략패턴
◦
위임자 패턴
10. 데이터 뭉치 Data Clumps
•
클래스 추출하기
•
매개변수 객체 만들기
•
객체 통째로 넘기기
11. 기본형 집착 Primitive Obsession
•
기본형을 객체로 바꾸기
•
타입 코드를 서브클래스로 바꾸기
•
조건부 로직을 다형성으로 바꾸기
•
클래스 추출하기
•
매개변수 객체 만들기
12. 반복되는 Switch 문 Repeated Switches
•
조건부 로직을 다형성으로 바꾸기
13. 반복문 Loops
•
반복문을 파이프라인으로 바꾸기
14. 성의 없는 요소 Lazy Element
•
함수 인라인하기
•
클래스 인라인하기
•
계층 합치기
15. 추측성 일반화 Speculative Generality
•
계층 합치기
•
함수 인라인하기
•
클래스 인라인하기
•
함수 선언 바꾸기
•
죽은 코드 제거하기
16. 임시 필드 Temporary Field
•
클래스 추출하기
•
함수 옮기기
•
특이 케이스 추가하기
17. 메시지 체인 Message Chains
•
위임 숨기기
•
함수 추출하기
•
함수 옮기기
18. 중재자 Middle Man
•
중재자 제거하기
•
함수 인라인하기
19. 내부자 거래 Insider Trading
•
함수 옮기기 & 필드 옮기기
•
위임 숨기기
•
서브클래스를 위임으로 바꾸기
•
슈퍼클래스를 위임으로 바꾸기
20. 거대한 클래스 Large Class
•
클래스 추출하기
•
슈퍼클래스 추출하기
•
타입코드를 서브클래스로 바꾸기
21. 서로 다른 인터페이스의 대안 클래스들 Alternative Classes With Different Interfaces
•
함수 선언 바꾸기
•
함수 옮기기
•
슈퍼클래스 추출하기
22. 데이터 클래스 Data Class
•
레코드 캡슐화하기
•
세터 제거하기
•
함수 옮기기
•
함수 추출하기
•
단계 쪼개기
23. 상속 포기 Refused Bequest
•
메서드 내리기 & 필드 내리기
•
서브클래스를 위임으로 바꾸기
•
슈퍼클래스를 위임으로 바꾸기
24. 주석 Comments
•
함수 추출하기
•
함수 선언 바꾸기
•
어서션 추가하기
주석을 남겨야 겠다는 생각이 들면, 가장 먼저 주석이 필요 없는 코드로 리팩터링 해본다.