✏️7.8 중개자 제거하기 (Reove Middle Man)

리팩터링 전

manaer = aPerson.manager;

class Person {
  get manager() {return this.department.maneger;}
}

리팩터링 후

manager = aPerson.department.manager;

🧷 배경

클라이언트가 위임 객체의 다른 기능을 사용하고 싶을 때마다 서버의 위임 메서드가 추가로 필요하니 클라이언트가 위임 객체를 직접 호출하는게 나을 수 있음.

앞장의 위임 숨기기와의 균형점은 상황에 따라 다름.

서버 클래스가 단순히 중개자 역할만 할 때 성가시기 때문에 제거.

🧷 절차

  1. 위임 객체를 얻는 게터를 만든다.

  2. 위임 메서드를 호출하는 클라이언트가 모두 이 게터를 거치도록 수정한다. 하나씩 바꿀 때마다 테스트한다.

  3. 모두 수정했다면 위임 메서드를 삭제한다. -> 자동 리팩터링 도구를 사용할 때는 위임 필드를 캡슐화한 다음 이를 사용하는 모든 메서드를 인라인한다.

🧷 예시

// 클라이언트...
manager = aPerson.department.manager;
// Person 클래스...
get manager() {return this.department.manager;}
// Department 클래스...
get manager() {return this._managaer;}
  1. 중개자를 제거한다. 위임 객체를 얻는 게터를 만들자.

// Person클래스...
get department()  {return this._department;}
  1. 클라이언트가 부서 객체를 직접 사용하도록 고친다.

// 클라이언트...
manager = aPerson.department.manager;
  1. 클라이언트를 모두 고쳤다면 Person의 manager() 메서드를 삭제한다.

Last updated