Refactoring

21
Refactoring -Encapsulate Collection -Replace Record with Data Class -Replace Type Code with Class 아아아 http://cafe.naver.com/architect1 아아아 http://blog.naver.com/subhill

description

refactoring

Transcript of Refactoring

Page 1: Refactoring

Refactoring

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

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

Page 2: Refactoring

Encapsulate Collection

컬랙션 (Collection) 을 리턴하는 메소드가 있으면 ,그 메소드가 read-only View 를 리턴하도록 만들고 ,

add/remove 메소드를 제공하라 .

Page 3: Refactoring

Encapsulate Collection컬랙션을 리턴하는 메소드를 read-only View 를

리턴하도록 만들고 , add/remove 메소드를 제공하라 .

• 동기– 컬랙션 ( 컨테이너 ) 를 포함하고 있는 클래스 에서 종종 그

컬랙션에 대해 직접적으로 get/set 메소드를 가지고 있는 경우에컬랙션은 약간 다른 프로토콜을 사용해야 한다 .

• 이유– 클라이언트코드가 컬랙션을 가지고 있는 클래스가 알지 못하는

사이에 컬렉션의 내용을 조작할 수 있기 때문 .– 객체의 내부 데이터 구조를 너무 많이 드러나기 때문 .– 컬랙션에 대해 set 메소드가 있으면 안됨– set 대신 element 를 add/remove 하는 operation 을 추가 .– 이런 프로토콜로 컬랙션을 적절히 캡슐화 , 클라이언트코드와

클래스의 결합을 줄일 수 있다 .

Page 4: Refactoring

Encapsulate Collection컬랙션을 리턴하는 메소드를 read-only View 를

리턴하도록 만들고 , add/remove 메소드를 제공하라 .

• 절차– 기존 코드 - 메인부분

Page 5: Refactoring

Encapsulate Collection컬랙션을 리턴하는 메소드를 read-only View 를

리턴하도록 만들고 , add/remove 메소드를 제공하라 .

• 절차– 컬랙션에 대해 적절한 수정자를 만든다 add / remove

Page 6: Refactoring

Encapsulate Collection컬랙션을 리턴하는 메소드를 read-only View 를

리턴하도록 만들고 , add/remove 메소드를 제공하라 .

• 절차– set 메소드 몸체를 수정한다 .

Page 7: Refactoring

Encapsulate Collection컬랙션을 리턴하는 메소드를 read-only View 를

리턴하도록 만들고 , add/remove 메소드를 제공하라 .

• 절차– set 메소드 사용하는것을 add/remove 를 사용하도록 바꾼다

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

– get 메소드가 수정불가능한 뷰를 리턴하게 바꾸어 get 검사

Page 8: Refactoring

Encapsulate Collection컬랙션을 리턴하는 메소드를 read-only View 를

리턴하도록 만들고 , add/remove 메소드를 제공하라 .

• 절차– 동작을 적절한 위치로 옮기기

Page 9: Refactoring

Encapsulate Collection컬랙션을 리턴하는 메소드를 read-only View 를

리턴하도록 만들고 , add/remove 메소드를 제공하라 .

• 절차– 기타의 동작 수정

Page 10: Refactoring

Encapsulate Collection컬랙션을 리턴하는 메소드를 read-only View 를

리턴하도록 만들고 , add/remove 메소드를 제공하라 .

• 배열의 캡슐화– 기존 코드

– 수정자 제공

– 배열 저체값 설정 오퍼레이션 추가

Page 11: Refactoring

Encapsulate Collection컬랙션을 리턴하는 메소드를 read-only View 를

리턴하도록 만들고 , add/remove 메소드를 제공하라 .

• 배열의 캡슐화– 기존 get 수정

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

– 이제 배열을 List 로 바꾸자 .

Page 12: Refactoring

Replace Record with Data Class

전통적인 프로그래밍 환경에서의 레코드 구조에 대한 인터페이스가 필요한 경우 , 그 레코드를 위한 데이터 객체를

만들라 .

Page 13: Refactoring

Replace Record with Data Class

• 동기– 전통적인 레코드 구조를 인터페이스를 통해 제어하고자 할 때

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

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

전통적인 프로그래밍 환경에서의 레코드 구조에 대한 인터페이스가 필요한 경우 , 그 레코드를 위한 데이터 객체를

만들라 .

Page 14: Refactoring

Replace Type Code with Class

클래스의 동작에 영향을 미치지 않는 숫자로 된 타입코드(numberic type code) 가 있으면 숫자를 클래스로

바꿔라 .

Page 15: Refactoring

• 동기

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

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

– 따라서 버그 가능성 존재

– 가독성도 좋고 강력한 타입체크를 할 수 있는 클래스로 바꾸자 .

Replace Type Code with Class숫자로 된 타입코드를 클래스로 바꿔라 .

Page 16: Refactoring

Replace Type Code with Class

• 절차

– 기존코드

숫자로 된 타입코드를 클래스로 바꿔라 .

Page 17: Refactoring

Replace Type Code with Class

• 절차

– 타입 코드 위한 새로운

클래스 만든다 .

• 코드 필드

• Get / Set 메소드

• 적절한 static

메소드

숫자로 된 타입코드를 클래스로 바꿔라 .

Page 18: Refactoring

Replace Type Code with Class

• 절차– 소스 클래스에서 새로만든 클래스 사용하도록 수정

• 예전 코드의 인터페이스는 유지 .

숫자로 된 타입코드를 클래스로 바꿔라 .

Page 19: Refactoring

Replace Type Code with Class

• 절차– 소스 클래스에서 새로만든 클래스 사용하도록 수정

• 새로만든 클래스를 사용하는 새로운 메소드 만듬• 인터페이스의 이름들도 변경하여 명확하게 만듬 .

숫자로 된 타입코드를 클래스로 바꿔라 .

Page 20: Refactoring

Replace Type Code with Class

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

– 기존의 정수를 사용하는 메소드 , 생성자 상수를 모두제거

숫자로 된 타입코드를 클래스로 바꿔라 .

Page 21: Refactoring

Replace Type Code with Class

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

숫자로 된 타입코드를 클래스로 바꿔라 .