끄적끄적

리팩토링 3장 - 코드 속의 나쁜 냄새 본문

리팩토링

리팩토링 3장 - 코드 속의 나쁜 냄새

widruv 2016. 2. 21. 16:20
중복된 코드
  • 한 클래스의 서로 다른 두 메소드 안에 같은 코드가 있는 경우
    • 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 사용해서 사용되지 않는 메소드를 모두 형제 메소드로 옮겨라



Comments