13
Refactoring 리리리리 8리 - Change Bidirectional Association to Unidirection - Replace Magic Number with Symbolic Constant - Encapsulate Field 아아아 http://cafe.naver.com/architect1 TTF http://www.npteam.net

리펙토링 8장 p236_p243

Embed Size (px)

Citation preview

Page 1: 리펙토링 8장 p236_p243

Refactoring 리팩토링

8 장 - Change Bidirectional Association to Unidirectional - Replace Magic Number with Symbolic Constant - Encapsulate Field

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

Page 2: 리펙토링 8장 p236_p243

Change Bidirectional Association to Unidirectional

■ 양방향 연관 관계를 단반향으로 변경하기 - 서로 링크를 가지는 두개의 클래스에서 한 쪽이 다른 한쪽을 더 이상 필요로 하지 않을 때는 불필요한 링크를 제거하라 .

* 1

* 1

Page 3: 리펙토링 8장 p236_p243

Change Bidirectional Association to Unidirectional

■ 동기 - 양방향 연관 (association) 은 편리하다 . - 그러나 비용이 따른다 . ( 양방향 링크 확인 비용 )

■ 양방향 링크에서 발생하는 문제점 - 참조 관계가 제대로 클리어 되지 않아서 좀비 객체의 발생 가능성이 있다 . - 상호 종속성으로 인하여 결합도가 증가한다 .

불필요한 양방향 링크의 한쪽 링크를 끊어라 .

Page 4: 리펙토링 8장 p236_p243

Change Bidirectional Association to Unidirectional

■ 절차 - 삭제할 포인터가 참조되는 곳을 조사한다 .

- 삭제가 가능한지 확인한다 .

- get 메소드를 사용해야 할 경우 . Self Encapsulate Field 와 Substitute Algorithm 을 적용한 후 테스트한다 .

- get 메소드를 사용하지 않을 경우 . 포인터 대신 다른 방법으로 객체를 얻을 수 있도록 적용한 후 컴파일 / 테스트한다 .

Page 5: 리펙토링 8장 p236_p243

Change Bidirectional Association to Unidirectional■ 절차 - 필드를 업데이트 하는 코드를 제거한다 . Set 메소드를 이용하여 업데이트 하는 코드를 Set 메소드를 호출하도록 변경한다 .

Set 메소드를 빈 메소드로 만든다 .

컴파일 후 이상이 없으면 모두 삭제한다 .

- 컴파일 , 테스트한다 .

Page 6: 리펙토링 8장 p236_p243

Change Bidirectional Association to Unidirectional

■ 리팩토링 - 리팩토링에서 가장 어려운 것 리팩토링이 가능한지 확인하는 것이다 .

- 리팩토링이 가능한지 확인하고 나면 , 안전하고 쉽게 리팩토링 할 수 있다 .

- 리팩토링 하는 방법은 여러가지가 있으므로 다양한 관점에서 바라보고 처리한다 . 예 ) 포인터로 접근하는 대신 객체를 파라미터로 전달하는 방법 .

Page 7: 리펙토링 8장 p236_p243

Replace Magic Number with Symbolic Constant■ 특별한 의미를 가진 숫자는 상수로 만들어라 .

Page 8: 리펙토링 8장 p236_p243

Replace Magic Number with Symbolic Constant■ 동기 - 매직 넘버 (magic number) 는 프로그래밍의 가장 오래된 해악 가운데 하나이다 . 값을 바꾸기 어렵다 . 의미를 이해하기 어렵다 . 여러 곳에서 사용하는 경우에 문제가 많다 .

- 상수를 사용하면 좋은 점 퍼포먼스에 영향을 주지 않는다 . 코드 가독성이 엄청나게 향상된다 .

Page 9: 리펙토링 8장 p236_p243

Replace Magic Number with Symbolic Constant■ 절차 - 상수를 선언하고 매직 넘버를 설정한다 . - 매직 넘버가 사용되는 곳을 모두 찾는다 . - 매직 넘버를 상수로 치환 가능한지 판단하고 , 매직 넘버를 상수로 바꾼다 . - 컴파일 한다 . - 위와 같은 방식으로 모든 매직 넘버를 바꾼 후 컴파일 및 테스트를 한다 . 모든 동작이 바뀌기 전과 동일해야 한다 .

Page 10: 리펙토링 8장 p236_p243

Encapsulate Field■ Public 필드를 Private 으로 만들고 , 접근자를 제공하라 .

Page 11: 리펙토링 8장 p236_p243

Encapsulate Field■ 동기 - 객체지향의 중요한 교리 ! 캡슐화 (encapsulation) 데이터 은폐 (data hiding)

- 데이터를 절대로 public 로 하지 마라 ! 알지 못하는 사이에 다른 객체가 데이터의 값을 변경 / 수정 할 수 있다 .

- Encapsulate Field 는 첫 걸음이다 ! 접근자만으로는 장점이 없다 . Move Method 를 이용할 메소드가 있는지 확인한다 .

Page 12: 리펙토링 8장 p236_p243

Encapsulate Field■ 절차 - 필드에 대한 get/set 메소드를 만든다 .

- 필드에 접근하는 모든 코드를 찾는다 . 값에 대한 참조는 get 메소드로 바꾼다 . 값을 변경하면 set 메소드로 바꾼다 .

- 코드를 수정하고 컴파일 및 테스트를 한다 .

- 필드에 접근하는 모든 코드를 수정했으면 , 필드를 private 으로 만든다 .

- 컴파일 및 테스트를 한다 .

Page 13: 리펙토링 8장 p236_p243

감사합니다 .