Skip to content

Commit 97acff5

Browse files
committed
add misc files
1 parent 5bf2964 commit 97acff5

File tree

2 files changed

+181
-0
lines changed

2 files changed

+181
-0
lines changed

Pasted image 20231009152038.png

233 KB
Loading

study/refactoring/smells.md

+181
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,181 @@
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

Comments
 (0)