SlideShare una empresa de Scribd logo
1 de 13
Refactoring 리팩토링 8장  - Change Bidirectional Association to Unidirectional - Replace Magic Number  with Symbolic Constant - Encapsulate Field 아꿈사http://cafe.naver.com/architect1 TTF	http://www.npteam.net
Change Bidirectional            Association to Unidirectional ■ 양방향 연관 관계를 단반향으로 변경하기  - 서로 링크를 가지는 두개의 클래스에서 한 쪽이 다른 한쪽을 더 이상 필요로 하지 않을 때는 불필요한 링크를 제거하라. * * 1 1
Change Bidirectional            Association to Unidirectional ■ 동기   - 양방향 연관(association)은 편리하다.   - 그러나 비용이 따른다.     (양방향 링크 확인 비용) ■ 양방향 링크에서 발생하는 문제점  - 참조 관계가 제대로 클리어 되지 않아서좀비 객체의 발생 가능성이 있다.   - 상호 종속성으로 인하여 결합도가 증가한다. 불필요한 양방향 링크의 한쪽 링크를 끊어라.
Change Bidirectional            Association to Unidirectional ■ 절차   - 삭제할 포인터가 참조되는 곳을 조사한다.   - 삭제가 가능한지 확인한다.   - get 메소드를 사용해야 할 경우.    Self Encapsulate Field와    Substitute Algorithm을 적용한 후 테스트한다.   - get 메소드를 사용하지 않을 경우. 포인터 대신 다른 방법으로 객체를 얻을 수 있도록 적용한 후 컴파일/테스트한다.
Change Bidirectional            Association to Unidirectional ■ 절차   - 필드를 업데이트 하는 코드를 제거한다.    Set 메소드를 이용하여 업데이트 하는 코드를    Set 메소드를 호출하도록 변경한다.     Set 메소드를 빈 메소드로 만든다. 컴파일 후 이상이 없으면 모두 삭제한다.   - 컴파일, 테스트한다.
Change Bidirectional            Association to Unidirectional ■ 리팩토링   - 리팩토링에서 가장 어려운 것 리팩토링이가능한지 확인하는 것이다.   - 리팩토링이 가능한지 확인하고 나면, 안전하고 쉽게 리팩토링 할 수 있다.   - 리팩토링 하는 방법은 여러가지가 있으므로 다양한 관점에서 바라보고 처리한다. 예) 포인터로 접근하는 대신 객체를 파라미터로전달하는 방법.
Replace Magic Number               with Symbolic Constant ■ 특별한 의미를 가진 숫자는 상수로 만들어라.
Replace Magic Number               with Symbolic Constant ■ 동기  - 매직 넘버(magic number)는 프로그래밍의 가장 오래된 해악 가운데 하나이다.  값을 바꾸기 어렵다.  의미를 이해하기 어렵다.      여러 곳에서 사용하는 경우에 문제가 많다.   - 상수를 사용하면 좋은 점     퍼포먼스에 영향을 주지 않는다.     코드 가독성이 엄청나게 향상된다.
Replace Magic Number               with Symbolic Constant ■ 절차  - 상수를 선언하고매직 넘버를 설정한다. - 매직 넘버가 사용되는 곳을 모두 찾는다.   - 매직 넘버를 상수로 치환 가능한지 판단하고, 매직 넘버를 상수로 바꾼다.   - 컴파일 한다.  - 위와 같은 방식으로 모든 매직 넘버를 바꾼 후 컴파일 및 테스트를 한다.  모든 동작이 바뀌기 전과 동일해야 한다.
Encapsulate Field ■ Public 필드를 Private으로 만들고, 접근자를 제공하라.
Encapsulate Field ■ 동기 - 객체지향의 중요한 교리!  캡슐화(encapsulation)     데이터 은폐(data hiding)  - 데이터를 절대로 public로 하지 마라!     알지 못하는 사이에 다른 객체가 데이터의 값을 변경/수정 할 수 있다.   - Encapsulate Field는 첫 걸음이다!     접근자만으로는 장점이 없다.     Move Method를 이용할 메소드가 있는지  확인한다.
Encapsulate Field ■ 절차 - 필드에 대한 get/set 메소드를 만든다.   - 필드에 접근하는 모든 코드를 찾는다.      값에 대한 참조는 get 메소드로 바꾼다.      값을 변경하면 set 메소드로 바꾼다.   - 코드를 수정하고 컴파일및 테스트를 한다.  - 필드에 접근하는 모든 코드를 수정했으면, 필드를 private으로 만든다.  - 컴파일 및 테스트를 한다.
감사합니다.

