'2019/09/08'에 해당되는 글 1건

  1. 2019.09.08 :: 리팩토링 - 디메테르의 법칙(The Law of Demeter),최소 지식 원칙
IT이론 2019. 9. 8. 22:52

디메테르의 법칙은 객체 지향 디자인 원칙 중 하나이다. "최소 지식 원칙" 말 그대로 결합도가 낮은 설계를 위한 어떠한 원칙이다. 만약 메소드에 강한 결합도를 가진 로직이 들어가있다면 하나를 수정하면 많은 곳에서의 수정이 일어나는 대참사가 일어날 것이다. 그 중 디메테르의 법칙은 메소드 내의 다른 객체(API등)의 호출에 관련된 원칙이다. 간단히 글로써 정의를 보자.

 

디메테르의 법칙에서는 어떠한 객체 A의 메소드 m은 다음과 같은 종류의 객체에 있는 메소드들만 실행시킬 수 있다.

 

  1. A, 자기자신의 메소드
  2. m의 매개변수로 들어온 객체의 메소드
  3. m, 안에서 초기화된 객체(new 연산자)
  4. A의 인스턴스 변수(컴포넌트 객체)
  5. m의 스코프 안에서 O가 접근 가능한 전역변수

위의 내용을 조금 더 쉽게 설명하면,

 

  1. 클래스 자기 자신의 메소드 또는 인스턴스 변수의 메소드
  2. 메소드의 파라미터로 보낸진 객체의 메소드
  3. 메소드 또는 인스턴스 변수가 직접 초기화 시킨 객체
  4. 호출을 위한 메소드 또는 속성으로서 같은 클래스 안에서 선언된 객체
  5. 전역 객체(싱글톤과 같은 객체 포함)

 

사실 글로만 봤을 때는 이해하기 힘들다. 간단한 코드로 위의 내용을 살펴보자.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class A {
    private B b;
    public setA(B b) {
        b = b;
    }
    public myMethod(OtherObject other) {
        // ...
    }
    /* 디미터의 법칙을 잘 따른 예 */
    public okLawOfDemeter(Paramemter param) {
        myMethod();     // 자신의 메소드
        b.method();   // 자신의 멤버의 메소드
        Local local = new Local();
        local.method();    // 직접 생성한 객체의 메소드 
        param.method();    // 메소드의 인자로 넘어온 메소드
    }
    /* 디미터의 법칙을 어긴 예 */
    public violateLawOfDemeter(Paramemter param) {
        C c = param.getC();
        c.method();    // 인자로 받은 객체에서의 호출.
        param.getC().method();      // 위와 같음.
    }
}
cs

 

사실 모든 상황에서 해당 원칙을 따라야 하는지는 의문이다. 사실 모든 상황에 따라 다르지만 대부분은 지켜주는 것이 옳은 방법이긴 할 것 같다.

posted by 여성게
: