카테고리 없음

[리팩토링] 중재자(Middle Man)

JUNGKEUNG 2022. 10. 12. 23:23
반응형

중재자(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;
    }
}