티스토리 뷰
종종 하나의 동작에 대해 어떤 객체가 맡고 있는지 구분하기 어려울 때가 있다. 여러 개의 점이 들어 있는 코드 몇 줄을 들여다보기 시작하면 책임 소재의 오류를 많이 발견하기 시작한다. 어떠한 코드 한 줄에서라도 점이 하나 이상 있으면 그른 곳에서 동작이 일어나고 있다는 뜻이다. 어쩌면 객체는 다른 두 객체를 동시에 다루고 있을지도 모른다. 이 경우 그 객체는 중개상, 즉 너무 많은 사람들에 대해 지나치게 알고 있는 꼴이다(마치 유통에 있어 중개상을 배제하고 직거래하듯). 문제의 동작을 관련 객체 가운데 하나로 옮겨보자.
그 모든 점들이 연결돼 있다면 대상 객체는 다른 객체에 깊숙이 관여하고 있는 셈이다. 이런 중복된 점들은 캡슐화를 어기고 있다는 방증이기도 하다. 객체가 자기 속을 들여다보려 하기보다는 뭔가 작업을 하도록 만들어야 한다. 캡슐화의 주 요점은 클래스 경계를 벗어나 알 필요가 없는 타입으로 진입하지 않는 것이다.
디미터(Demeter)의 법칙(“친구하고만 대화하라”)이 좋은 출발점이긴 하지만, 이런 식으로 생각하자. 자기 소유의 장난감, 자기가 만든 장난감, 그리고 누군가 자기에게 준 장난감하고만 놀 수 있다. 하지만 절대 장난감의 장난감과 놀면 안 된다.
class Board {
...
class Piece {
...
String representation;
}
class Location {
...
Piece current;
}
String boardRepresentation() {
StringBuffer buf = new StringBuffer();
for (Location l : squares())
buf.append(l.current.representation.substring(0, 1));
return buf.toString();
}
}
class Board {
...
class Piece {
...
private String representation;
String character() {
return representation.substring(0, 1);
}
void addTo(StringBuffer buf) {
buf.append(character());
}
}
class Location {
...
private Piece current;
void addTo(StringBuffer buf) {
current.addTo(buf);
}
}
String boardRepresentation() {
StringBuffer buf = new StringBuffer();
for (Location l : squares())
l.addTo(buf);
return buf.toString();
}
}
이 예제에서 자세한 알고리즘 구현은 더 헷갈리는데, 한눈에 코드를 이해하기 조금 더 어렵게 할 수 있다. 어쨌든 그냥 Piece를 문자로 변환하는 메서드를 만들어 이름(character)을 붙였다. 이 메서드는 강한 응집력의 이름과 작업을 띠며 꽤 잘 재사용될 것 같은데, 실제 representation.substring(0, 1)이 프로그램의 군데군데 반복적으로 나오는 것들을 극적으로 줄여준다. 메서드 이름은 주석의 자리를 대신하니, 자 이제 이름 짓기에 시간을 투자하자. 이런 식의 구조를 지닌 프로그램을 이해하는 것이 진짜 더 어려운 것이 아니라, 단지 살짝 다른 접근이 필요한 것뿐이다.
디미터의 법칙 (최소 지식 원칙)이란 소프트웨어, 특히 객체 지향 프로그램을 개발하기 위한 설계 지침으로 아래 3가지로 요약될 수 있다.
- 현재 unit과 밀접하게 관련있는 unit에 대한 지식만 가져야 한다.
- 각 unit은 연관된 친구 사이에만 대화해야하며 낯선 이와는 대화하면 안된다.
- 직접적으로 연관된 친구 사이에만 대화해야한다.
객체지향적으로 표현하자면 한 객체가 정말 연관된 객체에 대한 정보만 갖고 있어야 한다는 의미이다.
결과적으로, 디미터의 법칙의 연장선인 이 규칙을 어기는 케이스의 경우 객체 간의 관계 설정이 잘못되었을 수 있다는 것을 의미한다.
[참고 및 출처]
developerfarm.wordpress.com/2012/01/30/object_calisthenics_5/
- Total
- Today
- Yesterday
- non-blocking
- 프로그래머스 Level 1
- blocking
- 필터
- 동기
- a
- 논블로킹
- 프로그래머스 Level 3
- 해시
- Handler Interceptor
- Synchronous
- 블로킹
- Filter
- 핸들러 인터셉터
- http://www.nextree.co.kr/p6960/
- 비동기
- 프로그래머스
- 프로그래머스 Level 2
- 코딩테스트 고득점 Kit
- Asynchronous
- 인터셉터
- 스택/큐
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |