티스토리 뷰

종종 하나의 동작에 대해 어떤 객체가 맡고 있는지 구분하기 어려울 때가 있다. 여러 개의 점이 들어 있는 코드 몇 줄을 들여다보기 시작하면 책임 소재의 오류를 많이 발견하기 시작한다. 어떠한 코드 한 줄에서라도 점이 하나 이상 있으면 그른 곳에서 동작이 일어나고 있다는 뜻이다. 어쩌면 객체는 다른 두 객체를 동시에 다루고 있을지도 모른다. 이 경우 그 객체는 중개상, 즉 너무 많은 사람들에 대해 지나치게 알고 있는 꼴이다(마치 유통에 있어 중개상을 배제하고 직거래하듯). 문제의 동작을 관련 객체 가운데 하나로 옮겨보자.

모든 점들이 연결돼 있다면 대상 객체는 다른 객체에 깊숙이 관여하고 있는 셈이다. 이런 중복된 점들은 캡슐화를 어기고 있다는 방증이기도 하다. 객체가 자기 속을 들여다보려 하기보다는 뭔가 작업을 하도록 만들어야 한다. 캡슐화의 주 요점은 클래스 경계를 벗어나 알 필요가 없는 타입으로 진입하지 않는 것이다.

디미터(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/

en.wikipedia.org/wiki/Law_of_Demeter

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
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
글 보관함