객체지향 패러다임의 관점에서 핵심은 역할(role), 책임(responsibility), 협력(collaboration)이다.
객체지향의 본질은 협력하는 객체들의 공동체를 창조하는 것이다.
객체지향 시스템은 자율적인 객체들의 공동체다.
협력은 객체지향의 세계에서 기능을 구현할 수 있는 유일한 방법이다.
외부의 객체는 오직 메시지만 전송할 수 있을 뿐이며, 메시지를 어떻게 처리할지는 메시지를 수신한 객체가 스스로 결정
자신이 할 수 없는 일을 다른 객체에게 위임하면 협력에 참여하는 객체들의 전체적인 자율성을 향상시킬 수 있다.
가장 기본적인 방법은 내부 구현을 캡슐화하는 것이다.
처리를 위임하는 이유는 요금을 계산하는데 필요한 정보를 알고잇는 객체가 movie이기 때문
직접해야 한다면 인스턴스 변수인 fee와 discountPolicy를 알아야 한다. 이는 OCP를 위반하게 된다.(인스턴스 값 변경시 Screening도 변경 필요)
애플리케이션 안에 어떤 객체가 필요하다면 그 이유는 단 하나여야한다.
그 객체가 어떤 협력에 참여하고 있기 때문이다.
객체가 협력에 참여할 수 있는 이유는 협력에 필요한 적절한 행동을 보유하고 있기 때문.
객체의 행동을 결정하는 것은 객체가 참여하고 있는 협력이다.
협력이 존재하기 때문에 객체가 존재하는 것이다.
협력이 객체를 구성하는 행동과 상태 모두를 결정한다. 따라서 협력은 객체를 설계하는 데 필요한 일종의 문맥을 제공한다.
협력에 참여하기 위해 객체가 수행하는 행동을 책임이라 한다.
책임을 크게 '하는 것(doing)'과 '아는 것(knowing)'의 두가지 범주로 나누어 세분화한다.
책임 주도 설계
시스템이 사용자에게 제공해야 하는 기능인 시스템 책임을 파악한다.
시스템 팩임을 더 작은 책임으로 분할한다.
분할된 책임을 수행할 수 있는 적절한 객체 또는 역할을 찾아 책임을 할당한다.
객체가 책임을 수행하는 도중 다른 객체의 도움이 필요한 경우 이를 책임질 적절한 객체 또는 역할을 찾는다.
해당 객체 또는 역할에게 책임을 할당함으로써 두 객체가 협력하게 된다.
객체에게 책임을 할당하는 데 필요한 메시지를 먼저 식별하고 메시지를 처리할 객체를 나중에 선택했다는 것이 중요하다. 다시 말해 객체가 메시지를 선택하는 것이 아니라 메시지가 객체를 선택하게 했다.
해석 : 어떤 행동을 하기 위해 메시지가 필요하고, 그 메시지를 수행하기 위한 객체를 선택하는 것이다.
Ex)
영화를 예매하라 -> 적절한 객체인 Screening 선택
계산하라 -> 적절한 객체인 Movie 선택
협력을 구성하는 객체들의 인터페이스는 충분히 추상적인 동시에 최소한의 크기를 유지할 수 있다.
객체가 어떤 특정한 협력 안에서 수행하는 책임의 집합을 역할이라고 부른다.
Ex)
비율 할인제와 고정 할인제의 책임은 똑같이 할인 금액을 계산하는 것이다.
그렇다고 해서 비율 할인제와 고정 할인제를 따로 구현하면 코드의 중복이 발생한다.
이 때, '할인 요금을 계산하라'라는 메시지에 응답할 수 있는 대표자를 생각하면 두 협력을 하나로 통합할 수 있다.
이 대표자를 협력 안에서 두 종류의 객체를 교대로 바꿔 끼울 수 있는 일종의 슬롯으로 생각할 수 있다.
이 슬롯이 바로 역할이다.
역할을 구현하는 가장 일반적인 방법 : 추상 클래스와 인터페이스를 사용하는 것
추상 클래스 : 책임의 일부를 구현
인터페이스 : 일체의 구현 없이 책임의 집합만을 나열해 놓음
협력 - 메시지 => 인터페이스 결정
책임 - 인터페이스
역할 - 인스턴스
역할의 가장 큰 장점은 설계의 구성 요소를 추상화할 수 있다는 것이다.
추상화의 이점 : 세부적인 사항으로 인해 객체들 사이의 핵심적인 관계와 관련된 큰 그림을 파악하는 것을 방지한다.