1. Refactoring
-Encapsulate Collection
-Replace Record with Data Class
-Replace Type Code with Class
아꿈사 http://cafe.naver.com/architect1
김용락 http://blog.naver.com/subhill
3. Encapsulate Collection
컬랙션을 리턴하는 메소드를 read-only View를 리턴하도록
만들고, add/remove 메소드를 제공하라.
• 동기
– 컬랙션(컨테이너)를 포함하고 있는 클래스 에서 종종 그 컬랙션에
대해 직접적으로 get/set 메소드를 가지고 있는 경우에
컬랙션은 약간 다른 프로토콜을 사용해야 한다.
• 이유
– 클라이언트코드가 컬랙션을 가지고 있는 클래스가 알지 못하는
사이에 컬렉션의 내용을 조작할 수 있기 때문.
– 객체의 내부 데이터 구조를 너무 많이 드러나기 때문.
– 컬랙션에 대해 set 메소드가 있으면 안됨
– set대신 element를 add/remove하는 operation을 추가.
– 이런 프로토콜로 컬랙션을 적절히 캡슐화, 클라이언트코드와
클래스의 결합을 줄일 수 있다.
7. Encapsulate Collection
컬랙션을 리턴하는 메소드를 read-only View를 리턴하도록
만들고, add/remove 메소드를 제공하라.
• 절차
– set 메소드 사용하는것을 add/remove를 사용하도록 바꾼다
– get 메소드를 통해 내부의 컬랙션 수정하는것을 찾아 수정.
– get 메소드가 수정불가능한 뷰를 리턴하게 바꾸어 get검사
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, 컴파일러에선 어차피 숫자형식으로 타입체크(그놈이그놈)
– 따라서 버그 가능성 존재
– 가독성도 좋고 강력한 타입체크를 할 수 있는 클래스로 바꾸자.