SlideShare a Scribd company logo
1 of 21
Refactoring

 -Encapsulate Collection
 -Replace Record with Data Class
 -Replace Type Code with Class




                        아꿈사 http://cafe.naver.com/architect1
                        김용락 http://blog.naver.com/subhill
Encapsulate Collection

컬랙션(Collection)을 리턴하는 메소드가 있으면,
그 메소드가 read-only View를 리턴하도록 만들
   고, add/remove 메소드를 제공하라.
Encapsulate Collection
컬랙션을 리턴하는 메소드를 read-only View를 리턴하도록
    만들고, add/remove 메소드를 제공하라.
• 동기
 – 컬랙션(컨테이너)를 포함하고 있는 클래스 에서 종종 그 컬랙션에
   대해 직접적으로 get/set 메소드를 가지고 있는 경우에
   컬랙션은 약간 다른 프로토콜을 사용해야 한다.
• 이유
 – 클라이언트코드가 컬랙션을 가지고 있는 클래스가 알지 못하는
   사이에 컬렉션의 내용을 조작할 수 있기 때문.
 – 객체의 내부 데이터 구조를 너무 많이 드러나기 때문.
 – 컬랙션에 대해 set 메소드가 있으면 안됨
 – set대신 element를 add/remove하는 operation을 추가.
 – 이런 프로토콜로 컬랙션을 적절히 캡슐화, 클라이언트코드와
   클래스의 결합을 줄일 수 있다.
Encapsulate Collection
컬랙션을 리턴하는 메소드를 read-only View를 리턴하도록
    만들고, add/remove 메소드를 제공하라.
• 절차
 – 기존 코드       -메인부분
Encapsulate Collection
컬랙션을 리턴하는 메소드를 read-only View를 리턴하도록
    만들고, add/remove 메소드를 제공하라.
• 절차
 – 컬랙션에 대해 적절한 수정자를 만든다 add / remove
Encapsulate Collection
컬랙션을 리턴하는 메소드를 read-only View를 리턴하도록
    만들고, add/remove 메소드를 제공하라.
• 절차
 – set 메소드 몸체를 수정한다.
Encapsulate Collection
컬랙션을 리턴하는 메소드를 read-only View를 리턴하도록
    만들고, add/remove 메소드를 제공하라.
• 절차
 – set 메소드 사용하는것을 add/remove를 사용하도록 바꾼다




 – get 메소드를 통해 내부의 컬랙션 수정하는것을 찾아 수정.




 – get 메소드가 수정불가능한 뷰를 리턴하게 바꾸어 get검사
Encapsulate Collection
컬랙션을 리턴하는 메소드를 read-only View를 리턴하도록
    만들고, add/remove 메소드를 제공하라.
• 절차
 – 동작을 적절한 위치로 옮기기
Encapsulate Collection
컬랙션을 리턴하는 메소드를 read-only View를 리턴하도록
    만들고, add/remove 메소드를 제공하라.
• 절차
 – 기타의 동작 수정
Encapsulate Collection
컬랙션을 리턴하는 메소드를 read-only View를 리턴하도록
    만들고, add/remove 메소드를 제공하라.
• 배열의 캡슐화
 – 기존 코드




 – 수정자 제공




 – 배열 저체값 설정 오퍼레이션 추가
Encapsulate Collection
컬랙션을 리턴하는 메소드를 read-only View를 리턴하도록
    만들고, add/remove 메소드를 제공하라.
• 배열의 캡슐화
 – 기존 get 수정



 – 기존 코드 모두 변경했으면 get 이 복사본 리턴하도록 수정.




 – 이제 배열을 List로 바꾸자.
Replace Record with Data Class

전통적인 프로그래밍 환경에서의 레코드 구조에 대한 인터페이
 스가 필요한 경우, 그 레코드를 위한 데이터 객체를 만들라.
Replace Record with Data Class
 전통적인 프로그래밍 환경에서의 레코드 구조에 대한 인터페이
  스가 필요한 경우, 그 레코드를 위한 데이터 객체를 만들라.