Más contenido relacionado

Similar a 리펙토링 8장 p236_p243

Refactoring tutorial
Refactoring tutorialRefactoring tutorial
Refactoring tutorial
Bingu Shim
 
리펙토링 10장 p316_p324
리펙토링 10장 p316_p324리펙토링 10장 p316_p324
리펙토링 10장 p316_p324
Heo Seungwook
 
3팀_객체지향 프로그래밍.pptx
3팀_객체지향 프로그래밍.pptx3팀_객체지향 프로그래밍.pptx
3팀_객체지향 프로그래밍.pptx
ssuser642b19
 
아꿈사 DDD(Domain-Driven Design) 5장 소프트웨어에서 표현되는 모델
아꿈사 DDD(Domain-Driven Design) 5장 소프트웨어에서 표현되는 모델아꿈사 DDD(Domain-Driven Design) 5장 소프트웨어에서 표현되는 모델
아꿈사 DDD(Domain-Driven Design) 5장 소프트웨어에서 표현되는 모델
명환 안
 
도메인 객체의 생명주기
도메인 객체의 생명주기도메인 객체의 생명주기
도메인 객체의 생명주기
ukjinkwoun
 

Similar a 리펙토링 8장 p236_p243 (19)

20150305 스마트한 데이터모델링 with ER/Studio
20150305 스마트한 데이터모델링 with ER/Studio20150305 스마트한 데이터모델링 with ER/Studio
20150305 스마트한 데이터모델링 with ER/Studio
 
Refactoring tutorial 1주차[refactoring 개요]
Refactoring tutorial 1주차[refactoring 개요]Refactoring tutorial 1주차[refactoring 개요]
Refactoring tutorial 1주차[refactoring 개요]
 
DevRookie 리펙터링.pptx
DevRookie 리펙터링.pptxDevRookie 리펙터링.pptx
DevRookie 리펙터링.pptx
 
effective c++ chapter 3~4 정리
effective c++ chapter 3~4 정리effective c++ chapter 3~4 정리
effective c++ chapter 3~4 정리
 
Refactoring tutorial
Refactoring tutorialRefactoring tutorial
Refactoring tutorial
 
리펙토링 10장 p316_p324
리펙토링 10장 p316_p324리펙토링 10장 p316_p324
리펙토링 10장 p316_p324
 
객체지향 프로그래밍.pptx
객체지향 프로그래밍.pptx객체지향 프로그래밍.pptx
객체지향 프로그래밍.pptx
 
Javascript refactoring workshop
Javascript refactoring workshopJavascript refactoring workshop
Javascript refactoring workshop
 
3팀_객체지향 프로그래밍.pptx
3팀_객체지향 프로그래밍.pptx3팀_객체지향 프로그래밍.pptx
3팀_객체지향 프로그래밍.pptx
 
dbt 101
dbt 101dbt 101
dbt 101
 
디자인패턴 1~13
디자인패턴 1~13디자인패턴 1~13
디자인패턴 1~13
 
Head first디자인패턴 1~13_희민_호준
Head first디자인패턴 1~13_희민_호준Head first디자인패턴 1~13_희민_호준
Head first디자인패턴 1~13_희민_호준
 
Object-Oriented Programming.pptx
 Object-Oriented Programming.pptx Object-Oriented Programming.pptx
Object-Oriented Programming.pptx
 
4팀_객체지향 프로그래밍.pptx
4팀_객체지향 프로그래밍.pptx4팀_객체지향 프로그래밍.pptx
4팀_객체지향 프로그래밍.pptx
 
객체지향 프로그래밍.pptx
객체지향 프로그래밍.pptx객체지향 프로그래밍.pptx
객체지향 프로그래밍.pptx
 
Event Storming(이벤트 스토밍)
Event Storming(이벤트 스토밍)Event Storming(이벤트 스토밍)
Event Storming(이벤트 스토밍)
 
아꿈사 DDD(Domain-Driven Design) 5장 소프트웨어에서 표현되는 모델
아꿈사 DDD(Domain-Driven Design) 5장 소프트웨어에서 표현되는 모델아꿈사 DDD(Domain-Driven Design) 5장 소프트웨어에서 표현되는 모델
아꿈사 DDD(Domain-Driven Design) 5장 소프트웨어에서 표현되는 모델
 
