티스토리 뷰

728x90

velog 블로그에서 tistory로 이전한 데이터 입니다. - 2020-09-20

디미터의 법칙이란?

  1. 소프트웨어 개발 가이드라인 중 하나
  2. 최소 지식 원칙
  3. 모듈 사이 결합도를 줄여 코드 품질을 높이자

아래 예시를 보자,

Class 남자 {
    public String 데이트_코스_고르기(여자 여자친구) {
        if(여자친구.배.비어있다) {
            return 식당;
        } else {
            return 수족관
        }
    }
}

여기서 "여자친구.배.비어있다"에 주목하면 남자가 여자친구의 배가 비어있는지 확인하는데 배가 Object에서 int로 바뀐다면? 여자친구 class가 수정될 때, 남자도 함께 수정해야된다.

디미터의 법칙에는 규칙이 있다.
규칙은 위키에서 확인하자.

원칙으로는 잘 설명하기 어려워 코드를 직접보면,

Class 남자 {
    public String 데이트_코스_고르기(여자 여자친구) {
        if(여자친구.배고프다) {
            return 식당;
        } else {
            return 수족관
        }
    }
}

그런데 디미터의 법칙은 무조건 지켜야 하는가?

아니라고 본다. 디미터의 법칙은 오래된 객체지향언어에서 준수할 사항이지만 함수지향언어가 등장하면서 무조건 적용할 필요는 없다. 단순히 하나의 설계 원칙일 뿐이다.

내가 주로 개발하는 javascript에서 보면 체이닝을 쉽게 볼 수 있다.

items = [1,2,3,4,5]
want = items.filter(item => item > 3).reduce(reducer[전부더하기]);

여기서 체이닝이 보이는데 디미터의 법칙을 위반했나? Array => [filter] => Array => [reduce] => Int로 이동했다.

Array에서 Array, 같은 타입을 반환해 결과를 도출하는 경우다. 디미터의 법칙에 위반되지 않는다고 본다.

또한 then() 함수도 마찬가지이다.

애초에 객체지향적 관점에서의 원칙을 함수지향언어에 적용한다는게 웃길 수 있다.
따라서 개발할 때, 디미터의 원칙에 어긋난다고 코드를 작성 못하지 말고 디미터의 원칙이 원래 전하고 싶었던 의미가 무엇인지 알고있으면 좋을 것 같다.

반응형

'CS > Software Engineering' 카테고리의 다른 글

콘웨이 법칙이란?  (0) 2023.10.08
파레토 법칙이란?  (0) 2023.10.08
점진적인 개선은 어떻게 이루어질까?  (1) 2023.10.08
깔끔한 코드를 구현하자  (1) 2023.10.08
의사결정을 최적화 하라  (0) 2023.10.08