반응형
중재자(Middle Man) 란?
캡슐화를 통해 내부의 구체적인 정보를 최대한 감출 수 있다. 그러나, 어떤 클래스의 메소드가 대부분 다른 클래스로 메소드 호출을 위임하고 있다면 중재자를 제거하고 클라이언트가 해당 클래스를 직접 사용하도록 코드를 개선할 수 있다
메세지 체인의 반대라고 생각하면 좋다
메세지 체인은 캡슐를 하여 코드를 최대한 줄이면서 이어 나가지만 모든 코드가 캡슐화로 되어있으면 필요없는 코드까지 캡슐화가 되기 때문에 이러한 문제를 해결하는 방법 중 하나가 중재자 냄새이다.
관련 리팩토링
- 중재자 제거하기(Remove Middle Man)
- 함수 인라인(Inlince Function)
- 슈퍼 클래스를 위임으로 바꾸기
- 서브클래스를 위임으로 바꾸기
- 중재자 제거하기 같은 경우는 클라이언트가 필요한 클래스를 직접 사용하도록 개선할 수 있다.
- 함수 인라인을 사용해서 메소드 호출한 쪽으로 코드를 보내서 중재자를 없앨 수 도있다
예제 코드
public class Person {
private Department department;
private String name;
public Person(String name, Department department) {
this.name = name;
this.department = department;
}
public Person getManager() {
return this.department.getManager();
}
}
냄새
department의 필드를 통해 객체 그래프 탐색을 할 수 가 없다
해결
객체 그래프 탐색을 할 수 있게 getter를 만들어 준다
리팩토링 후
public class Person {
private Department department;
private String name;
public Person(String name, Department department) {
this.name = name;
this.department = department;
}
public Department getDepartment() {
return department;
}
}