DDD start 1장
DDD start 1장DDD start 1장
DDD start 1장
 
도메인 객체의 생명주기
도메인 객체의 생명주기도메인 객체의 생명주기
도메인 객체의 생명주기
 

Más de Heo Seungwook

리팩토링 10장 p357_p369
리팩토링 10장 p357_p369리팩토링 10장 p357_p369
리팩토링 10장 p357_p369
Heo Seungwook
 
리펙토링 11장 p389_p400
리펙토링 11장 p389_p400리펙토링 11장 p389_p400
리펙토링 11장 p389_p400
Heo 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
 
Cruise control net_and_terminal_with_gamedev
Cruise control net_and_terminal_with_gamedevCruise control net_and_terminal_with_gamedev
Cruise control net_and_terminal_with_gamedev
Heo Seungwook
 
리펙토링 6장 p147_p158
리펙토링 6장 p147_p158리펙토링 6장 p147_p158
리펙토링 6장 p147_p158
Heo Seungwook
 
리펙토링 4장 테스트만들기
리펙토링 4장 테스트만들기리펙토링 4장 테스트만들기
리펙토링 4장 테스트만들기
Heo Seungwook
 
2010 연말행사 온라인스터디
2010 연말행사 온라인스터디2010 연말행사 온라인스터디
2010 연말행사 온라인스터디
Heo Seungwook
 
Client dispatcher server_pattern
Client dispatcher server_patternClient dispatcher server_pattern
Client dispatcher server_pattern
Heo Seungwook
 
Master slave pattern
Master slave patternMaster slave pattern
Master slave pattern
Heo Seungwook
 
프로그램은 왜 실패하는가
프로그램은 왜 실패하는가프로그램은 왜 실패하는가
프로그램은 왜 실패하는가
Heo Seungwook
 

Más de Heo Seungwook (15)

리팩토링 10장 p357_p369
리팩토링 10장 p357_p369리팩토링 10장 p357_p369
리팩토링 10장 p357_p369
 
리펙토링 11장 p389_p400
리펙토링 11장 p389_p400리펙토링 11장 p389_p400
리펙토링 11장 p389_p400
 
Ipv6 소켓프로그래밍
Ipv6 소켓프로그래밍Ipv6 소켓프로그래밍
Ipv6 소켓프로그래밍
 
해외취업이야기
해외취업이야기해외취업이야기
해외취업이야기
 
C++ 프로젝트에 단위 테스트 도입하기
C++ 프로젝트에 단위 테스트 도입하기C++ 프로젝트에 단위 테스트 도입하기
C++ 프로젝트에 단위 테스트 도입하기
 
MS SharePoint를 활용한 개발환경 구축
MS SharePoint를 활용한 개발환경 구축MS SharePoint를 활용한 개발환경 구축
MS SharePoint를 활용한 개발환경 구축
 
Cruise control net_and_terminal_with_gamedev
Cruise control net_and_terminal_with_gamedevCruise control net_and_terminal_with_gamedev
Cruise control net_and_terminal_with_gamedev
 
리펙토링 6장 p147_p158
리펙토링 6장 p147_p158리펙토링 6장 p147_p158
리펙토링 6장 p147_p158
 
리펙토링 4장 테스트만들기
리펙토링 4장 테스트만들기리펙토링 4장 테스트만들기
리펙토링 4장 테스트만들기
 
2010 연말행사 온라인스터디
2010 연말행사 온라인스터디2010 연말행사 온라인스터디
2010 연말행사 온라인스터디
 
Client dispatcher server_pattern
Client dispatcher server_patternClient dispatcher server_pattern
Client dispatcher server_pattern
 
Master slave pattern
Master slave patternMaster slave pattern
Master slave pattern
 
Pac pattern
Pac patternPac pattern
Pac pattern
 
Mvc pattern
Mvc patternMvc pattern
Mvc pattern
 
프로그램은 왜 실패하는가
프로그램은 왜 실패하는가프로그램은 왜 실패하는가
프로그램은 왜 실패하는가
 

