Refactoring (리팩토링)

리팩토링(Refactoring) 2. Bad Smell, Code Smell (코드 스멜) 코드의 악취

jw92 2021. 4. 6. 21:39

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를 더 많이 사용하는 경우

Feature Envy - envyMethod를 Class B로 옮겨준다.

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) 3. Refactoring Techniques 1. Composing Methods

Refactoring Techniques 중 첫 번째로 Composoing Methods를 살펴본다. Composing Methods 1. Extract Method - Method로 그룹화 할 수 있는 code를 유의미한 이름과 함께 그룹화 하여 분리해라 - 기존 void printOwing(double amount

jw92.tistory.com