"데메테르의 법칙" 또는 "최소 지식의 원칙"으로도 알려진 데메테르의 법칙은 객체 지향 프로그래밍에서 캡슐화, 느슨한 결합 및 정보 은닉을 촉진하는 소프트웨어 설계 원칙입니다.
Demeter 라는 프로젝트를 진행하던 개발자들은 어떤 객체가 다른 객체에 지나치게 많이 알다보니, 결합도가 높아지고 좋지 못한 설계를 야기한다는걸 발견했다.
이 문제를 개선하고자 객체의 데이터를 숨기는 대신 함수를 통해 공개하도록 하였다.
즉,
위와같은 말들과 관련이 있는 법칙입니다.
클래스 C의 메서드 m은 다음과 같은 객체의 메서드만 호출해야 한다.
public class Customer {
private Order order;
public String getProductDetails() {
return order.getProduct().getName();
}
}
위 코드를 보면 Customer
객체는 Order
객체를 통해 Product
객체에 직접 접근해 getName()
을 통해 데이터를 가져옵니다.
이는 Customer
가 개체 그래프에 너무 깊이 도달하여 Order
및 Product
클래스의 내부 구조와 밀접하게 연결되어 있기 때문에 Demeter의 법칙을 위반합니다.
Demeter의 법칙을 준수하기 위해 느슨한 결합 및 캡슐화를 촉진하도록 코드를 리펙터링 해보도록 하자
public class Customer {
private Order order;
public String getProductDetails() {
return order.getProductName();
}
}
public class Order {
private Product product;
public String getProductName() {
return product.getName();
}
}
리팩터링된 이 코드에서 Customer
클래스는 제품 이름을 검색하는 책임을 Order
클래스에 위임하고 Order
클래스는 제품 이름에 접근을 캡슐화합니다.
이러한 방식으로 각 클래스는 직접 협력자와만 상호 작용하여 클래스 간의 결합을 줄이고 보다 유지 관리 가능하고 유연한 디자인을 촉진합니다.