객체는 직접 아는 친구하고만 이야기하고, 친구의 친구에게 말을 걸지 말라는 원칙. a.getB().getC().doSomething() 같은 체인 호출을 피해 결합도를 낮춘다.
- 메시지 체인(Message Chains) 냄새:
person.department.manager.name처럼 객체를 타고 들어가는 코드는 중간 구조가 바뀌면 줄줄이 고쳐야 한다 - 위임 숨기기(Hide Delegate): 서버 객체에 위임 메서드를 만들어 내부 협력 객체를 감춘다.
person.manager만 쓰면 부서 객체가 바뀌어도 클라이언트는 영향을 받지 않는다 - 중개자 제거하기(Remove Middle Man): 반대로 위임 메서드만 잔뜩 늘어나 클래스가 전달만 하는 중개자로 전락했다면, 클라이언트가 실제 객체를 직접 부르게 되돌린다
어디까지 숨길지에 정답은 없다. 위임 숨기기와 중개자 제거를 오가며 균형점을 찾는다. 파울러는 이 법칙을 지나치게 믿으면 중개자 냄새가 난다며 "가끔 유용한 디미터의 제안" 정도로 받아들이라고 한다.
체인을 무작정 감추기보다, 체인의 최종 결과를 쓰는 코드 자체를 옮겨서 체인이 필요 없게 만드는 편이 나을 때가 많다. 옵셔널 체이닝(Optional Chaining, a?.b?.c)은 null 안전성을 줄 뿐 결합 문제를 풀어 주지는 않는다(옵셔널 체이닝과 null 병합 연산자).
결합도을 줄이는 구체적인 규칙 중 하나이고, 서비스 사이에서는 하위 시스템 앞에 창구를 세우는 퍼사드 패턴이 같은 역할을 한다.
출처: 『리팩터링 2판』 마틴 파울러 (원서 Refactoring, 2nd Edition) · Laws of Software Engineering: Law of Demeter · refactoring.com: Hide Delegate · refactoring.com: Remove Middle Man · Refactoring.Guru: Message Chains