개발정리

리팩토링 객체간의 기능 이동 기법 본문

리팩토링

리팩토링 객체간의 기능 이동 기법

성구님 2017. 4. 9. 13:43
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

7장. 객체간의 기능 이동


Move Field

필드가 자신이 정의된 클래스보다 다른 클래스에 의해 더 많이 사용된다면

  • 타겟 클래스에 새로운 필드를 만들고 기존 필드를 사용하는 모든 부분을 변경하라.

언제?

  • 다른 클래스에서 get, set을 통해 간접적으로 많이 사용 될 때

자체 캡술화

  • 클래스 내부에서 필드를 사용할 때도 get, set메소드를 통해서 사용
    • 변경이 쉬워진다.

Extract Class

두 개의 클래스가 해야 할 일을 하나의 클래스가 하는 경우

  • 새로운 클래스를 만들어서 관련있는 필드와 메소드를 옮겨라.

동기

  • 클래스를 성격에 맞게 추상화
  • 클래스의 책임을 어떻게 나눌 것 인가?

Inline Class

클래스가 하는 일이 많지 않은 경우

  • 그 클래스에 있는 모든 변수와 메소드를 다른 클래스로 옮긴다.

동기

  • Extract Class에 반대다.

Hide Delegate

클라이언트가 객체의 위임 클래스를 직접 호출하고 있는 경우

  • 서버에 메소드를 만들어 Delegate를 숨겨라.

동기

  • 캡슐화를 위해
  • 커플링을 줄일 수 있다.

Remove Middle Man

클래스가 간단한 위임을 너무 많이 하는 경우

  • 클라이언트가 대리 객체를 직접 호출하라.

동기

  • Hide Delegate의 반대
  • Hide Delegate의 단점
    • 간단한 위임메소드 추가가 필수
    • 미들맨이 너무 커진다.
  • 시간에 따라 두 가지 리팩토링 기법을 적절히 사용

Introduce Foreign Method

사용하고 있는 서버클래스에 부가적인 메소드가 필요하지만 클래스를 수정할 수 없는 경우

  • 첫 번째 인자로 서버클래스의 인스턴스를 받는 메소드를 클라이언트에 만들어라.

Before

Date newStart = new Date(previousEnd.getYear(),
  previousEnd.getMonth(), previousEnd.getDate() + 1);

After

Date newStart = nextDay(previousEnd);

private static nextDay(Date arg){
    return new Date(arg.getYear(),
      arg.getMonth(), arg.getDate() + 1);
}


'리팩토링' 카테고리의 다른 글

리팩토링 [북리뷰] 리팩토링이란?  (0) 2017.04.09
리팩토링 메소드정리 기법  (0) 2017.04.09
Comments