4장은 이기적이고 합리적이라 가정된 인간도 타인과의 협력의 관점에서는 행동 양식이 달라질 수 있다는 이야기로 시작된다. 객체지향의 세상에서도 이 원리는 똑같이 적용될 수 있다. 우리는 객체 하나하나의 독립성에 집중할 것이 아니라 객체들간의 협력에 초점을 맞춰야 한다.
협력은 객체들이 요청과 응답의 메세지를 주고 받는 과정에서 일어난다. 응답을 해주어야 하는 메세지의 수신자는 자신이 해결하지 못하는 작업을 능력이 있는 다른 객체에게 요청한다. 객체들끼리 유기적으로 요청과 응답의 연쇄작용이 일어나고 이를 협력이라고 할 수 있다.
4장에서는 재판 과정을 예시로 든다. 재판장은 재판을 진행해야 한다는 책임이 있고, 토끼는 증인을 출석시켜야할 책임이 있으며 증인은 거짓없이 증언을 해야할 책임이 있다. 각자의 책임을 충실히 실행하며 재판의 성공적 진행이라는 공동의 목표를 향해 나아간다. 객체 지향의 설계에 있어서 핵심은 적절한 객체에 적절한 책임을 잘 할당하는 것이다.
재판 중간에는 재판장이 바뀌며 증인 또한 계속 변경된다. 하지만 각자가 완수해야 하는 책임은 변하지 않는다. 우리는 재판장, 증인을 출석 시키는 사람 , 증인을 역할로 규정할 수 있다. 역할을 수행하기 위해서는 그에 맞는 책임을 완수해야 한다. 책임을 완수 할 수 있는 객체는 그 역할을 수행 할 수 있다. 이 책에서는 동일한 메세지를 이해할 수 있는 객체라 규정하고 있다. 역할을 규정하면 책임을 수행하는 수많은 객체들을 재판장, 증인을 출석 시키는 사람 , 증인 이 세가지로 추상화해서 표현 할 수 있다.
객체 지향 설계에서 주의할 점
이전 장에서 계속 언급되어 온 이야기이지만, 객체를 설계함에 있어서 객체의 상태를 먼저 고려하면 안된다.
객체지향의 설계의 올바른 순서는
1. 객체간의 협력을 고려
2. 객체간의 협력을 하기 위한 책임과 행동을 고려
3. 적절한 책임을 적절한 객체에 할당
4. 행동에 맞는 상태를 결정
5. 클래스라는 구현 메커니즘을 통해 구체화
이 순서가 되야 한다.
객체 지향 설계 기법
객체지향 설계 기법으로는 책임-주도-설계(RDD), 디자인패턴, 테스트-주도-개발(TDD)가 있다. 크게 보면 RDD는 객체지향을 잘 구현하기 위한, 즉 협력을 위한 적합한 책임들을 선별하고 객체들에 위임 해주기 위한 방법론이며, 디자인패턴은 역할, 책임, 협력을 잘 구현한 결과물, 그리고 TDD는 RDD와 디자인패턴을 잘 녹여낸 설계 기법이다.
결론
핵심은 객체 설계시 가장 우선시 할 것은 객체간의 협력! 그다음으로 협력을 가능하게 하는 각 역할의 책임!
프로그래밍적으로 본다면 인터페이스의 올바른 구성이 중요하다고 할 수 있다.