Refactoring 리팩토링
11장
 - Extract Interface
 - Collapse Hierarchy
 - Form Template Method



               아꿈사   http://cafe.naver.com/architect1
               TTF   http://www.npteam.net
Extract Interface
■ 여러 클래스의 공통된 부분 집합을 인터페이스로
  뽑아내라.
Extract Interface
■ 동기
 - 여러 클래스의 동일한 책임 부분을 인터페이스
   상속으로 명확하게 한다.

 - 인터페이스 상속으로 기능을 추가하는 방법은
   다중 상속으로 처리된다.
    C++ : 순수 가상함수 상속
    JAVA : 인터페이스 상속

  클래스가 서로 다른 상황에서 별개의 역할을
  가지고 있을 때는 언제나 인터페이스를
  사용하는 것이 좋다.
Extract Interface
■ 절차
 - 빈 인터페이스를 만든다.

 - 공통된 오퍼레이션을 인터페이스에 선언한다.

 - 관련이 있는 클래스들이 이 인터페이스를
   구현하도록 선언한다.

 - 클라이언트에서 새로 만든 인터페이스를
   사용하도록 타입 선언을 조정한다.
Extract Interface
■ 예제
Collapse Hierarchy
■ 수퍼클래스와 서브클래스가 별로 다르지 않다면,
  그것들을 하나로 합쳐라.
Collapse Hierarchy
■ 동기
 - 클래스 상속 구조에서 메소드를 위/아래로
   옮기는 리펙토링을 한다.

 - 리펙토링 작업 이후 더 이상 작동하지 않는
   서브클래스를 발견하면 클래스를 하나로 합친다.


   상속 관계에서 불필요한 클래스를 합친다.
Collapse Hierarchy
■ 절차
 - 제거할 클래스(수퍼클래스, 서브클래스)를
   선택한다.

 - 메소드와 필드를 위/아래로 옮긴다.
    Pull Up Field(368), Pull Up Method(370)
    Push Down Method(376), Push Down Field(377)

 - 제거될 클래스의 참조를 합병된 클래스로
   변경한다.

 - 빈 클래스를 제거하고 컴파일 및 테스트를 한다.
Form Template Method
■ 각각의 서브 클래스에
  동일한 순서로 비슷한 단계를 진행하지만,
  단계가 완전히 같지 않는 두 메소드가 있다면,

 그 단계를 동일한 시그너처를 가진 메소드로
 만들어라.

  이렇게 하면 메소드를 수퍼클래스로
   올릴 수 있다.
Form Template Method
Form Template Method
■ 동기
 - 상속은 중복된 동작을 제거하는데 있어서
   강력한 도구이다.

 - 서브 클래스의 비슷한 메소드를
   수퍼 클래스로 옮긴다.(Form Template Method)

 - 순서를 수퍼 클래스로 옮기고,
   각 단계별 처리는 다형성을 사용해서
   상속받은 메소드에서 다른 방법으로 처리한다.
    템플릿 메소드(Templete Method. GOF)
Form Template Method
■ 절차 - 01
 - 메소드들을 분해해서 추출된 모든 메소드들이
   동일하거나 또는 완전히 다르게 한다.

 - Pull Up Method(370)을 사용하여 동일한
   메소드들을 수퍼클래스로 옮긴다.

 - 서로 다른 메소드의 시그너처를
   Rename Method(313)를 사용하여 각 단계의
   시그너처와 같아지도록 한다.

 - 각각의 시그너처 변경후 컴파일, 테스트를 한다.
Form Template Method
■ 절차 - 02
 - 원래 메소드들 중에 하나에
   Pull Up Method(370)를 사용한다.

 - 서로 다른 메소드들의 시그너처는
   수퍼클래스에 추상 메소드로 정의한다.

 - 컴파일, 테스트를 한다.

 - 그 밖의 메소드들을 제거하고 정리한 후에
   컴파일, 테스트를 한다.
