결합도 줄이기와 디미터 법칙 [실용주의 프로그래머]

LEE KYU WON·2021년 1월 20일
0

유지보수가 유용한 코드를 만들기 위해서 코드를 작은 단위로 나눠 모듈화를 시킨다. 모듈화가 잘 된 코드의 경우 뛰어난 유연성과 가역성을 갖게 되고 특정 부분을 수정하더라도 다른 부분에 주는 영향을 최소화 시킨다. 이렇게 모듈간의 의존 정도를 줄이는것을 decoupling 이라고 하고. 디미터 법칙은 decoupling 을 위한 아주 좋은 원칙이다.

우리는 집을 짓거나 리모델링 할 때 편의를 위해 이를 도맡아 해줄 '주 계약자' 와 계약을 하고 벽돌을 쌓거나 벽지를 바르는 일은 주 계약자는 하도급자를 시키기 때문에 우리가 하도급자와 직접 부딛힐 일은 없다. 이러한 원리와 같이 객체가 제공하는 메서드에 접근하기 위해 또다른 객체를 통하는것을 허용하지 않는것이 디미터 법칙이다.

디미터 법칙은 객체의 모든 메서드는 다음에 해당하는 메서드만을 호출해야 한다고 말한다.

디미터 함수 법칙 (메서드가 호출 가능한 메서드)
1. 자신
2. 메서드로 넘어온 인자
3. 자신이 생성한 객체
4. 직접 포함하고 있는 객체

확실히 효과가 있는가?

응답집합이 큰 클래스는 작은 클래스보다 에러를 발생시키기 쉽다. 응답객체란 클래스의 메서드가 직접 호출하는 함수의 수이다. 디미터 법칙을 따르면 함수를 호출하는 클래스의 응답집합 크기를 줄일 수 있기 때문에 좀 더 에러가 적은 클래스를 만들 수 있다.

하지만 디미터 법칙을 따르기 위해서는 '주 계약자' 로서의 대가를 치러야 한다. '하도급자' 메서드가 지원하는 기능을 '주 계약자' 가 모두 지원하기 위해 위임 메서드를 만들어야 하는데 이는 성능 저하 또는 메모리 과부하 같은 성능 문제가 발생 할 수 있고 코드가 길어진다는 단점이 있다. 자원에 극히 제약이 있는 환경이 아니고서야 모듈 결합도가 높아지는 것은 코드 줄수가 길어지는 것보다 더 큰 문제인 경우가 많으므로 대부분의 경우에서 효과를 발휘 할 것으로 보인다.

profile
벼랑끝에서 성장하는 개발자 이규원입니다.

0개의 댓글