Table of contents
Open Table of contents
협력
영화 예매 시스템 돌아보기
- 애플리케이션의 기능을 구현하기 위해 수행하는 상호작용 협력이라고 한다.
- 객체가 협력에 참여하기 위해 수행하는 로직은 책임이라고 부른다.
- 객체들이 협력 안에서 수행하는 책임들이 모여 객체가 수행하 역할을 구성한다.
협력
- 협력은 객체지향 세계에서 기능을 구현할 수 있는 유일한 방법이다.
- 메시지 전송(message sending) 은 객체 사이의 협력을 위해 사용할 수 있는 유일한 커뮤니케이션 수단이다.
- 메시지를 수신한 객체는 메서드 를 실행해 요청에 응답한다.
협력이 설계를 위한 문맥을 결정한다
- 상태는 객체가 행동하는 데 필요한 정보에 의해 결정되고 행동은 협력 안에서 객체가 처리할 메시지로 결정된다.
- 객체가 참여하는 협력이 객체를 구성하는 행동과 상태를 모두 결정한다.
- 협력은 객체를 설계하는 데 필요한 일종의 **문맥(context)**을 제공한다.
책임
책임이란 무엇인가
- 협력에 참여하기 위해 객체가 수행하는 행동을 책임이라고 부른다.
- 책임란 객체의 의해 정의된 응집도 있는 행위의 집합으로, 객체가 유지해야 하는 정보와 수행할 수 있는 행동에 대해 개략적으로 서술한 문장이다.
- 객체의 책임을 크게 하는 것(doing), 아는 것(knowing) 의 두 가지 범주로 나누어 세분화하고 있다.
하는 것
- 객체를 생성하거나 계산을 수행하는 등의 스스로 하는 것
- 다른 객체의 행동을 시작시키는 것
- 다른 객체의 활동을 제어하고 조절하는 것
아는 것
- 사적인 정보에 대해 아는 것
- 관련된 객체에 대해 아는 것
- 자신이 유도하거나 계산할 수 있는 것에 대해 아는 것
- 일반적으로 책임과 메세지의 크기는 다르다.
- 책임은 객체가 수행할 수 있는 행동을 종합적이고 간략하게 서술하기 떄문에 메시지보다 추상적이고 개념적으로도 더 크다.
책임 할당
- 자율적인 객체를 만드는 가장 기본적인 방법은 책임을 수행하는 데 필요한 정보를 가장 잘 알고 있는 전문가에게 그 책임을 할당하는 것이다.
- 이를 책임 할당을 위한 INFORMATION EXPERT 패턴 이라고 한다.
책임 주도 설계
- 책임을 찾고 책임을 수행할 적절한 객체를 찾아 책임을 할당하는 방식으로 협력을 설계하는 방법을 책임 주도 설계(Responsibility-Driven Design) 이라고 한다.
책임 주도 설계 과정
- 시스템이 사용자에게 제공해야 하는 기능인 시스템 책임을 파악한다.
- 시스템 책임을 더 작은 책임으로 분할한다.
- 분할된 책임을 수행할 수 있는 적절한 객체 또는 역할을 찾아 책임을 할당한다.
- 객체가 책임을 수행하는 도중 다른 객체의 도움이 필요한 경우 이를 책임질 적절한 객체 또는 역할을 찾는다.
- 해당 객체 또는 역할에게 책임을 할당함으로써 두 객체가 협력하게 한다.
메시지가 객체를 결정한다
메시지가 객체를 선택하게 해야하는 중요한 이유
- 객체가 최소한의 인터페이스(minimal interface) 를 가질 수 있게 된다.
- 객체는 충분히 추상적인 인터페이스(abstract interface) 를 가질 수 있게 된다.
행동이 상태를 결정한다
- 개별 객체의 상태와 행동이 아닌 시스템 기능을 구현하기 위한 협력에 초점을 맞춰야만 응집도가 높고 결합도가 낮은 객체들을 창조할 수 있다.
- 상태는 단지 객체가 행동을 정상적으로 수행하기 위해 필요한 재료일 뿐이다.
역할
역할과 협력
- 객체가 어떤 특정한 협력 안에서 수행하는 책임의 집합을 역할이라고 부른다.
유연하고 재사용 가능한 협력
- 역할이 중요한 이유는 역할을 통해 유연하고 재사용 가능한 협력을 얻을 수 있기 때문이다.
- 동일한 책임을 수행하는 역할을 기반으로 두 개의 협력을 하나로 통합할 수 있다.
- 역할을 이용하면 불필요한 중복 코드를 제거할 수 있다.
역할의 구현 역할을 구현하는 가장 일반적인 방법은 추상 클래스와 인터페이스를 사용하는 것이다. 추상 클래스는 책임의 일부를 구현해 높은 것이고 인터페이스는 인체의 구현 없이 책임의 집합만을 나열해 놓았다는 차이가 있다.
객체 대 역할
- 역할을 객체가 참여할 수 있는 일종의 슬롯이다.
- 협력에 적합한 책임을 수행하는 대상이 한 종류라면 간단하게 객체로 간주한다.
- 여러 종류의 객체들이 참여할 수 있다면 역할이라고 부르면 된다.
- 다양한 객체들이 협력에 참여한다는 것이 확실하다면 역할로 시작하라.
- 정확한 결정을 내리기 어려운 상황이라면 구체적인 객체로 시작하라.
역할과 추상화
추상화의 장점
- 세부 사항에 억눌리지 않고도 상위 수준의 정책을 쉽고 간단하계 표현할 수 있다.
- 협력이라는 관점에서는 세부적인 사항을 무시하고 추상화에 집중하는 것이 유용하다.
- 설계를 유연하게 만들 수 있다.
- 협력 안에서 역할이라는 추상화를 이 용하면 기존 코드를 수정하지 않고도 새로운 행동을 추가할 수 있다.
배우와 배역
연극의 배역과 배우 간의 관계
- 배역은 연극 배우가 특정 연극에서 연기하는 역할이다.
- 배역은 연극이 상영되는 동안에만 존재하는 일시적인 개념이다.
- 연극이 끝나먼 연극 배우는 배역이라는 역할을 벗어 버리고 원래의 연극 배우로 돌아온다.
- 서로 다른 배우들이 동일한 배역을 연기할 수 있다.
- 하나의 배우가 다양한 연극 안에서 서로 다른 배역을 연기할 수 있다.
객체
- 객체는 다양한 역할을 가질 수 있다.
- 객체는 협력에 참여할 때 협력 안에서 하나의 역할로 보여진다.
- 객체가 다른 협력에 참여할 때는 다른 역할로 보여진다.
- 협력의 관점에서 동일한 역할을 수행하는 객체들은 서로 대체 가능하다.
- 역할은 특정한 객체의 종류를 캡슐화하기 때문예 동일한 역할을 수행하고 계약올 준수하는 대체 가능한 객체들은 다형적이다.