우리 모두 합친것보다 더 현명한 사람은 없다.
객체지향 설계의 전체적인 품질을 결정하는 것은 개별 객체의 품질이 아니라 여러 객체들이 모여 이뤄내는 협력의 품질이다. 훌륭한 객체 지향 설계자는 객체들간의 요청과 응답 속에서 창발하는 협력에 초점을 맞춰 애플리케이션을 설계한다. 협력이 자리를 잡으면 저절로 객체의 행동이 드러나고 뒤이어 적절한 객체의 상태가 결정된다.
협력
책의 파이를 훔친 하트 잭을 읽고
객체지향 관점에서 재판 자에면에 등장하는 모든 등장인물들은 객체다. 왕과 하얀 토끼, 모자 장수라고 불리는 객체들은 하트 잭을 재판하기 위해 서로 협력하고 있다. 즉, 이야기에 등장하는 객체들은 하트 잭의 재판이라는 동일한 목적을 달성하기 위해 협력하고 있다.
왕의 증인 호출 요구(요청), 증인의 입장(응답) 등의 과정을 통해 협력이 이뤄진다.
어떤 등장인물들이 특정한 요청을 받아들일 수 있는 이유는 그 요청에 대해 적절한 방식으로 응답하는데 필요한 지식과 행동 방식을 가지고 있기 때문이다. 그리고 요청과 응답은 협력에 참여하는 객체가 수행할 책임을 정의한다.
책임
객체지향의 세계에서는 어떤 객체가 어떤 요청에 대해 대답해 줄 수 있거나, 적절한 행동을 할 의무가 있는 경우 해당 객체가 책이믈 가진다고 말한다.
객체의 책임은 '객체가 무엇을 알고 있는가'와 '무엇을 할 수 있는가'로 구성된다.
- 하는것
- 객체를 생성하거나 계산을 하는 등의 스스로 하는것
- 다른 객체의 행동을 시작시키는 것
- 다른 객체의 활동을 제어하고 조절하는 것
- 아는것
- 개인적인 정보에 관해 아는것
- 관련된 객체에 관해 아는것
- 자신이 유도하거나 계산할 수 있는것에 관해 아는것
역할
역할은 협력내에서 다른 객체로 대체할 수 있음을 나타내는 일종의 표식이다. 협력안에서 역할은 "이자는 해당 역할을 수행할 수 있는 어떤 객체라도 대신할 수 있습니다." 라고 말하는 것과 같다. 역할을 대체하기 위해서는 역할이 수신할 수 있는 메시지를 동일한 방식으로 이해해야한다. 메시지가 책임을 의미하기때문에 동일한 역할을 수행할 수 있다는것은 해당 객체들이 협력 내에서 동일한 책임의 집합을 수행할 수 있다는 것을 의미한다. 요약하면 역할의 개념을 사용하면 유사한 협력을 추상화해서 인지 과부하를 줄일 수 있다. 또한 다양한 객체들이 협력에 참여할 수 있기 때문에 협력이 좀더 유연해지며 다양한 객체들이 동일한 협력에 참여할 수 있디 떄문에 재사용성이 높아진다. 역할은 객체 지향설계의 단순성, 유연성, 재사용성을 뒷받침하는 핵심 개념이다.