안녕하세요 코딩하는헬린이 입니다.
백수인데 옴옴옴청머엄엄엄엄청ㅇ청청청나게 바뻐요 ~ㅎ 왜 바쁘지?
아무튼,
오늘은 디미터의 법칙의 대해서 알아보겠습니다.
1. 디미터의 법칙
객체 지향 프로그래머가 따라하기 쉬운 형식으로 캡슐화 및 모듈화의 아이디어를 인코딩하는 간단한 프로그래밍 언어 독립 규칙(사내에서 Law of Demeter™로 알려짐)을 소개합니다. Demeter의 법칙을 따르면서 동시에 코드 중복, 메서드 인수 수 및 클래스당 메서드 수를 최소화하면 다음과 같은 관련 이점을 얻을 수 있습니다. 더 쉬운 소프트웨어 유지 관리, 메서드 간의 결합 감소, 더 나은 정보 숨기기, 더 좁은 인터페이스 , 재사용하기 쉬운 방법 및 구조적 유도를 사용하여 더 쉬운 정확성 증명. 우리는 법칙(강하고 약한)에 대한 두 가지 중요한 해석을 논의하고 모든 객체 지향 프로그램이 법칙을 충족하도록 변형될 수 있음을 증명합니다.
ref : https://dl.acm.org/doi/10.1145/62084.62113
위 내용은 해당 하이퍼링크에 걸려있는 사이트에서 번역한 내용입니다.
그러므로,
디미터의 법칙은 가이드 라인은 최소한의 지식 원칙(The Principle of Least Knowledge) 을 강조한며 모듈은 자신이 조작하는 객체의 속사정을 몰라야 한다는 법칙이다
이런 내용입니다.
2. 디미터 법칙의 장점
- 1) 소프트웨어가 보다 유지 관리가 용이 하고 적응성이 뛰어난 경향이 있다는 것입니다 . 개체는 다른 개체의 내부 구조에 덜 의존하기 때문에 호출자를 다시 작업하지 않고도 개체 구현을 변경할 수 있습니다.
- 계층화된 아키텍처에서 각 계층 내의 코드는 계층 내의 코드와 다음 계층 내의 코드만 호출할 수 있습니다
뭐 1번에 쓴 내용이랑 비슷하긴 합니다.
3. 디미터 법칙 예제
ex) 디미터 법칙X
@Document(collection = "feed_comment")
@Getter
public class FeedComment {
@Id
private ObjectId id;
private Member member;
public String isMemberNicknameGet() {
return this.getMember().getNickname();
}
}
@Getter
public class Member{
@Id
private ObjectId id;
private FeedComment feedComment;
private String nickname;
}
지금 같은 상황에서 Member 의 nickname을 가져오기 위해 아래와 같이 가져온다면 디미터 법칙을 지키지 못한겁니다.
feedComment.getMember().getNickname()
디미터의 법칙 O
String nickname = feedComment.isMemberNicknameGet();
이렇게 객체 내부에서 연결되어있는 메소드로 객체를 가져오는겁니다.
이렇게 한다면 불필요한 getter 도 필요없고 좋네요!
ref : https://prohannah.tistory.com/204
https://mangkyu.tistory.com/147