✏️3.17 메시지 체인

메시지 체인

클라이언트가 한 객체를 통해 다른 객체를 얻은 뒤 방금 얻은 객체에 또 다른 객체를 요청하는 식으로, 다른 객체를 요청하는 작업이 연쇄적으로 이어지는 코드를 말한다.

🧷 getSomething() 같은 게터가 꼬리를 물고 이어지거나 임시 변수들이 줄줄이 나열되는 코드가 있을 때, 클라이언트가 객체 내비게이션 구조에 종속됐음을 의미한다. 내비게이션 중간 단계를 수정하면 클라이언트 코드도 수정해야된다.

📍 위임숨기기: 메시지 체인의 다양한 연결점에 적용할 수 있다.

→ 원칙적으로 체인을 구성하는 모든 객체에 적용할 수 있지만, 중간 객체들이 모두 중개자가 돼버리기 쉽다. 최종 결과 객체가 어떻게 쓰이는지부터 살펴보는게 좋다.

📍 함수 추출하기: 결과 객체를 사용하는 코드 일부를 따로 빼낸다.

📍 함수 옮기기: 체인을 숨길 수 있는지 살펴보자.

체인을 구성하는 객체 중 특정 하나를 사용하는 클라이언트 중 그 이후 객체들도 사용하길 원하는 클라이언트가 있따면, 이 요구를 처리해줄 메서드를 추가한다.

🧷 예시

managerName = aPerson.department.manager.name;    // 관리자 객체(Manager)의 존재를 숨김
managerName = aPerson.manager.name    // 부서 객체(department)의 존재를 숨김
managerName = aPerson.managerName     // 부서 객체와 관리자 객체 모두의 존재를 숨김

이 체인의 최종 결과 객체는 name이 반환하는 부서장의 이름이다.

managerName = aPerson.department.manager.name
reprt = '${managerName}
${aPerson.name} 님의 작업 로그
...'
console.log(report);

여기서 보고서 생성 로직을 함수로 추출한 다음 적당한 모듈로 옮기면 체인의 존재가 감춰진다.

console.log(reprtAutoGenerator.reprt(aPerson));

마지막으로 체인의 중간인 부서 정보를 얻어 사용하는 다수의 클라이언트가 부서장 이름도 함께 사용한다면 부서 클래스에 managerName() 메서드를 추가하여 체인을 단축할 수 있다.

Last updated