SlideShare a Scribd company logo
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

More Related Content

Similar to 리펙토링 11장 p389_p400

Refactoring
RefactoringRefactoring
Refactoring
YongRak Kim
 
10장 클래스
10장 클래스10장 클래스
10장 클래스
kidoki
 
[Dev rookie]designpattern
[Dev rookie]designpattern[Dev rookie]designpattern
[Dev rookie]designpattern
대영 노
 
Java collections framework
Java collections frameworkJava collections framework
Java collections framework
경주 전
 
Xe 구조에 대한 이해
Xe 구조에 대한 이해Xe 구조에 대한 이해
Xe 구조에 대한 이해Dong Hyun Kim
 
Effective c++ 4
Effective c++ 4Effective c++ 4
Effective c++ 4현찬 양
 
[오픈소스컨설팅]Spring MVC
[오픈소스컨설팅]Spring MVC [오픈소스컨설팅]Spring MVC
[오픈소스컨설팅]Spring MVC
Ji-Woong Choi
 
Refactoring ch6
Refactoring ch6Refactoring ch6
Refactoring ch6
krazyhe
 
디자인패턴 1~13
디자인패턴 1~13디자인패턴 1~13
디자인패턴 1~13
Shin heemin
 
Head first디자인패턴 1~13_희민_호준
Head first디자인패턴 1~13_희민_호준Head first디자인패턴 1~13_희민_호준
Head first디자인패턴 1~13_희민_호준
HoJun Sung
 
Design patterns
Design patternsDesign patterns
Design patterns
Joshua Yoon
 
이펙티브 C++ (7~9)
이펙티브 C++ (7~9)이펙티브 C++ (7~9)
이펙티브 C++ (7~9)익성 조
 
[스프링 스터디 1일차] 템플릿
[스프링 스터디 1일차] 템플릿[스프링 스터디 1일차] 템플릿
[스프링 스터디 1일차] 템플릿
AnselmKim
 
HolubOnPatterns/chapter2_2
HolubOnPatterns/chapter2_2HolubOnPatterns/chapter2_2
HolubOnPatterns/chapter2_2SeungHyun Hwang
 
[스프링 스터디 3일차] @MVC
[스프링 스터디 3일차] @MVC[스프링 스터디 3일차] @MVC
[스프링 스터디 3일차] @MVC
AnselmKim
 
Template at c++
Template at c++Template at c++
Template at c++
Lusain Kim
 
토비의 스프링 - DI
토비의 스프링 - DI토비의 스프링 - DI
토비의 스프링 - DI
JU Chae
 
[HaU] 신입 기술 면접 준비 java
[HaU] 신입 기술 면접 준비 java[HaU] 신입 기술 면접 준비 java
[HaU] 신입 기술 면접 준비 java
유리 하
 
함수형사고 실용적사고
함수형사고 실용적사고함수형사고 실용적사고
함수형사고 실용적사고
Sunggon Song
 

Similar to 리펙토링 11장 p389_p400 (20)

Refactoring
RefactoringRefactoring
Refactoring
 
Refactoring
RefactoringRefactoring
Refactoring
 
10장 클래스
10장 클래스10장 클래스
10장 클래스
 
[Dev rookie]designpattern
[Dev rookie]designpattern[Dev rookie]designpattern
[Dev rookie]designpattern
 
Java collections framework
Java collections frameworkJava collections framework
Java collections framework
 
Xe 구조에 대한 이해
Xe 구조에 대한 이해Xe 구조에 대한 이해
Xe 구조에 대한 이해
 
Effective c++ 4
Effective c++ 4Effective c++ 4
Effective c++ 4
 
[오픈소스컨설팅]Spring MVC
[오픈소스컨설팅]Spring MVC [오픈소스컨설팅]Spring MVC
[오픈소스컨설팅]Spring MVC
 
Refactoring ch6
Refactoring ch6Refactoring ch6
Refactoring ch6
 
디자인패턴 1~13
디자인패턴 1~13디자인패턴 1~13
디자인패턴 1~13
 
Head first디자인패턴 1~13_희민_호준
Head first디자인패턴 1~13_희민_호준Head first디자인패턴 1~13_희민_호준
Head first디자인패턴 1~13_희민_호준
 
Design patterns
Design patternsDesign patterns
Design patterns
 
이펙티브 C++ (7~9)
이펙티브 C++ (7~9)이펙티브 C++ (7~9)
이펙티브 C++ (7~9)
 
[스프링 스터디 1일차] 템플릿
[스프링 스터디 1일차] 템플릿[스프링 스터디 1일차] 템플릿
[스프링 스터디 1일차] 템플릿
 
