Bad Smell이란 Technically bug는 아니지만 심각한 문제를 유발할 수 있거나 디자인 결함을 가지고 있는 것들이다.
Bad Smell은 다음을 통해 발견한다.
- Experience
- Code review
- Code metrics
- tools
Bad Smell의 종류
1. Bloaters: gargantuan code (거대한 코드)
1-1. Long Method
- 너무 많은 line을 가진 Method
1-2. Larger Class
- 너무 많은 fields / methods / lines을 가진 Class
1-3. Primitive Obsession
- simple task를 위하여 small object를 사용하는 것이 아니라 primitives를 사용하는 것
- 예를 들면 Customer Class에서 Email을 단순 String으로만 처리하는 경우, Email에 대한 검증이 들어오면 그에 대한 처리가 Customer Class에 들어가야 한다. 이러한 경우 String이 아닌 Email Object를 만들어서 처리하면 된다.
1-4. Long Parameter List
- 3~4개 이상의 parameter를 가지는 Method
- 단, 개수보다 parameter 간의 관계가 중요하다. Parameter 간의 관계가 적다면 해당 문제를 가지지 않다고 볼 수 있다.
1-5. Data Clumps : 각각의 부분이 합쳐져서 하나의 구성 요소를 이루는 경우
- 예를 들면 이름, 나이, 성별 등을 각각 변수로 가지고 있는 경우, 이는 사람 Class로 대체될 수 있다.
2. Object-Oriented Abusers
2-1. Switch Statements
- 복잡한 Switch 문이나 Sequecne of If statement를 가지는 경우
2-2. Temporary Field
- fields getting their values only under certain circumstances and being empty outside of these circumstances
- 특정한 케이스에서만 필드가 활성화되고 그 외에는 Emtpy인 경우. Extract class로 처리해준다.
2-3. Refused Bequest
- 부모 클래스를 상속하나 일부의 Methods 혹은 Properties만 사용하는 경우.
- 쓰이지 않는 Methods는 사용하지 않거나 redefined 되어 예외 처리한다.
2-4. Alternative Class With Different Interface
- 서로 다른 클래스가 같은 function을 수행하지만 다른 method 이름을 가지고 있는 경우
3. Change Preventers
하나의 결과가 변경되는 것이 다른 여러 곳의 변경을 필요로 하는 경우
3-1. Divergent Change
- 클래스 하나를 바꾸는 것이 여러 관련없는 Method의 변경을 필요로 하는 경우
3-2. Shotgun Surgery
- 하나의 변경이 다른 클래스의 변경을 필요로 하는 경우
3-3. Parallel Inheritance Hierarchies
- 서브 클래스를 만드는 것이 다른 클래스의 서브 클래스를 만드는 것을 유발하는 경우
4. Dispensables (불필요한)
4-1. Comments
- 주석
4-2. Duplicate Code
- 중복된 코드
4-3. Lazy Class
- 클래스를 생성할 때마다 그것을 유지하고, 이해하기 위한 비용이 발생하는 경우
- 이 비용을 감당할만큼의 일을 하지 않으면 삭제해야 한다.
4-4. Data Class
- Getter / Setter만을 제공하는 클래스
4-5. Dead Code
- 더 이상 사용되지 않는 코드
4-6. Speculative Generality (추측성 일반화)
- 아무것도 하지 않는데 추측성으로 생긴 Hieracy (예를 들면 음식 - 과일 - 사과 에서 과일이 아무것도 하지 않는다면 과일)
5. Couplers
5-1. Feature Envy
- Method가 자기 자신보다 다른 Object의 Data를 더 많이 사용하는 경우
5-2. Inappropriate Intimacy (부적절한 친밀함)
- 서로가 서로의 internal fields나 methods를 너무 많이 사용하는 경우
- Encapsulation 과 Information Hiding과 관련있다.
- Ex) city = ob.getCity() state = ob.getState() -> (address = contactInfo)
5-3. Message Chain
- Call이 연속되는 경우
- Ex) a->b()->c()->d()
5-4. Middle Chain
- Class가 Delegate만을 수행하는 경우
6. 기타
6-1. Incomplete Library Class
- Library가 완벽하지 않은 경우 수정이 힘들기 때문에 사용에 조심해야한다.
코드 스멜을 제거하는 방법
리팩토링 기법 - Composoing Methods
'Refactoring (리팩토링)' 카테고리의 다른 글
리팩토링(Refactoring) 3. Refactoring Techniques 1. Composing Methods (0) | 2021.04.06 |
---|---|
리팩토링(Refactoring) 1. 리팩토링 이란? (0) | 2021.04.06 |