이전의 코드는 Department를 통해 Manager에 접근할 수 있다는 정보를 알아야 하지만,
getManager()를 통해 위임을 숨긴다면 클라이언트는 person의 getManager()만 알아도 된다.
나중에 getManager() 내부 구현이 바뀌더라도 getManager()를 사용한 코드는 그대로 유지할 수 있다.
예시
Before
Person manager = tony.getDepartment().getManager(); 매니저 가져오는데 person을 통해 department를 가져오고, 그 department를 통해 manager를 가져와야 한다.
class PersonTest {
@Test
void manager() {
Person tony = new Person("tony");
Person nick = new Person("nick");
tony.setDepartment(new Department("m365deploy", nick));
Person manager = tony.getDepartment().getManager();
assertEquals(nick, manager);
}
}
``` java
@Getter
public class Person {
private String name;
private Department department;
public Person(String name) {
this.name = name;
}
public void setDepartment(Department department) {
this.department = department;
}
}
After
클라이언트 코드인 테스트 코드는 영향을 받지 않는 것이 위임 숨기기를 통해 얻을 수 있는 장점이다.
@Getter
public class Person {
private String name;
private Department department;
public Person(String name) {
this.name = name;
}
public void setDepartment(Department department) {
this.department = department;
}
public Person getManager() {
return getDepartment().getManager();
}
}
class PersonTest {
@Test
void manager() {
Person tony = new Person("tony");
Person nick = new Person("nick");
tony.setDepartment(new Department("m365deploy", nick));
Person manager = tony.getManager();
assertEquals(nick, manager);
}
}
냄새 17. 메시지 체인 (Message Chains)
위임 숨기기 (Hide Delegate)
를 사용해 메시지 체인을 캡슐화를 할 수 있다.함수 추출하기 (Extract Function)
로 메시지 체인 일부를 함수로 추출한 뒤,함수 옮기기 (Move Function)
으로 해당 함수를 적절한 이동할 수 있다.리팩토링 37. 위임 숨기기 (Hide Delegate)
위임 숨기기
의 목적이다.getManager()를 통해 위임을 숨긴다면 클라이언트는 person의 getManager()만 알아도 된다.
예시
Before
Person manager = tony.getDepartment().getManager();
매니저 가져오는데 person을 통해 department를 가져오고, 그 department를 통해 manager를 가져와야 한다.}
After