한 줄에 점을 하나만 찍는다.
디미터(Demeter)의 법칙 : "친구하고만 대화하라"
"자기 소유의 장난감, 자기가 만든 장난감, 그리고 누군가 자기에게 준 장난감하고만 놀 수 있다. 하지만 절대 장난감의 장난감과 놀면 안 된다."
그렇지 않을 경우, 다른 객체에 너무 깊숙이 관여하게 된다. 이는 캡슐화를 어기는 것이다.
즉, 한 객체가 너무 먼 객체를 불러와서 사용하는 것을 지양해야 한다.
코드를 작성할 때 한 라인에 점이 여러 개 생기면 대상 객체의 내부에 깊이 접근할 수 있다는 의미이고, 이는 강한 결합도가 형성되어있다는 것을 뜻하게 된다. 설계에 대한 고민을 해봐야 한다.
class Location {
public Piece current;
}
class Piece {
public String representation;
}
class Board {
public String boardRepresentation() {
StringBuilder buf = new StringBuilder();
for (Location loc : squares()) {
buf.append(loc.current.representation.substring(0, 1));
}
return buf.toString();
}
}
Location에 접근한 다음 Piece에 접근하고, 그 다음엔 Piece의 representation에 접근하여 작업을 수행하고 있다. 이 코드는 한 줄에 한 점만 사용한다는 원칙과 꾀나 거리가 있다. 디미터의 법칙에 따라 아래와 같이 수정했다.
class Location {
// private으로 변경하여 프로그래머가 뭔가 잘못을 저지를 가능성을 제거
private Piece current;
// 인스턴스에 작업을 요청해야 하므로 새로운 메서드 addTo()를 추가
public void addTo(StringBuilder buf) {
current.addTo(buf);
}
}
class Piece {
// private으로 변경하여 프로그래머가 뭔가 잘못을 저지를 가능성을 제거
private String representation;
// representation의 첫 문자를 가져오는 것이 꽤 좋아보인다. 이와 같은 변경을 통해 언젠가 해당 기능을 재사용할 수도 있게 되었다.
public String character() {
return representation.substring(0, 1);
}
public void addTo(StringBuilder buf) {
buf.append(character());
}
}
class Board {
public String boardRepresentation() {
StringBuilder buf = new StringBuilder();
for (Location location : squares()) {
location.addTo(buf);
}
return buf.toString();
}
}
즉, getter, setter 지양해 객체에 메시지를 보내야 한다.
getter, setter 을 사용해 접근한다면, 객체의 내부 필드에 접근하게 된다. 이는 현재 사용 중인 객체에 메시지를 보내는 것이 아닌, 내부에 존재하는 다른 객체에 접근해 대화하겠다는 의미가 된다.
클래스의 필드에 접근할 때 List나 Map과 같은 Collection 클래스를 getter로 불러와 처리를 하는 경우가 많다. 이렇게 자료구조에 접근을 할 때에도 생활체조 원칙을 위반하는 경우가 많은데, 이런 경우에는 일급컬렉션과 같은 도메인 오브젝트 설계를 활용하는 것이 좋다.
'OOP' 카테고리의 다른 글
[객체지향 생활체조 원칙] 규칙 6. 모든 엔티티를 작게 유지한다 (0) | 2022.11.07 |
---|---|
[객체지향 생활체조 원칙] 규칙 5. 줄여 쓰지 않는다(축약 금지). (0) | 2022.11.07 |
[객체지향 생활체조 원칙] 규칙 3. 모든 원시 값과 문자열을 포장한다. (0) | 2022.11.07 |
[객체지향 생활체조 원칙] 규칙 2. else 예약어를 쓰지 않는다. (0) | 2022.11.06 |
[객체지향 생활체조 원칙] 규칙 1. 한 메서드에 오직 한 단계의 들여 쓰기만 한다. (2) | 2022.11.05 |
댓글