리팩토링 - 디메테르의 법칙(The Law of Demeter),최소 지식 원칙
2019. 9. 8. 22:52ㆍIT이론
디메테르의 법칙은 객체 지향 디자인 원칙 중 하나이다. "최소 지식 원칙" 말 그대로 결합도가 낮은 설계를 위한 어떠한 원칙이다. 만약 메소드에 강한 결합도를 가진 로직이 들어가있다면 하나를 수정하면 많은 곳에서의 수정이 일어나는 대참사가 일어날 것이다. 그 중 디메테르의 법칙은 메소드 내의 다른 객체(API등)의 호출에 관련된 원칙이다. 간단히 글로써 정의를 보자.
디메테르의 법칙에서는 어떠한 객체 A의 메소드 m은 다음과 같은 종류의 객체에 있는 메소드들만 실행시킬 수 있다.
- A, 자기자신의 메소드
- m의 매개변수로 들어온 객체의 메소드
- m, 안에서 초기화된 객체(new 연산자)
- A의 인스턴스 변수(컴포넌트 객체)
- m의 스코프 안에서 O가 접근 가능한 전역변수
위의 내용을 조금 더 쉽게 설명하면,
- 클래스 자기 자신의 메소드 또는 인스턴스 변수의 메소드
- 메소드의 파라미터로 보낸진 객체의 메소드
- 메소드 또는 인스턴스 변수가 직접 초기화 시킨 객체
- 호출을 위한 메소드 또는 속성으로서 같은 클래스 안에서 선언된 객체
- 전역 객체(싱글톤과 같은 객체 포함)
사실 글로만 봤을 때는 이해하기 힘들다. 간단한 코드로 위의 내용을 살펴보자.
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 |
사실 모든 상황에서 해당 원칙을 따라야 하는지는 의문이다. 사실 모든 상황에 따라 다르지만 대부분은 지켜주는 것이 옳은 방법이긴 할 것 같다.
'IT이론' 카테고리의 다른 글
IT - DevOps란? (0) | 2019.12.07 |
---|---|
CQRS(Command and Query Responsibility Segregation) 명령-질의 책임분리란? (0) | 2019.09.09 |
성능 분석 및 튜닝이란?(performance tuning) (1) | 2019.07.16 |
The Twelve-Factor App (0) | 2019.04.03 |
재귀호출(재귀함수) (0) | 2018.03.09 |