디미터 법칙이란?
📌 정의
LoD(Law of Demeter)는 최소 지식 원칙 또는 Don’t Talk to Strangers라고 불린다.
모듈은 자신이 조작하는 객체의 속사정을 몰라야 한다는 법칙이다.
“한줄에 .(dot)점 하나” 라고 요약하기도 한다.
디미터 법칙을 준수하면 객체를 캡슐화 하며 결합도를 낮추고, 응집도를 높일 수 있다.
아래는 디미터 법칙의 내용이다. 다음에 해당하는 메소드만 호출할 수 있다.
- 객체 자신의 메소드들
- 메소드의 파라미터로 넘어온 객체의 메소드들
- 메소드 내부에서 생성, 초기화된 객체의 메소드들
- 인스턴스 변수로 가지고 있는 객체의 메소드들
😎 예시
내 동아리 프로젝트에 적절한 예시가 있어 가져와보았다.
1
2
3
4
5
6
@Getter
class User {
...
private Status status;
}
1
2
3
4
5
6
7
8
class ~~Service {
public void execute() {
...
user.getStatus().isSubmitToTrue();
}
}
위 코드는 Status에 접근해서 isSubmit
이라는 변수의 값을 true로 변경하는 함수인데, Service단에서 Status를 가져와서 처리를 해버린다. 이는 디미터 법칙을 준수하지 않은 것인데, 디미터 법칙을 준수한다면 아래의 코드가 된다.
1
2
3
4
5
6
7
8
9
10
@Getter
class User {
...
private Status status;
public void isSubmitToTrue() {
status.isSubmitToTrue();
}
}
1
2
3
4
5
6
7
8
class ~~Service {
public void execute() {
...
user.isSubmitToTrue();
}
}
수정한 코드를 살펴보면 기존에 status를 가져와서 하던 작업을 User class 내부로 넣었다.
어떤가..? 훨씬 깔끔하지 않은가?
기존의 코드는 Service에서 Status의 변화에 노출되지만, 수정된 코드는 그렇지 않다.
Service에서 Status를 알 필요가 없어졌고, 결과적으로 객체간 결합도를 낮춘것이다.