|
| 1 | +## 악취 종류 |
| 2 | + |
| 3 | +### 기이한 이름 |
| 4 | +- 함수 선언 바꾸기 |
| 5 | +- 변수 이름 바꾸기 |
| 6 | +- 필드 이름 바꾸기 |
| 7 | + |
| 8 | +### 중복 코드 |
| 9 | +- 함수 추출하기 |
| 10 | +- 문장 슬라이드하기 |
| 11 | + - 코드가 비슷한데 완전 똑같지는 않은 경우 슬라이드 후 추출 가능한지 확인 |
| 12 | +- 메서드 올리기 |
| 13 | + - 파생 서브클래스들에 중복된 경우 |
| 14 | + |
| 15 | +### 긴 함수 |
| 16 | +- 함수 추출하기 |
| 17 | + - 99% |
| 18 | + - switch-case에서 각 case도 추출 |
| 19 | +- 임시 변수를 질의 함수로 바꾸기 |
| 20 | + - 추출된 함수의 임시 변수 수 줄이기 |
| 21 | +- 매개변수 객체 만들기 |
| 22 | + - 매개변수 수 줄이기 |
| 23 | +- 객체 통째로 넘기기 |
| 24 | + - 매개변수 수 줄이기 |
| 25 | +- 함수를 명령으로 만들기 |
| 26 | + - 위 리팩토링을 적용해도 너무 변수/매개변수가 많을 경우 (큰 변경) |
| 27 | +- 조건문 분해하기 |
| 28 | + - 조건문이 많은 경우 |
| 29 | +- 조건부 로직을 다형성으로 바꾸기 |
| 30 | + - 같은 조건 기준으로 나뉘는 switch문이 여러개인 경우? |
| 31 | +- 반복문 쪼개기 |
| 32 | + - 반복문 포함해서 추출하기 적절한 이름이 떠오르지 않는다면 두 가지 이상 작업이 섞여있을 수 있음 |
| 33 | + |
| 34 | +### 긴 매개변수 목록 |
| 35 | +- 매개변수를 질의 함수로 바꾸기 |
| 36 | + - 다른 매개변수에서 값을 얻어올 수 있는 경우 |
| 37 | +- 객체 통째로 넘기기 |
| 38 | + - 사용중인 데이터 구조에서 각각 뽑아서 매개변수로 넘기고 있는 경우 |
| 39 | +- 매개변수 객체 만들기 |
| 40 | + - 항상 같이 전달되는 매개변수들을 같이 묶기 |
| 41 | +- 플래그 인수 제거하기 |
| 42 | + - 함수의 동작 방식을 정하는 매개변수의 경우 |
| 43 | +- 여러 함수를 클래스로 묶기 |
| 44 | + - 여러 개의 함수가 특정 매개변수의 값을 공통으로 사용할 때 클래스로 만들어서 클래스의 필드로 정의 |
| 45 | + - 함수형 프로그래밍에서의 '부분 적용 함수 (partially applied function)'을 생성하는것과 같은 것 |
| 46 | + |
| 47 | +### 전역 데이터 |
| 48 | +전역 변수/싱글톤 모두 비슷. 변경되지 않는 전역 데이터는 그나마 나음 |
| 49 | +- 변수 캡슐화하기 |
| 50 | + - 다른 코드에서 오염시킬 가능성이 있는 데이터의 경우 |
| 51 | + - 추가적으로 접근자 함수들을 클래스나 모듈에 집어넣어 한정시킬 수 있음 |
| 52 | + |
| 53 | + |
| 54 | +### 가변 데이터 |
| 55 | +무분별한 데이터 수정에 따른 위험을 줄이는 방법 |
| 56 | +- 변수 캡슐화하기 |
| 57 | + - 정해진 함수를 이용해서만 변경 가능 |
| 58 | +- 변수 쪼개기 |
| 59 | + - 하나의 변수에 용도가 다른 값들을 저장하고 관리하는 경우 |
| 60 | + - 용도별로 독립 변수에 저장 |
| 61 | +- 문장 슬라이드하기 |
| 62 | +- 함수 추출하기 |
| 63 | + - 갱신 로직을 다른 코드로부터 분리하기 |
| 64 | +- 질의 함수와 변경 함수 분리하기 |
| 65 | + - API를 만드는 경우 |
| 66 | +- 세터 제거하기 |
| 67 | +- 파생 변수를 질의 함수로 바꾸기 |
| 68 | + - 값을 다른 곳에서 설정할 수 있는 가변 데이터 |
| 69 | +- 여러 함수를 클래스로 묶기 |
| 70 | +- 여러 함수를 변환 함수로 묶기 |
| 71 | + - 변수 갱신 코드의 유효범위 제한 |
| 72 | +- 참조를 값으로 바꾸기 |
| 73 | + - 구조체처럼 내부 필드에 데이터를 담는 변수 |
| 74 | + - 내부 필드를 직접 수정하지 않고 구조체를 직접 바꾸기 |
| 75 | + |
| 76 | +### 뒤엉킨 변경 |
| 77 | +구조가 얽혀서 하나를 바꾸거나 추가할 때 여러 곳을 건드려야 하게 되는 경우 |
| 78 | +- 단계 쪼개기 |
| 79 | + - 순차적 로직의 경우, db 접근 -> 비즈니스 로직 처리 |
| 80 | +- 함수 옮기기 |
| 81 | + - 각 처리 과정에서 각기 다른 맥락의 함수들을 호출하는 빈도가 높은 경우 |
| 82 | +- 함수 추출하기 |
| 83 | + - 여러 맥락의 일에 관여하는 함수가 있는 경우 |
| 84 | +- 클래스 추출하기 |
| 85 | + - 모듈이 클래스인 경우 |
| 86 | + |
| 87 | +### 산탄총 수술 |
| 88 | +하나를 변경하려는데 잘게 여러개를 건드려야 하는 경우 |
| 89 | +변경해야할 부분이 코드 전반에 퍼져있어 놓치기 쉬워짐 |
| 90 | +- 함수 옮기기 |
| 91 | +- 필드 옮기기 |
| 92 | + - 함께 변경되는 대상들을 모듈에 모아두기 |
| 93 | +- 여러 함수들을 클래스로 묶기 |
| 94 | + - 비슷한 데이터를 다루는 함수가 많은 경우 |
| 95 | +- 여러 함수를 변환 함수로 묶기 |
| 96 | + - 데이터 구조를 변환/보강하는 함수들의 경우 |
| 97 | +- 단계 쪼개기 |
| 98 | + - 묶은 함수들의 출력 결과를 묶어 다음 단계 로직으로 전달할 수 있는 경우 |
| 99 | +- 함수 인라인하기 |
| 100 | +- 클래스 인라인하기 |
| 101 | + - 어설프게 분리된 로직의 경우 인라인해서 다루기 쉽게 만들기 |
| 102 | + |
| 103 | +### 기능 편애 |
| 104 | +자기가 속한 모듈과의 상호작용보다 다른 모듈과의 함수/데이터 상호작용이 많은 경우 |
| 105 | +- 함수 옮기기 |
| 106 | +- 함수 추출하기 |
| 107 | + - 함수의 일부에서만 외부 의존이 큰 경우 |
| 108 | + - 의존 모듈이 다양한 경우 |
| 109 | + |
| 110 | +전략 패턴, 방문자 패턴, 켄트 벡의 자기 위임 등도 뒤엉킨 변경을 제거할 때 사용. |
| 111 | +함께 변경할 대상을 한 데 모으는 것. |
| 112 | + |
| 113 | +### 데이터 뭉치 |
| 114 | +- 클래스 추출하기 |
| 115 | + - 필드 형태의 데이터 뭉치 |
| 116 | +- 매개변수 객체 만들기 |
| 117 | +- 객체 통째로 넘기기 |
| 118 | + - 메서드 시그니처에 있는 매개변수 데이터 뭉치들에 대해 적용 |
| 119 | + - 값 하나를 삭제했을 때 나머지 데이터로 의미가 없다면 객체가 되길 갈망하는 데이터임 |
| 120 | + |
| 121 | +여기서 만든 클래스로 옮길 함수도 생각해보면 좋다. |
| 122 | + |
| 123 | +### 기본형 집착 |
| 124 | +전화번호: 사용자에게 보여줄 때에 일관적 형식으로 표시하는 기능 등이 필요 |
| 125 | +이러한 정보를 단순 문자열로 다루기엔 부족하다. |
| 126 | +- 기본형을 객체로 바꾸기 |
| 127 | + - 문명 사회로 데이터를 옮겨주기 |
| 128 | +- 타입 코드를 서브클래스로 바꾸기 |
| 129 | +- 조건부 로직을 다형성으로 바꾸기 |
| 130 | + - 기본형으로 표현된 코드가 조건부 동작을 제어하는 타입 코드로 쓰인 경우, 위 두개를 차례로 적용 |
| 131 | +- 클래스 추출하기 |
| 132 | +- 매개변수 객체 만들기 |
| 133 | + - 같이 어울리는 데이터 뭉치 |
| 134 | + |
| 135 | +### 반복되는 switch문 |
| 136 | + |
| 137 | + |
| 138 | +### 반복문 |
| 139 | + |
| 140 | +- 반복문을 파이프라인으로 바꾸기 |
| 141 | + |
| 142 | +### 성의 없는 요소 |
| 143 | + |
| 144 | +### 추측성 일반화 |
| 145 | + |
| 146 | +### 임시 필드 |
| 147 | + |
| 148 | +### 메시지 체인 |
| 149 | + |
| 150 | +- 위임 숨기기 |
| 151 | +- 함수 추출하기 |
| 152 | +- 함수 옮기기 |
| 153 | + |
| 154 | +### 중개자 |
| 155 | + |
| 156 | +- 중개자 제거하기 |
| 157 | +- 함수 인라인하기 |
| 158 | + |
| 159 | +### 내부자 거래 |
| 160 | + |
| 161 | +- 함수 옮기기 |
| 162 | +- 필드 옮기기 |
| 163 | +- 위임 숨기기 |
| 164 | +- 서브클래스를 위임으로 바꾸기 |
| 165 | +- 슈퍼클래스를 위임으로 바꾸기 |
| 166 | + |
| 167 | +### 거대한 클래스 |
| 168 | + |
| 169 | + |
| 170 | +### 서로 다른 인터페이스의 대안 클래스들 |
| 171 | + |
| 172 | + |
| 173 | +### 데이터 클래스 |
| 174 | + |
| 175 | + |
| 176 | +### 상속 포기 |
| 177 | + |
| 178 | +### 주석 |
| 179 | + |
| 180 | + |
| 181 | + |
0 commit comments