14

Click here to load reader

리펙토링 11장 p389_p400

Embed Size (px)

Citation preview

Page 1: 리펙토링 11장 p389_p400

Refactoring 리팩토링

11장 - Extract Interface - Collapse Hierarchy - Form Template Method

아꿈사 http://cafe.naver.com/architect1 TTF http://www.npteam.net

Page 2: 리펙토링 11장 p389_p400

Extract Interface

■ 여러 클래스의 공통된 부분 집합을 인터페이스로 뽑아내라.

Page 3: 리펙토링 11장 p389_p400

Extract Interface

■ 동기 - 여러 클래스의 동일한 책임 부분을 인터페이스 상속으로 명확하게 한다. - 인터페이스 상속으로 기능을 추가하는 방법은 다중 상속으로 처리된다. C++ : 순수 가상함수 상속 JAVA : 인터페이스 상속 클래스가 서로 다른 상황에서 별개의 역할을 가지고 있을 때는 언제나 인터페이스를 사용하는 것이 좋다.

Page 4: 리펙토링 11장 p389_p400

Extract Interface

■ 절차 - 빈 인터페이스를 만든다. - 공통된 오퍼레이션을 인터페이스에 선언한다. - 관련이 있는 클래스들이 이 인터페이스를 구현하도록 선언한다. - 클라이언트에서 새로 만든 인터페이스를 사용하도록 타입 선언을 조정한다.

Page 5: 리펙토링 11장 p389_p400

Extract Interface

■ 예제

Page 6: 리펙토링 11장 p389_p400

Collapse Hierarchy

■ 수퍼클래스와 서브클래스가 별로 다르지 않다면, 그것들을 하나로 합쳐라.

Page 7: 리펙토링 11장 p389_p400

Collapse Hierarchy

■ 동기 - 클래스 상속 구조에서 메소드를 위/아래로 옮기는 리펙토링을 한다. - 리펙토링 작업 이후 더 이상 작동하지 않는 서브클래스를 발견하면 클래스를 하나로 합친다.

상속 관계에서 불필요한 클래스를 합친다.

Page 8: 리펙토링 11장 p389_p400

Collapse Hierarchy

■ 절차 - 제거할 클래스(수퍼클래스, 서브클래스)를 선택한다. - 메소드와 필드를 위/아래로 옮긴다. Pull Up Field(368), Pull Up Method(370) Push Down Method(376), Push Down Field(377) - 제거될 클래스의 참조를 합병된 클래스로 변경한다. - 빈 클래스를 제거하고 컴파일 및 테스트를 한다.

Page 9: 리펙토링 11장 p389_p400

Form Template Method

■ 각각의 서브 클래스에 동일한 순서로 비슷한 단계를 진행하지만, 단계가 완전히 같지 않는 두 메소드가 있다면, 그 단계를 동일한 시그너처를 가진 메소드로 만들어라. 이렇게 하면 메소드를 수퍼클래스로 올릴 수 있다.

Page 10: 리펙토링 11장 p389_p400

Form Template Method

Page 11: 리펙토링 11장 p389_p400

Form Template Method

■ 동기 - 상속은 중복된 동작을 제거하는데 있어서 강력한 도구이다. - 서브 클래스의 비슷한 메소드를 수퍼 클래스로 옮긴다.(Form Template Method) - 순서를 수퍼 클래스로 옮기고, 각 단계별 처리는 다형성을 사용해서 상속받은 메소드에서 다른 방법으로 처리한다. 템플릿 메소드(Templete Method. GOF)

Page 12: 리펙토링 11장 p389_p400

Form Template Method

■ 절차 - 01 - 메소드들을 분해해서 추출된 모든 메소드들이 동일하거나 또는 완전히 다르게 한다. - Pull Up Method(370)을 사용하여 동일한 메소드들을 수퍼클래스로 옮긴다. - 서로 다른 메소드의 시그너처를 Rename Method(313)를 사용하여 각 단계의 시그너처와 같아지도록 한다. - 각각의 시그너처 변경후 컴파일, 테스트를 한다.

Page 13: 리펙토링 11장 p389_p400

Form Template Method

■ 절차 - 02 - 원래 메소드들 중에 하나에 Pull Up Method(370)를 사용한다. - 서로 다른 메소드들의 시그너처는 수퍼클래스에 추상 메소드로 정의한다. - 컴파일, 테스트를 한다. - 그 밖의 메소드들을 제거하고 정리한 후에 컴파일, 테스트를 한다.

Page 14: 리펙토링 11장 p389_p400