HolubOnPatterns/chapter2_2
HolubOnPatterns/chapter2_2HolubOnPatterns/chapter2_2
HolubOnPatterns/chapter2_2
 
[스프링 스터디 3일차] @MVC
[스프링 스터디 3일차] @MVC[스프링 스터디 3일차] @MVC
[스프링 스터디 3일차] @MVC
 
Template at c++
Template at c++Template at c++
Template at c++
 
토비의 스프링 - DI
토비의 스프링 - DI토비의 스프링 - DI
토비의 스프링 - DI
 
[HaU] 신입 기술 면접 준비 java
[HaU] 신입 기술 면접 준비 java[HaU] 신입 기술 면접 준비 java
[HaU] 신입 기술 면접 준비 java
 
함수형사고 실용적사고
함수형사고 실용적사고함수형사고 실용적사고
함수형사고 실용적사고
 

More from Heo Seungwook

리펙토링 8장 p236_p243
리펙토링 8장 p236_p243리펙토링 8장 p236_p243
리펙토링 8장 p236_p243Heo Seungwook
 
Ipv6 소켓프로그래밍
Ipv6 소켓프로그래밍Ipv6 소켓프로그래밍
Ipv6 소켓프로그래밍Heo Seungwook
 
해외취업이야기
해외취업이야기해외취업이야기
해외취업이야기Heo Seungwook
 
C++ 프로젝트에 단위 테스트 도입하기
C++ 프로젝트에 단위 테스트 도입하기C++ 프로젝트에 단위 테스트 도입하기
C++ 프로젝트에 단위 테스트 도입하기Heo Seungwook
 
MS SharePoint를 활용한 개발환경 구축
MS SharePoint를 활용한 개발환경 구축MS SharePoint를 활용한 개발환경 구축
MS SharePoint를 활용한 개발환경 구축Heo Seungwook
 
2010 연말행사 온라인스터디
2010 연말행사 온라인스터디2010 연말행사 온라인스터디
2010 연말행사 온라인스터디Heo Seungwook
 
Client dispatcher server_pattern
Client dispatcher server_patternClient dispatcher server_pattern
Client dispatcher server_patternHeo Seungwook
 
프로그램은 왜 실패하는가
프로그램은 왜 실패하는가프로그램은 왜 실패하는가
프로그램은 왜 실패하는가Heo Seungwook
 

More from Heo Seungwook (9)

리펙토링 8장 p236_p243
리펙토링 8장 p236_p243리펙토링 8장 p236_p243
리펙토링 8장 p236_p243
 
Ipv6 소켓프로그래밍
Ipv6 소켓프로그래밍Ipv6 소켓프로그래밍
Ipv6 소켓프로그래밍
 
해외취업이야기
해외취업이야기해외취업이야기
해외취업이야기
 
C++ 프로젝트에 단위 테스트 도입하기
C++ 프로젝트에 단위 테스트 도입하기C++ 프로젝트에 단위 테스트 도입하기
C++ 프로젝트에 단위 테스트 도입하기
 
MS SharePoint를 활용한 개발환경 구축
MS SharePoint를 활용한 개발환경 구축MS SharePoint를 활용한 개발환경 구축
MS SharePoint를 활용한 개발환경 구축
 
2010 연말행사 온라인스터디
2010 연말행사 온라인스터디2010 연말행사 온라인스터디
2010 연말행사 온라인스터디
 
Client dispatcher server_pattern
Client dispatcher server_patternClient dispatcher server_pattern
Client dispatcher server_pattern
 
Mvc pattern
Mvc patternMvc pattern
Mvc pattern
 
프로그램은 왜 실패하는가
프로그램은 왜 실패하는가프로그램은 왜 실패하는가
프로그램은 왜 실패하는가
 

리펙토링 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 ■ 절차 - 빈 인터페이스를 만든다. - 공통된 오퍼레이션을 인터페이스에 선언한다. - 관련이 있는 클래스들이 이 인터페이스를 구현하도록 선언한다. - 클라이언트에서 새로 만든 인터페이스를 사용하도록 타입 선언을 조정한다.
  • 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 ■ 각각의 서브 클래스에 동일한 순서로 비슷한 단계를 진행하지만, 단계가 완전히 같지 않는 두 메소드가 있다면, 그 단계를 동일한 시그너처를 가진 메소드로 만들어라.  이렇게 하면 메소드를 수퍼클래스로 올릴 수 있다.
  • 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)를 사용한다. - 서로 다른 메소드들의 시그너처는 수퍼클래스에 추상 메소드로 정의한다. - 컴파일, 테스트를 한다. - 그 밖의 메소드들을 제거하고 정리한 후에 컴파일, 테스트를 한다.