디미터 법칙

동현·2021년 3월 24일
0

디미터


  • 디미터 법칙의 시초 : 디미터라는 프로젝트를 진행중 다른 객체와의 협력을 하는 객체지향프로그래밍에서 협력의 경로를 제한 시켜두면 결합도가 낮아진다는 점을 발견하고 만들어낸 법칙이다.

간단하게 한줄에 . 하나만 찍는다고 표현한다.


Don't talk strangers

핵심

  • 객체의 구조를 따라 멀리 떨어져있는 객체를 get 을 통해 불러오거나, 메세지를 보내지마라

    • 객체 내부에 있는 내용, 메세지를 통해 얻은 정보만 사용해야한다.

      → 객체가 알아야하는 다른 객체의 내용을 최소화 하라!

      💁 Principle of least knowledge ( 최소 지식 원칙 )

EX)

  • getter를 사용해 현재 객체에서 다른 객체의 내용을 불러온다 ⇒ 디미터 법칙 위반
public class Post {
	private final List<Comment> comments;

	public Post(List<Comment> comments) {
		this.comments = comments;
	}

	public List<Comment> getComments() {
		return comments;
	}
}
public class Board {
	private final List<Post> posts;
	
	public Board(List<Posts> posts) {
		this.posts = posts;
	}

	public void addComment(int postsId, String content) {
		posts.get(postId).getComments().add(new Comment(content));
	}

}
  • 위 코드에서 Board 객체의 addComment 부분이 디미터 법칙에 위반되는 부분이다.

그렇다면 왜?

IF

  • 위에 코드에서 List comments ⇒ Comments 라는 일급 컬렉션으로 수정이 된다면?
public void addComment(int postId, String content) {
	posts.get(postId).getComments().add(new Comment(content));
}
  • 다음 코드에서 오류가 나게 된다. 이렇게 된다면 Board 객체는 Post 객체의 변화에도 영향을 받고 Comment 객체의 변화에도 영향을 준다.

규칙화

  • 노출을 제한 하기 위해 다음과 같은 규칙을 지켜야한다.
  1. 객체 자신의 메서드 사용
  2. 메서드의 파라미터로 넘어온 객체들의 메서드 사용
  3. 메서드 내부에서 생성, 초기화된 객체의 메서드만 사용
  4. 인스턴스 변수로 가지고 있는 객체가 소유한 메서드 사용
Class Demeter {
	private Member member;

	public myMethod(OtherObject other) {
	}

	public okLawOfDemeter(Paramemter param) {
		myMethod(); // 1
		param.paramMethod(); // 2
		Local local = new local(); // 3
		local.localMethod();
		member.memberMethod(); // 4
	}
}
  • 이 규칙을 지킨다면 결합도가 내려가 에러가 적고, 변화에 유연하게 대처가 가능한 클래스를 만들수있다.

주의사항

  • 자료구조라면 디미터 법칙을 거론할 필요 X
    • 자료구조는 내부 구조를 노출 해야하므로 디미터 법칙 필요 X
  • 하나의 .을 강제 하는 규칙이 아니다.
    • 결합도 문제 ⇒ 객체 내부 구조가 외부로 노출
    • 따라서 .을 사용하더라도 객체 내부 구조가 캡슐화 되어 외부로 노출 되지 않는다면 상관없다.

Reference

https://dundung.tistory.com/203

profile
여긴 어디 나는 누구?

0개의 댓글