• 동기
 – 전통적인 레코드 구조를 인터페이스를 통해 제어하고자 할 때


• 절차
 – 레코드를 표현할 클래스 만든다.
 – 캡슐화 한다 (private 필드로 추가, get/set method 추가)


• 배열의 요소가 인덱스에 따라 특별한 의미를 갖는경우
 – 앞서 배운 Replace Array with Object(220)를 사용다.
Replace Type Code with Class

 클래스의 동작에 영향을 미치지 않는 숫자로 된 타입코드
(numberic type code)가 있으면 숫자를 클래스로 바꿔라.
Replace Type Code with Class
       숫자로 된 타입코드를 클래스로 바꿔라.

• 동기


 – 타입코드나 열거형으로 만든 상징적 이름은 이해하기 쉽다.

 – BUT, 컴파일러에선 어차피 숫자형식으로 타입체크(그놈이그놈)

 – 따라서 버그 가능성 존재

 – 가독성도 좋고 강력한 타입체크를 할 수 있는 클래스로 바꾸자.
Replace Type Code with Class
       숫자로 된 타입코드를 클래스로 바꿔라.

• 절차
 – 기존코드
Replace Type Code with Class
       숫자로 된 타입코드를 클래스로 바꿔라.

• 절차
 – 타입 코드 위한 새로운 클

   래스 만든다.

   • 코드 필드

   • Get / Set 메소드

   • 적절한 static 메소드
Replace Type Code with Class
       숫자로 된 타입코드를 클래스로 바꿔라.

• 절차
 – 소스 클래스에서 새로만든 클래스 사용하도록 수정
    • 예전 코드의 인터페이스는 유지.
Replace Type Code with Class
       숫자로 된 타입코드를 클래스로 바꿔라.

• 절차
 – 소스 클래스에서 새로만든 클래스 사용하도록 수정
    • 새로만든 클래스를 사용하는 새로운 메소드 만듬
    • 인터페이스의 이름들도 변경하여 명확하게 만듬.
Replace Type Code with Class
       숫자로 된 타입코드를 클래스로 바꿔라.

• 절차
 – 클라이언트 코드에 새로운 인터페이스 적용




 – 기존의 정수를 사용하는 메소드, 생성자 상수를 모두제거
Replace Type Code with Class
       숫자로 된 타입코드를 클래스로 바꿔라.

• 절차
 – 기존의 정수를 사용하는 메소드, 생성자 상수를 모두제거
 – BloodGroup에서 코드를 사용하는 메소드를 Private

More Related Content

Similar to Refactoring

리펙토링 11장 p389_p400
리펙토링 11장 p389_p400리펙토링 11장 p389_p400
리펙토링 11장 p389_p400Heo Seungwook
 
[Dev rookie]designpattern
[Dev rookie]designpattern[Dev rookie]designpattern
[Dev rookie]designpattern대영 노
 
Cmake tutorial
Cmake tutorialCmake tutorial
Cmake tutorial상문 이
 
Devon 2011-b-5 효과적인 레거시 코드 다루기
Devon 2011-b-5 효과적인 레거시 코드 다루기Devon 2011-b-5 효과적인 레거시 코드 다루기
Devon 2011-b-5 효과적인 레거시 코드 다루기Daum DNA
 
디자인패턴 1~13
디자인패턴 1~13디자인패턴 1~13
디자인패턴 1~13Shin heemin
 
Head first디자인패턴 1~13_희민_호준
Head first디자인패턴 1~13_희민_호준Head first디자인패턴 1~13_희민_호준
Head first디자인패턴 1~13_희민_호준HoJun Sung
 
Xe 구조에 대한 이해
Xe 구조에 대한 이해Xe 구조에 대한 이해
Xe 구조에 대한 이해Dong Hyun Kim
 
디자인패턴
디자인패턴디자인패턴
디자인패턴진화 손
 
[스프링 스터디 1일차] 템플릿
[스프링 스터디 1일차] 템플릿[스프링 스터디 1일차] 템플릿
[스프링 스터디 1일차] 템플릿AnselmKim
 
