리팩토링
리팩토링 객체간의 기능 이동 기법
성구님
2017. 4. 9. 13:43
7장. 객체간의 기능 이동
Move Field
필드가 자신이 정의된 클래스보다 다른 클래스에 의해 더 많이 사용된다면
- 타겟 클래스에 새로운 필드를 만들고 기존 필드를 사용하는 모든 부분을 변경하라.
언제?
- 다른 클래스에서 get, set을 통해 간접적으로 많이 사용 될 때
자체 캡술화
- 클래스 내부에서 필드를 사용할 때도 get, set메소드를 통해서 사용
- 변경이 쉬워진다.
Extract Class
두 개의 클래스가 해야 할 일을 하나의 클래스가 하는 경우
- 새로운 클래스를 만들어서 관련있는 필드와 메소드를 옮겨라.
동기
- 클래스를 성격에 맞게 추상화
- 클래스의 책임을 어떻게 나눌 것 인가?
Inline Class
클래스가 하는 일이 많지 않은 경우
- 그 클래스에 있는 모든 변수와 메소드를 다른 클래스로 옮긴다.
동기
- Extract Class에 반대다.
Hide Delegate
클라이언트가 객체의 위임 클래스를 직접 호출하고 있는 경우
- 서버에 메소드를 만들어 Delegate를 숨겨라.
동기
- 캡슐화를 위해
- 커플링을 줄일 수 있다.
Remove Middle Man
클래스가 간단한 위임을 너무 많이 하는 경우
- 클라이언트가 대리 객체를 직접 호출하라.
동기
- Hide Delegate의 반대
- Hide Delegate의 단점
- 간단한 위임메소드 추가가 필수
- 미들맨이 너무 커진다.
- 시간에 따라 두 가지 리팩토링 기법을 적절히 사용
Introduce Foreign Method
사용하고 있는 서버클래스에 부가적인 메소드가 필요하지만 클래스를 수정할 수 없는 경우
- 첫 번째 인자로 서버클래스의 인스턴스를 받는 메소드를 클라이언트에 만들어라.
Before
Date newStart = new Date(previousEnd.getYear(), previousEnd.getMonth(), previousEnd.getDate() + 1);
After
Date newStart = nextDay(previousEnd); private static nextDay(Date arg){ return new Date(arg.getYear(), arg.getMonth(), arg.getDate() + 1); }