객체가 자기 자신을 책임지는 자율적인 존재이다. 따라서 객체 내부 구조를 묻지 말고 무언가를 시켜라. 이렇게 하면 객체 내부를 바깥으로 노출시키지 않게 된다.
디미터 법칙을 어긴 코드
1
2
3
4
object.getChild()
.getContent()
.getItem()
.getTitle();
- 기차 충돌(train wreck) : 이와 같이
getter
가 줄줄이 이어진 코드- 이러한 설계는 객체들이 어떻게 연결되어있는지를 보여준다.
- 객체 구조(연결)이 변경될 수 있으므로 프로그램은 불안정해진다.
디미터 법칙이 하나의 .을 강제하는 규칙은 아니다.
1
2
3
4
IntStream.of(1, 15, 2)
.filter(x -> x > 10)
.distinct()
.count();
- stream을 사용한 해당 코드는 하지만
of
,filter
,distinct
메서드는 모두IntStream
이라는 동일한 클래스 인스턴스를 반환한다. 즉 이들은IntStream
인스턴스를 또다른IntStream
인스턴스로 변환할 뿐.
디미터 법칙은 객체 결합도와 관련 된 것.
객체의 내부구조가 외부로 노출되는 경우에 해당된다.
1 2 3 4
object.getChild() .getContent() .getItem() .getTitle();
디미터 법칙을 지킬수록 결합도는 느슨해진다.
Reference)
https://woowacourse.github.io/javable/post/2020-06-02-law-of-demeter/