디미터 법칙(Law of Demeter)

Daniel·2023년 6월 16일
0

Back-End

목록 보기
16/42

디미터 법칙이란?

"데메테르의 법칙" 또는 "최소 지식의 원칙"으로도 알려진 데메테르의 법칙은 객체 지향 프로그래밍에서 캡슐화, 느슨한 결합 및 정보 은닉을 촉진하는 소프트웨어 설계 원칙입니다.

Demeter 라는 프로젝트를 진행하던 개발자들은 어떤 객체가 다른 객체에 지나치게 많이 알다보니, 결합도가 높아지고 좋지 못한 설계를 야기한다는걸 발견했다.
이 문제를 개선하고자 객체의 데이터를 숨기는 대신 함수를 통해 공개하도록 하였다.

즉,

  • 객체들의 협력 경로 제한
  • 묻지말고 시켜라
  • 여러개의 .(dot)를 사용하지 마라
  • 멀리있는 객체에게는 메시지를 보내지마라

위와같은 말들과 관련이 있는 법칙입니다.

디미터 법칙에서 호출할 수 있는 메서드

클래스 C의 메서드 m은 다음과 같은 객체의 메서드만 호출해야 한다.

  • 클래스 C
  • m가 생성한 객체
  • m에 전달되는 모든 매개변수
  • C인스턴스 변수에 저장된 객체

디미터 법칙의 이해

public class Customer {
	private Order order;
	
	public String getProductDetails() {
		return order.getProduct().getName();
	}
}

위 코드를 보면 Customer 객체는 Order 객체를 통해 Product 객체에 직접 접근해 getName() 을 통해 데이터를 가져옵니다.
이는 Customer가 개체 그래프에 너무 깊이 도달하여 OrderProduct 클래스의 내부 구조와 밀접하게 연결되어 있기 때문에 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 클래스는 제품 이름에 접근을 캡슐화합니다.
이러한 방식으로 각 클래스는 직접 협력자와만 상호 작용하여 클래스 간의 결합을 줄이고 보다 유지 관리 가능하고 유연한 디자인을 촉진합니다.

profile
응애 나 애기 개발자

0개의 댓글