Notice
Recent Posts
Recent Comments
끄적끄적
리팩토링 3장 - 코드 속의 나쁜 냄새 본문
중복된 코드
- 한 클래스의 서로 다른 두 메소드 안에 같은 코드가 있는 경우
- Extract Method
- 동일한 수퍼클래스를 갖는 두 서브클래스에서 같은 코드가 있는 경우
- Extract Method 후 Pull Up Method
- 비슷하지만 같지는 않다면
- 비슷한 부분 Extract Method 후 Form Template Method 사용 가능한지 확인
- 같은 작업을 하지만 다른 알고리즘을 사용한다면
- 두 알고리즘 중 더 명확한 것 선택해서 Substitute Algorithm 사용
- 서로 관계 없는 두 클래스에서 중복된 코드가 있는 경우
- Extract Class 사용한 다음 양쪽에서 이 새로운 클래스를 사용
긴 메소드
- 어떤 것에 대해 주석을 달아야 할 필요를 느낄 때마다 대신 메소드를 작성하라
- 단지 한 줄의 코드라 할지라도 그것이 설명을 필요로 한다면 메소드로 뽑아낼 가치가 있다.
- 메소드 길이를 줄이기 위해선 Extract Method
- 메소드에 파라미터와 임시변수가 많다면
- 임시변수를 제거 하기 위해 Replace Temp with Query
- 긴 파라미터 리스트는 Introduce Parameter Object와 Preserve Whole Object로 짧게 할 수 있음
- 그래도 많다면 Replace Method with Method Object라는 중장비 동원해야 할 때
- 조건문과 루프 또한 메소드 추출이 필요하다는 신호
- Decompose Conditional
거대한 클래스
- 지나치게 많은 인스턴수 변수
- Extract Class
- 새로 만들 클래스가 서브클래스로서 의미가 있으면 Extract Subclass
- 코드가 많은 클래스
- 클라이언트가 클래스를 어떻게 쓰게 할 지 결정하고 각각의 사용 방법에 대해 Extract Interface
긴 파라미터 리스트
- 대부분의 변경은 객체를 넘겨서 해결
- 이미 알고 있는 객체에 요청하여 파라미터의 데이터를 얻을 수 있으면
- Replace Parameter with Method
- 한 객체로부터 주워 모은 데이터 뭉치를 그 객체 자체로 바꾸기 위해
- Preserve Whole Object
- 객체와 관계 없는 여러 개의 데이터 아이템이 있는 경우
- Introduce Parameter Object
확산적 변경
- 한 클래스가 여러 종류의 변경 때문에 시달리는 경우
- Extract Class 사용해서 특정 원인에 대해 변해야 하는 것들을 묶어줌
산탄총 수술
- 확산적 변경과 반대
- 하나를 변경했을 때 많은 클래스를 고쳐야 하는 경우
- Move Method, Move Field를 사용해서 변경해야 할 부분을 모두 하나의 클래스로
- 기존의 클래스 중에서 메소드나 필드가 옮겨갈 후보가 적당히 없다면 새로 하나 만들어라
데이터 덩어리
- Extract Class
Switch 문
- Switch문에 코드를 추가하려면 중복된 모든 switch문 찾아 바꿔줘야 함
- Switch 보면 항상 다형성을 생각해야 함
- 만약 하나의 메소드에만 영향을 미치는 몇 개의 경우가 있다면, 굳이 바꿀 필요 없다.
- 이런 경우 다형성은 과하다
- Replace parameter with Explicit methods
- 만약 조건 중 null이 있는 경우라면 Intruduce Null Object
메시지 체인
- 클라이언트가 어떤 객체를 얻기 위해 다른 객체에 물어보고, 또 다른 객체에 물어보고 ...
- Hide Delegate
데이터 클래스
- 필드와 각 필드에 대한 get/set 메소드만 가지고있는 클래스
- 약간의 책임을 가질 필요가 있다.
- get/set 메소드가 다른 클래스에서 사용되는지 찾아보고 동작을 데이터 클래스로 옮기기 위해
- Move Method 시도
- 메소드 전체 옮길 수 없을 땐 Extract Method
- 그 후에 get/set 메소드에 대해 Hide Method를 사용할 수 있다
거부된 유산
- 서브클래스가 부모 클래스로부터 주어진 것을 원치 않을 땐 단지 필요한 몇개만 고른다
- 새로운 형제 클래스 만들고 Push Down Method, Push Down Field 사용해서 사용되지 않는 메소드를 모두 형제 메소드로 옮겨라
'리팩토링' 카테고리의 다른 글
리팩토링 7장 - 객체간의 기능 이동 (0) | 2016.03.12 |
---|---|
리팩토링 6장 - 메소드 정리 (0) | 2016.03.06 |
리팩토링 4장 - 테스트 만들기 (0) | 2016.02.27 |
리팩토링 2장 - 리팩토링의 원리 (0) | 2016.02.14 |
[리팩토링] 1장 - (1) (0) | 2016.02.06 |
Comments