리펙토링 8장 p236_p243

  • 1. Refactoring 리팩토링 8장 - Change Bidirectional Association to Unidirectional - Replace Magic Number with Symbolic Constant - Encapsulate Field 아꿈사http://cafe.naver.com/architect1 TTF http://www.npteam.net
  • 2. Change Bidirectional Association to Unidirectional ■ 양방향 연관 관계를 단반향으로 변경하기 - 서로 링크를 가지는 두개의 클래스에서 한 쪽이 다른 한쪽을 더 이상 필요로 하지 않을 때는 불필요한 링크를 제거하라. * * 1 1
  • 3. Change Bidirectional Association to Unidirectional ■ 동기 - 양방향 연관(association)은 편리하다. - 그러나 비용이 따른다. (양방향 링크 확인 비용) ■ 양방향 링크에서 발생하는 문제점 - 참조 관계가 제대로 클리어 되지 않아서좀비 객체의 발생 가능성이 있다. - 상호 종속성으로 인하여 결합도가 증가한다. 불필요한 양방향 링크의 한쪽 링크를 끊어라.
  • 4. Change Bidirectional Association to Unidirectional ■ 절차 - 삭제할 포인터가 참조되는 곳을 조사한다. - 삭제가 가능한지 확인한다. - get 메소드를 사용해야 할 경우. Self Encapsulate Field와 Substitute Algorithm을 적용한 후 테스트한다. - get 메소드를 사용하지 않을 경우. 포인터 대신 다른 방법으로 객체를 얻을 수 있도록 적용한 후 컴파일/테스트한다.
  • 5. Change Bidirectional Association to Unidirectional ■ 절차 - 필드를 업데이트 하는 코드를 제거한다. Set 메소드를 이용하여 업데이트 하는 코드를 Set 메소드를 호출하도록 변경한다. Set 메소드를 빈 메소드로 만든다. 컴파일 후 이상이 없으면 모두 삭제한다. - 컴파일, 테스트한다.
  • 6. Change Bidirectional Association to Unidirectional ■ 리팩토링 - 리팩토링에서 가장 어려운 것 리팩토링이가능한지 확인하는 것이다. - 리팩토링이 가능한지 확인하고 나면, 안전하고 쉽게 리팩토링 할 수 있다. - 리팩토링 하는 방법은 여러가지가 있으므로 다양한 관점에서 바라보고 처리한다. 예) 포인터로 접근하는 대신 객체를 파라미터로전달하는 방법.
  • 7. Replace Magic Number with Symbolic Constant ■ 특별한 의미를 가진 숫자는 상수로 만들어라.
  • 8. Replace Magic Number with Symbolic Constant ■ 동기 - 매직 넘버(magic number)는 프로그래밍의 가장 오래된 해악 가운데 하나이다.  값을 바꾸기 어렵다.  의미를 이해하기 어렵다.  여러 곳에서 사용하는 경우에 문제가 많다. - 상수를 사용하면 좋은 점  퍼포먼스에 영향을 주지 않는다.  코드 가독성이 엄청나게 향상된다.
  • 9. Replace Magic Number with Symbolic Constant ■ 절차 - 상수를 선언하고매직 넘버를 설정한다. - 매직 넘버가 사용되는 곳을 모두 찾는다. - 매직 넘버를 상수로 치환 가능한지 판단하고, 매직 넘버를 상수로 바꾼다. - 컴파일 한다. - 위와 같은 방식으로 모든 매직 넘버를 바꾼 후 컴파일 및 테스트를 한다.  모든 동작이 바뀌기 전과 동일해야 한다.
  • 10. Encapsulate Field ■ Public 필드를 Private으로 만들고, 접근자를 제공하라.
  • 11. Encapsulate Field ■ 동기 - 객체지향의 중요한 교리!  캡슐화(encapsulation)  데이터 은폐(data hiding) - 데이터를 절대로 public로 하지 마라!  알지 못하는 사이에 다른 객체가 데이터의 값을 변경/수정 할 수 있다. - Encapsulate Field는 첫 걸음이다!  접근자만으로는 장점이 없다.  Move Method를 이용할 메소드가 있는지 확인한다.
  • 12. Encapsulate Field ■ 절차 - 필드에 대한 get/set 메소드를 만든다. - 필드에 접근하는 모든 코드를 찾는다.  값에 대한 참조는 get 메소드로 바꾼다.  값을 변경하면 set 메소드로 바꾼다. - 코드를 수정하고 컴파일및 테스트를 한다. - 필드에 접근하는 모든 코드를 수정했으면, 필드를 private으로 만든다. - 컴파일 및 테스트를 한다.