p.78 ~ p.91
협력에 참여하기 위해 객체가 수행하는 행동이 책임이다.
객체에 의해 정의되는 응집도 있는 행위의 집합으로, 객체가 유지해야 하는 정보와 수행할 수 있는 행동에 대해 개략적으로 서술한 문장이다.
크레이그 라만 - 객체의 책임은 하는 것과 아는 것 두 가지 범주로 나누어 세분화 하고 있다.
하는 것은 객체의 생성과 스스로의 작업의 수행 과 다른 객체의 작업에 대한 관여이고
아는 것은 객체의 정보와 작업 그리고 다른 객체의 정보이다.
책임은 객체가 수행할 수 있는 행동을 종합적이고 간략하게 서술하기 때문에 메시지보다 추상적이고 개념적으로 더 크다.
객체지향 개발에서 가장 중요한 능력은 책임을 능숙하게 할당하는 것. 적절한 책임을 적절한 객체에 할당해야 단순하고 유연한 설계를 창조할 수 있다.
책임을 할당할 후보와 책임 그리고 책임을 수행하면서 협력할 협력자들에 대한 내용을 기록한다.
여기서 유의할 것은 후보는 클래스에 국한되는 존재가 아니다.
자율적인 객체를 만드는 가장 기본적 방법 - 책임을 수행하는 데 필요한 정보를 가장 잘 알고 있는 전문가에게 책일을 할당하는 것 (정보 전문가 패턴 - INFORMATION EXPERT)
객체지향 설계는 협력에 필요한 메시지를 찾고 메시지에 적절한 객체를 선택하는 과정의 반복 → 메시지가 메시지를 수신하는 객체의 책임을 결정
책임을 찾고 책임을 수행할 적절한 객체를 찾아 책임을 할당하는 방식으로 협력을 설계하는 방식
협력이 객체의 책임을 이끌어내고 책임이 협력에 참여할 격체를 결정한다 → 객체의 구현이 아닌 책임에 집중
객체지향 관점에서 상태는 단지 객체가 행동을 정상적으로 수행하기 위한 재료.
객체를 객체답게 만드는 것은 객체의 상태가 아니라 다른 객체에게 제공하는 상태. 따라서 협력의 관점에서 다른 객체에게 무엇을 제공하고 무엇을 얻어야 할지 고민하는 것이 훌륭한 책임을 결정하는 방법.
객체가 특정한 협력 안에서 수행하는 책임의 집합이 역할 → 협력을 모델링할 때는 특정한 객체가 아니라 역할에게 책임을 할당한다고 생각.
역할을 통해 유연하고 재사용 가능한 협력을 얻을 수 있다.
할인 요금을 계산하라는 메시지를 전송하면 이 메시지에 응답하는 대표자가 역할. 협력 안에서 역할은 다른 것으로 교체될 수 있다. → 역할은 여러 종류의 구체적인 객체를 포괄하는 추상화
동일한 책임을 수행하는 역할을 기반으로 여러 협력을 하나로 통합할 수 있다.
역할을 구현하는 일반적인 방법 → 추상클래스와 인터페이스
추상 클래스 : 역할을 수행하는 객체들이 공유하는 상태와 행동의 기본 구현이 존재
인터페이스 : 공통의 구현 없이 책임의 목록만 정의
한 종류의 객체가 협력에 참여하는 경우에서 역할이라는 개념이 오히려 복잡하지 않을까? 라는 생각
협력에 적합한 책임을 수행하는 대상이 한 종류라면 간단하게 객체로 간주.
여러 종류의 객체들이 참여할 수 있다면 역할이라고 부른다.