SLiPP 서비스를 Java에서 Scala로 전환하면서 경험담
SLiPP 서비스를 Java에서 Scala로 전환하면서 경험담SLiPP 서비스를 Java에서 Scala로 전환하면서 경험담
SLiPP 서비스를 Java에서 Scala로 전환하면서 경험담Javajigi Jaesung
 
Refactoring tutorial
Refactoring tutorialRefactoring tutorial
Refactoring tutorialBingu Shim
 
헤드퍼스트 디자인패턴 - 데코레이터
헤드퍼스트 디자인패턴 - 데코레이터헤드퍼스트 디자인패턴 - 데코레이터
헤드퍼스트 디자인패턴 - 데코레이터진화 손
 
토비의 스프링 - DI
토비의 스프링 - DI토비의 스프링 - DI
토비의 스프링 - DIJU Chae
 
Java collections framework
Java collections frameworkJava collections framework
Java collections framework경주 전
 
Refactoring with Ruby (리펙토링 루비)
Refactoring with Ruby (리펙토링 루비)Refactoring with Ruby (리펙토링 루비)
Refactoring with Ruby (리펙토링 루비)hanstar17
 
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - OkHttp
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - OkHttp[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - OkHttp
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - OkHttpNAVER D2
 
Refactoring Tutorial 1주차[ Refactoring 개요]
Refactoring  Tutorial 1주차[ Refactoring 개요]Refactoring  Tutorial 1주차[ Refactoring 개요]
Refactoring Tutorial 1주차[ Refactoring 개요]Bingu Shim
 
Refactoring Tutorial 1주차[ Refactoring 개요]
Refactoring  Tutorial 1주차[ Refactoring 개요]Refactoring  Tutorial 1주차[ Refactoring 개요]
Refactoring Tutorial 1주차[ Refactoring 개요]Bingu Shim
 
[스프링 스터디 3일차] @MVC
[스프링 스터디 3일차] @MVC[스프링 스터디 3일차] @MVC
[스프링 스터디 3일차] @MVCAnselmKim
 

Similar to Refactoring (20)

리펙토링 11장 p389_p400
리펙토링 11장 p389_p400리펙토링 11장 p389_p400
리펙토링 11장 p389_p400
 
[Dev rookie]designpattern
[Dev rookie]designpattern[Dev rookie]designpattern
[Dev rookie]designpattern
 
Cmake tutorial
Cmake tutorialCmake tutorial
Cmake tutorial
 
06. decorator
06. decorator06. decorator
06. decorator
 
Devon 2011-b-5 효과적인 레거시 코드 다루기
Devon 2011-b-5 효과적인 레거시 코드 다루기Devon 2011-b-5 효과적인 레거시 코드 다루기
Devon 2011-b-5 효과적인 레거시 코드 다루기
 
디자인패턴 1~13
디자인패턴 1~13디자인패턴 1~13
디자인패턴 1~13
 
Head first디자인패턴 1~13_희민_호준
Head first디자인패턴 1~13_희민_호준Head first디자인패턴 1~13_희민_호준
Head first디자인패턴 1~13_희민_호준
 
Xe 구조에 대한 이해
Xe 구조에 대한 이해Xe 구조에 대한 이해
Xe 구조에 대한 이해
 
디자인패턴
디자인패턴디자인패턴
디자인패턴
 
[스프링 스터디 1일차] 템플릿
[스프링 스터디 1일차] 템플릿[스프링 스터디 1일차] 템플릿
[스프링 스터디 1일차] 템플릿
 
SLiPP 서비스를 Java에서 Scala로 전환하면서 경험담
SLiPP 서비스를 Java에서 Scala로 전환하면서 경험담SLiPP 서비스를 Java에서 Scala로 전환하면서 경험담
SLiPP 서비스를 Java에서 Scala로 전환하면서 경험담
 
Refactoring tutorial
Refactoring tutorialRefactoring tutorial
Refactoring tutorial
 
헤드퍼스트 디자인패턴 - 데코레이터
헤드퍼스트 디자인패턴 - 데코레이터헤드퍼스트 디자인패턴 - 데코레이터
헤드퍼스트 디자인패턴 - 데코레이터
 
토비의 스프링 - DI
토비의 스프링 - DI토비의 스프링 - DI
토비의 스프링 - DI
 
Java collections framework
Java collections frameworkJava collections framework
Java collections framework
 
Refactoring with Ruby (리펙토링 루비)
Refactoring with Ruby (리펙토링 루비)Refactoring with Ruby (리펙토링 루비)
Refactoring with Ruby (리펙토링 루비)
 
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - OkHttp
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - OkHttp[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - OkHttp
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - OkHttp
 
Refactoring Tutorial 1주차[ Refactoring 개요]
Refactoring  Tutorial 1주차[ Refactoring 개요]Refactoring  Tutorial 1주차[ Refactoring 개요]
Refactoring Tutorial 1주차[ Refactoring 개요]
 
Refactoring Tutorial 1주차[ Refactoring 개요]
Refactoring  Tutorial 1주차[ Refactoring 개요]Refactoring  Tutorial 1주차[ Refactoring 개요]
Refactoring Tutorial 1주차[ Refactoring 개요]
 
[스프링 스터디 3일차] @MVC
[스프링 스터디 3일차] @MVC[스프링 스터디 3일차] @MVC
[스프링 스터디 3일차] @MVC
 

Refactoring

  • 1. Refactoring -Encapsulate Collection -Replace Record with Data Class -Replace Type Code with Class 아꿈사 http://cafe.naver.com/architect1 김용락 http://blog.naver.com/subhill
  • 2. Encapsulate Collection 컬랙션(Collection)을 리턴하는 메소드가 있으면, 그 메소드가 read-only View를 리턴하도록 만들 고, add/remove 메소드를 제공하라.
  • 3. Encapsulate Collection 컬랙션을 리턴하는 메소드를 read-only View를 리턴하도록 만들고, add/remove 메소드를 제공하라. • 동기 – 컬랙션(컨테이너)를 포함하고 있는 클래스 에서 종종 그 컬랙션에 대해 직접적으로 get/set 메소드를 가지고 있는 경우에 컬랙션은 약간 다른 프로토콜을 사용해야 한다. • 이유 – 클라이언트코드가 컬랙션을 가지고 있는 클래스가 알지 못하는 사이에 컬렉션의 내용을 조작할 수 있기 때문. – 객체의 내부 데이터 구조를 너무 많이 드러나기 때문. – 컬랙션에 대해 set 메소드가 있으면 안됨 – set대신 element를 add/remove하는 operation을 추가. – 이런 프로토콜로 컬랙션을 적절히 캡슐화, 클라이언트코드와 클래스의 결합을 줄일 수 있다.
  • 4. Encapsulate Collection 컬랙션을 리턴하는 메소드를 read-only View를 리턴하도록 만들고, add/remove 메소드를 제공하라. • 절차 – 기존 코드 -메인부분
  • 5. Encapsulate Collection 컬랙션을 리턴하는 메소드를 read-only View를 리턴하도록 만들고, add/remove 메소드를 제공하라. • 절차 – 컬랙션에 대해 적절한 수정자를 만든다 add / remove
  • 6. Encapsulate Collection 컬랙션을 리턴하는 메소드를 read-only View를 리턴하도록 만들고, add/remove 메소드를 제공하라. • 절차 – set 메소드 몸체를 수정한다.
  • 7. Encapsulate Collection 컬랙션을 리턴하는 메소드를 read-only View를 리턴하도록 만들고, add/remove 메소드를 제공하라. • 절차 – set 메소드 사용하는것을 add/remove를 사용하도록 바꾼다 – get 메소드를 통해 내부의 컬랙션 수정하는것을 찾아 수정. – get 메소드가 수정불가능한 뷰를 리턴하게 바꾸어 get검사
  • 8. Encapsulate Collection 컬랙션을 리턴하는 메소드를 read-only View를 리턴하도록 만들고, add/remove 메소드를 제공하라. • 절차 – 동작을 적절한 위치로 옮기기
  • 9. Encapsulate Collection 컬랙션을 리턴하는 메소드를 read-only View를 리턴하도록 만들고, add/remove 메소드를 제공하라. • 절차 – 기타의 동작 수정
  • 10. Encapsulate Collection 컬랙션을 리턴하는 메소드를 read-only View를 리턴하도록 만들고, add/remove 메소드를 제공하라. • 배열의 캡슐화 – 기존 코드 – 수정자 제공 – 배열 저체값 설정 오퍼레이션 추가
  • 11. Encapsulate Collection 컬랙션을 리턴하는 메소드를 read-only View를 리턴하도록 만들고, add/remove 메소드를 제공하라. • 배열의 캡슐화 – 기존 get 수정 – 기존 코드 모두 변경했으면 get 이 복사본 리턴하도록 수정. – 이제 배열을 List로 바꾸자.
  • 12. Replace Record with Data Class 전통적인 프로그래밍 환경에서의 레코드 구조에 대한 인터페이 스가 필요한 경우, 그 레코드를 위한 데이터 객체를 만들라.
  • 13. Replace Record with Data Class 전통적인 프로그래밍 환경에서의 레코드 구조에 대한 인터페이 스가 필요한 경우, 그 레코드를 위한 데이터 객체를 만들라. • 동기 – 전통적인 레코드 구조를 인터페이스를 통해 제어하고자 할 때 • 절차 – 레코드를 표현할 클래스 만든다. – 캡슐화 한다 (private 필드로 추가, get/set method 추가) • 배열의 요소가 인덱스에 따라 특별한 의미를 갖는경우 – 앞서 배운 Replace Array with Object(220)를 사용다.
  • 14. Replace Type Code with Class 클래스의 동작에 영향을 미치지 않는 숫자로 된 타입코드 (numberic type code)가 있으면 숫자를 클래스로 바꿔라.
  • 15. Replace Type Code with Class 숫자로 된 타입코드를 클래스로 바꿔라. • 동기 – 타입코드나 열거형으로 만든 상징적 이름은 이해하기 쉽다. – BUT, 컴파일러에선 어차피 숫자형식으로 타입체크(그놈이그놈) – 따라서 버그 가능성 존재 – 가독성도 좋고 강력한 타입체크를 할 수 있는 클래스로 바꾸자.
  • 16. Replace Type Code with Class 숫자로 된 타입코드를 클래스로 바꿔라. • 절차 – 기존코드
  • 17. Replace Type Code with Class 숫자로 된 타입코드를 클래스로 바꿔라. • 절차 – 타입 코드 위한 새로운 클 래스 만든다. • 코드 필드 • Get / Set 메소드 • 적절한 static 메소드
  • 18. Replace Type Code with Class 숫자로 된 타입코드를 클래스로 바꿔라. • 절차 – 소스 클래스에서 새로만든 클래스 사용하도록 수정 • 예전 코드의 인터페이스는 유지.
  • 19. Replace Type Code with Class 숫자로 된 타입코드를 클래스로 바꿔라. • 절차 – 소스 클래스에서 새로만든 클래스 사용하도록 수정 • 새로만든 클래스를 사용하는 새로운 메소드 만듬 • 인터페이스의 이름들도 변경하여 명확하게 만듬.
  • 20. Replace Type Code with Class 숫자로 된 타입코드를 클래스로 바꿔라. • 절차 – 클라이언트 코드에 새로운 인터페이스 적용 – 기존의 정수를 사용하는 메소드, 생성자 상수를 모두제거
  • 21. Replace Type Code with Class 숫자로 된 타입코드를 클래스로 바꿔라. • 절차 – 기존의 정수를 사용하는 메소드, 생성자 상수를 모두제거 – BloodGroup에서 코드를 사용하는 메소드를 Private