[오브젝트] 3장_역할, 책임, 협력

객체들이 애플리케이션의 기능을 구현하기 위해 수행하는 상호작용을 협력이라고 한다.
객체가 협력에 참여하기 위해 수행하는 로직은 책임이다.
객체들이 협력 안에서는 수행하는 책임들이 모여 객체가 수행하는 역할을 구성한다.

협력

자율적인 객체는 자신에게 할당된 책임을 수행하던 중에 필요한 정보를 알지 못하거나 외부의 도움이 필요한 경우 적절한 객체에게 메세지를 전송해 협력을 요청한다.
메세지 전송은 객체 간 협력을 위해 사용할 수 있는 유일한 수단이다.
메세지를 수신한 객체는 메세드를 실행해 요청에 응답한다.
Screening 이 Movie 에게 처리를 위임하는 이유는 요금을 계산하는데 필요한 기본 요금과 할인 정책을 가장 잘 알고 있는 객체가 Movie 이기 때문이다.

협력이 설계를 위한 문맥을 결정

Movie 객체는 어떤 행동을 수행할 수 있어야할까 ?
Movie 의 행동을 결정하는 것은 영화 예매를 위한 협력이다.
Movie 가 기본 요금인 fee 와 할인 정책인 discountPolicy 라는 인스턴스 변수를 상태의 일부로 포함하고 있는 이유는, 요금 계산이라는 행동을 수행하는데 이 정보들이 필요하기 때문이다.
객체가 참여하는 협력이 객체를 구성하는 행동과 상태를 결정한다.

책임

객체는 협력에 필요한 지식과 방법을 가장 잘 알고 있는 객체에게 도움을 요청한다.

  1. 책임을 할당한다는 것은 메세지의 이름을 결정하는 것과 같다. ex) 예매하라
  2. 메세지를 선택했으면 메세지를 처리할 적절한 객체를 선택해야한다. 영화 예매와 관련된 정보를 가장 많이 알고 있는 객체에게 할당하 것이 바람직다. ex) Screening
  3. 영화 예매를 위해서는 예매 가격을 계산해야한다. Screening 은 예매에 대해서는 정보 전문가지만, 영화 가격 자체에 대해서는 모른다. 그래서 외부의 객체에게 가격 계산을 요청해야한다. 새로운 메세지가 필요하다. ex) 가격을 계산하라
  4. 가격 계산을 위해 정보 전문가가 필요하다. ex) Movie

책임 주도 설계

책임 주도 설계란, 책임을 찾고 책임을 수행할 적절한 객체를 찾아 책임을 할당하는 방식으로 협력을 설계하는 방법이다.
협력은 객체를 설계하기 위한 구체적인 문맥을 제공한다. 협력이 책임을 이끌어내고 책임이 협력에 참여할 객체를 결정한다.
책임을 할당할 때 고려해야할 두 가지 요소

  1. 메세지가 객체를 결정
  2. 행동이 상태를 결정

메세지가 객체를 결정

메세지가 객체를 선택해야하는 이유는,

  1. 객체가 최소한의 인터페이스를 가지게 된다.
  2. 추상적인 인터페이스를 가질 수 있다. 무엇을 하는지만 표현해야지, 어떻게 수행하는지는 노출해서는 안된다.

행동이 상태를 결정

객체가 협력에 적합한지를 결정하는 것은 그 객체의 행동이다.
상태는 단지 객체가 행동을 정상 수행하기 위한 필요한 재료일 뿐이다.
협력이 객체의 행동을 결정하고 행동이 상태를 결정한다.
그 행동이 객체의 책임이다.

역할

역할은, 객체가 어떤 특정한 협력 안에서 수행하는 책임의 집합이다.
‘예매하라’ 라는 메세지를 처리하기 위해 적합한 객체로 Screening 을 선택하는 데는 두가지 단계가 있다.

  1. 영화 예매를 할 수 있는 적절한 역할이 무엇인가 ?
  2. 역할을 수행할 객체로 Screening 인스턴스를 선택한다.

유연하고 재사용 가능한 협력

AmountDiscountPolicy 와 PercentDiscountPolicy 인스턴스라는 두가지 종류의 객체가 할인 요금을 계산하라 라는 메세지에 응답할 수 있어야한다.
그럼, 두 종류의 객체가 참여하는 협력을 개별적으로 만들어야할까?
할인 요금을 계산하라라는 메세지에 응답할 수 있는 대표자를 생각한다면 두 협력을 하나로 통합할 수 있다.
이 대표자를 협력에서는 두 종류의 객체로 바꿔 끼울 수 있는 슬롯으로 생각할 수 있다. 이 슬롯이 역할이다.
변경 전의 절차적 설계에서는 Theater 가 전체적인 작업을 도맡아 했다. 변경 후의 객체지향 설계에서는 각 객체가 자신이 맡은 일을 스스로 처리했다.

역할의 구현

역할을 구현하는 방법은,

  1. 추상 클래스 (책임의 일부를 구현해 놓은 것)
  2. 인터페이스 (구현 하나 없이, 책임의 집합을 나열해 놓은 것)

객체 대 역할

협력에 참여하는 후보가 여러 종류의 객체에 의해 수행될 필요가 있다면 그 후보는 역할이 된다.
한 종류의 객체만이 협력에 참여할 필요가 있다면 후보는 객체가 된다.
설계 초반에는 적절한 책임과 협력의 큰 그림을 탐색하는 것이 중요하다.
단순하게 객체로 시작하고 반복적으로 책임과 협력을 정제하며, 필요한 순간에 객체로부터 역할을 분리하는 것이 좋다.

역할과 추상화

추상화를 이용한 설계의 장점은,

  1. 중요한 정책을 상위 수준에서 단순화할 수 있다.
  2. 설계가 유연해진다.

오브젝트 <조영호>

Comments