리펙토링 11장 p389_p400

리펙토링 11장 p389_p400

  • 1.
    Refactoring 리팩토링 11장 -Extract Interface - Collapse Hierarchy - Form Template Method 아꿈사 http://cafe.naver.com/architect1 TTF http://www.npteam.net
  • 2.
    Extract Interface ■ 여러클래스의 공통된 부분 집합을 인터페이스로 뽑아내라.
  • 3.
    Extract Interface ■ 동기 - 여러 클래스의 동일한 책임 부분을 인터페이스 상속으로 명확하게 한다. - 인터페이스 상속으로 기능을 추가하는 방법은 다중 상속으로 처리된다.  C++ : 순수 가상함수 상속  JAVA : 인터페이스 상속 클래스가 서로 다른 상황에서 별개의 역할을 가지고 있을 때는 언제나 인터페이스를 사용하는 것이 좋다.
  • 4.
    Extract Interface ■ 절차 - 빈 인터페이스를 만든다. - 공통된 오퍼레이션을 인터페이스에 선언한다. - 관련이 있는 클래스들이 이 인터페이스를 구현하도록 선언한다. - 클라이언트에서 새로 만든 인터페이스를 사용하도록 타입 선언을 조정한다.
  • 5.
  • 6.
    Collapse Hierarchy ■ 수퍼클래스와서브클래스가 별로 다르지 않다면, 그것들을 하나로 합쳐라.
  • 7.
    Collapse Hierarchy ■ 동기 - 클래스 상속 구조에서 메소드를 위/아래로 옮기는 리펙토링을 한다. - 리펙토링 작업 이후 더 이상 작동하지 않는 서브클래스를 발견하면 클래스를 하나로 합친다. 상속 관계에서 불필요한 클래스를 합친다.
  • 8.
    Collapse Hierarchy ■ 절차 - 제거할 클래스(수퍼클래스, 서브클래스)를 선택한다. - 메소드와 필드를 위/아래로 옮긴다.  Pull Up Field(368), Pull Up Method(370)  Push Down Method(376), Push Down Field(377) - 제거될 클래스의 참조를 합병된 클래스로 변경한다. - 빈 클래스를 제거하고 컴파일 및 테스트를 한다.
  • 9.
    Form Template Method ■각각의 서브 클래스에 동일한 순서로 비슷한 단계를 진행하지만, 단계가 완전히 같지 않는 두 메소드가 있다면, 그 단계를 동일한 시그너처를 가진 메소드로 만들어라.  이렇게 하면 메소드를 수퍼클래스로 올릴 수 있다.
  • 10.
  • 11.
    Form Template Method ■동기 - 상속은 중복된 동작을 제거하는데 있어서 강력한 도구이다. - 서브 클래스의 비슷한 메소드를 수퍼 클래스로 옮긴다.(Form Template Method) - 순서를 수퍼 클래스로 옮기고, 각 단계별 처리는 다형성을 사용해서 상속받은 메소드에서 다른 방법으로 처리한다.  템플릿 메소드(Templete Method. GOF)
  • 12.
    Form Template Method ■절차 - 01 - 메소드들을 분해해서 추출된 모든 메소드들이 동일하거나 또는 완전히 다르게 한다. - Pull Up Method(370)을 사용하여 동일한 메소드들을 수퍼클래스로 옮긴다. - 서로 다른 메소드의 시그너처를 Rename Method(313)를 사용하여 각 단계의 시그너처와 같아지도록 한다. - 각각의 시그너처 변경후 컴파일, 테스트를 한다.
  • 13.
    Form Template Method ■절차 - 02 - 원래 메소드들 중에 하나에 Pull Up Method(370)를 사용한다. - 서로 다른 메소드들의 시그너처는 수퍼클래스에 추상 메소드로 정의한다. - 컴파일, 테스트를 한다. - 그 밖의 메소드들을 제거하고 정리한 후에 컴파일, 테스트를 한다.