객체지향의 사실과 오해 - 2 정리

 

책임과 메시지

 

자율적인 책임의 특징은 객체가 어떻게 해야 하는가가 아니라 무엇을 해야하는가를 설명한다는 것이다.

 

 

  • 객체지향 공동체를 구성하는 기본 단위는 '자율적'인 객체다
  • 객체들은 애플리케이션의 기능을 구현하기 위해 협력한다.
  • 협력 과정에서 각자 맡은 바 책임을 다하기 위해 자율적으로 판단하고 행동한다.

 

  • 책임들은 객체를 자율성을 침해하지 않을 정도로 추상화 되어야 한다.
  • 추상적이고 포괄적인 책임은 협력을 좀 더 다양한 환경에서 재사용 할 수 있도록 유연성이라는 축복을 내려준다.
  • 그러나 책임은 협력에 참여하는 의도를 명확하게 설명할 수 있는 수준 안에서 추상적이어야 한다.

 

  • 다형성 이란
    • 서로 다른 유형의 객체가 동일한 메시지에 대해 서로 다르게 반응하는 것을 의미한다.
    • 서로 다른 객체들이 다형성을 만족시키는 것은 객체들이 동일한 책임을 공유한다는 것을 의미한다.
    • 동일한 역할을 수행할 수 있는 객체들 사이의 대체 가능성을 의미 한다.

 

수신자와 송신자는 메시지라는 얇은 끈으로만 이어져 있다. 메시지를 기반으로 한 두 객체 사이의 이 낮은 결합도가 바로 설계를 유연하고 확장 가능하며 재사용 가능하게 만드는 비결이다. 따라서 설계의 품질을 높이기 위해서는 훌륭한 메시지를 선택해야 한다.

 

  • 클래스가 코드를 구현하기 위해 사용할 수 있는 중요한 추상화 도구인 것은 사실이지만 객체지향의 강력함은 클래스가 아니라 객체들이 주고받는 메시지로 부터 나온다.
  • 독립된 객체의 상태와 행위에 대해 고민하지 말고 시스템의 기능을 구현하기 위해 객체가 다른 객체에 제공해야 하는 메시지에 대해 고민하라

 

  • '묻지 말고 시켜라' 메시지가 '어떻게' 해야하는 지 지시하지 말고, '무엇을 해야하는지를 요청' 하라
  • '어떻게'에서 '무엇'으로 전환하는 것은 객체의 인터페이스의 크기를 급격하게 감소시킨다.
  • 인터페이스의 크기가 작다는 것은 외부에서 해당 객체에게 의존해야 하는 부분이 적어진다는 것을 의미한다.

 

  • 인터페이스란 어떤 두 사물이 마주치는 경계 지점에서 서로 상호작용 할 수 있게 이어주는 방법이나 장치를 의미한다.
  • 객체의 외부와 내부를 분리하라는 것은 결국 객체의 공용 인터페이스와 구현을 명확하게 분리하라는 말과 동일하다.
  • 인퍼테이스와 구현의 분리 원칙은 변경을 관리하기 위한 것이다. 송신자와 수신자가 구체적인 구현 부분이 아니라 느슨한 인터페이스에 대해서만 결합되도록 만느는 것이다.

 

객체 지도

  • 객체지향 세계를 구축하기 위해서는 사용자에게 제공할 기능과 기능을 담을 안정적인 구조가 있어야 한다.
  • 구조는 사용자나 이해관계자들이 도메인에 관해 생각하는 개념과 개념들 간의 관계로 표현한다.
    • 도메인 모델링
  • 기능은 사용자의 목표를 만족 시키기 위해 책임을 수행하는 시스템의 행위로 표현한다.
    • 유스케이스 모델링

 

  • 변경에 유연한 소프트웨어를 만들기 위해서는 유스케이스에 정리된 시스템의 기능을 도메인 모델을 기반으로 한 객체들의 책임으로 분배해야 한다.

 

요구사항들을 식별하고 도메인 모델을 생성한 후, 소프트웨어 클래스에 메서드들을 추가하고, 요구사항을 충족시키기 위해 객체들 간의 매시지 전송을 정의하라 [Larman 2001]

 

  • 책임-주도 설계는 유스케이스로부터 첫 번째 메시지와 사용자가 달성하려는 목표를, 도메인 모델로부터 기능을 수용할 수 있는 안정적인 구조를 제공받아 실제로 동작하는 객체들의 협력 공동체를 창조한다.

 

  • 책임 할당의 기본원칙 - 책임을 수행하는데 필요한 정보를 가진 객체에게 그 책임을 할당한다.
    • 상태와 행동을 캡슐화하는 자율적인 객체를 만들 수 있다.

 

함께 모으기

  • 개념 관점
    • 도메인 안에 존재하는 개념과 개념들 사이의 관계를 표현
  • 명세 관점
    • 도메인의 개념이 아니라 실제로 소프트웨어 안에서 살아 숨쉬는 객체들의 책임에 초점을 맞추게 됨
      • 즉 객체의 인터페이스를 바라보게 됨
    • 객체가 협력을 위해 '무엇'을 할 수 있는가에 초점을 맞춘다.
  • 구현 관점
    • 객체들이 책임을 수행하는 데 필요한 동작하는 코드를 작성하는 것

 

  • 합성

 

  • 연관

댓글



Designed by JB FACTORY