인간이 가지고 있는 본연의 특성이라는 관점에서 인간은 이기적이고 합리적인 존재
그러나, 타인과 관계를 맺는 과정속에서 인간은 본연의 특성을 배제하고 자신의 이익을 최소하는 불합리한 선택
개인이 처해있는 정황 혹은 문맥이 인간의 행동 방식을 결정한다.
문맥 : 타인과의 협력
객체지향에 갓입문한 사람들의 가장 흔한 실수는 협력이라는 문맥을 고려하지 않은채 객체가 가져야할 상태와 행동부터 고민하기 시작한다는 것
협력
- 협력을 위해 객체 사이에 요청/응답이 존재
- 요청과 응답은 협력에 참여하는 객체가 수행할 책임을 정의
책임
- 책임 : 어떤 객체가 요청에 대해 응답할 수 있거나, 적절한 행동을 할 의무가 있는 경우 (능력, 의무)
- 객체가 무엇을 알고 있는가 + 무엇을 할 수 있는가 ⇒ 객체의 책임
- 아는것 = 외부에 제공해 줄 수 있는 정보
- 하는것 = 외부에 제공해 줄 수 있는 서비스
- 메시지 → 상호 협력하는 문맥 강조
- 객체가 어떤 책임을 수행하고, 어떤 객체로 부터 메시지를 수신할 것 인지 결정하는 것이 시작
역할
- 객체가 수행하는 책임의 집합은 객체가 협력 안에서 수행하는 역할을 암시
- 역할은 협력 내에서 다른 객체로 대체될 수 있음을 나타냄
- 대체할 수 있는 객체 : 동일한 메시지를 이해할 수 있는 객체
- 역할 ⇒ 단순성, 유연성, 재사용성
객체의 모양을 결정하는 협력
- 협력 설계 = 객체들이 주고받을 요청과 응답의 흐름을 결정 ⇒ 응답의 흐름 = 책임
- 협력에 필요한 책임을 결정하고 객체에게 책임을 할당하는 과정을 얼마나 합리적이고 적절하게 수행했는지가 객체지향 설계의 품질을 결정한다.
객체지향 설계 기법
- 책임 주도 설계
- 협력에 필요한 책임 식별 (작은 책임)
- 적합한 객체에 책임 할당 (올바른 책임을 올바른 객체에게 할당)
- 도움이 필요한 경우 요청할 객체(역할) 연결 → 협력
- 디자인 패턴
- 반복적으로 사용하는 해결 방법 템플릿 ( 책임주도 설계의 결과물)
- 이미 식별해놓은 역할, 책임, 협력
- 문제를 정확히 인식하는 것이 중요!
- 테스트주도 개발
- 테스트 작성
객체가 이미 존재한다고 가정하고, 어떤 메시지를 전송할 지 생각
- 테스트를 통과하는 가장 간단한 코드 작성
- 리팩토링 ( = 역할, 책임, 협력을 식별 및 피드백)