04. 역할, 책임, 협력
중요한 것은 개별 객체가 아니라 객체들 사이에 이뤄지는 협력이다.
객체의 모양을 빚는 것은 객체가 참여하는 협력이다
- 어떤 협력에 참여하는지가 객체에 필요한 행동을 결정하고, 필요한 행동이 객체의 상태를 결정한다.
협력
협력은 한 사람이 다른 사람에게 도움을
요청
할 때 시작된다.협력은 다수의 요청과 응답으로 구성되며 전체적으로 협력은 다수의 연쇄적인 요청과 응답의 흐름으로 구성된다.
요청과 응답은 협력에 참여하는 객체가 수행할 책임을 정의한다.
책임
어떤 객체가 어떤 요청에 대해 대답해 줄 수 있거나, 적절한 행동을 할 의무가 있는 경우 해당 객체가
책임
을 가진다고 말한다.“객체지향 개발에서 가장 중요한 능력은 책임을 능숙하게 소프트웨어 객체에 할당하는 것이다”
책임의 분류
협력에 참여하는 객체들은 목표를 달성하는 데 필요한
책임
을 수행한다.객체의
책임
은 ‘객체가 무엇을 알고 있는가’와 ‘무엇을 할 수 있는가’로 구성된다.- 객체의 책임
- 하는 것(doing)
- 객체를 생성하거나 계산을 하는 등의 스스로 하는 것
- 다른 객체의 행동을 시작시키는 것
- 다른 객체의 활동을 제어하고 조절하는 것
- 아는 것(knowing)
- 개인적인 정보에 관해 아는 것
- 관련된 객체에 관해 아는 것
- 자신이 유도하거나 계산할 수 있는 것에 관해 아는 것
- 하는 것(doing)
책임은 객체지향 설계의 품질을 결정하는 가장 중요한 요소다.
- 책임은 객체의 외부에 제공해 줄 수 있는 정보(아는 것의 측면)와 외부에 제공해 줄 수 있는 서비스(하는 것의 측면)의 목록이다.
- 책임은 객체의 공용 인터페이스(public interface)를 구성한다.
책임과 메시지
객체가 다른 객체에게 주어진 책임을 수행하도록 요청을 보내는 것을
메시지 전송
이라고 한다.메시지는 협력을 위해 한 객체가 다른 객체로 접근할 수 있는 유일한 방법이다.
역할
- 역할은 객체지향 설계의
단순성(simplicity)
,유연성(flexibility)
,재사용성(reusability)
을 뒷받침하는 핵심 개념이다.
협력의 추상화
- 역할의 가장 큰 가치는 하나의 협력 안에 여러 종류의 객체가 참여할 수 있게 함으로써 협력을 추상화할 수 있다는 것
대체 가능성
역할은 협력 안에서 구체적인 객체로 대체될 수 있는 추상적인 협력자다.
역할의 대체 가능성은 행위 호환성을 의미하고, 행위 호환성은 동일한 책임의 수행을 의미한다.
객체의 모양을 결정하는 협력
- 객체지향의 핵심은 클래스를 어떻게 구현할 것인가가 아니라 객체가
협력
안에서 어떤책임
과역할
을 수행할 것인지를 결정하는 것이다.
협력을 따라 흐르는 객체의 책임
*협력을 설계*한다는 것은 설계에 참여하는 객체들이 주고받을 *요청과 응답의 흐름을 결정*한다는 것이다.
- 협력이라는 문맥에서 객체가 수행하게 될 적절한 책임, 즉 *행동을 결정한 후에 그 행동을 수행하는 데 필요한 데이터를 고민*해야 한다.
- 그리고 객체가 협력에 참여하기 위해 필요한 *데이터와 행동이 어느 정도 결정된 후에 클래스의 구현 방법을 결정*해야 한다.
- 각 객체가 가져야 하는 상태와 행위에 대해 고민하기 전에 그 객체가 참여할 문맥인 협력을 정의하라.
객체지향 설계 기법
책임-주도 설계(Responsibility-Driven Design)
- 협력에 필요한 책임들을 식별하고 적합한 객체에게 책임을 할당하는 방식으로 애플리케이션을 설계
디자인 패턴(Design Pattern)
- 전문가들이 반복적으로 사용하는 해결 방법을 정의해 놓은 설계 템플릿의 모음
**테스트-주도 개발(Test-Driven Development)
- 테스트를 먼저 작성하고 테스트를 통과하는 구체적인 코드를 추가하면서 애플리케이션을 완성해가는 방식
책임-주도 설계
객체지향 설계의 핵심은 올바른 책임을 올바른 객체에게 할당하는 것
시스템의 책임을 객체의 책임으로 변환하고, 각 객체가 책임을 수행하는 중에 필요한 정보나 서비스를 제공해줄 협력자를 찾아 해당 협력자에게 책임을 할당하는 순차적인 방식으로 객체들의 협력 공동체를 구축
개별적인 객체의 상태가 아니라 객체의
책임
과상호작용
에 집중협조적이고 성실한 객체 시민들로 구성된 객체지향 시스템을 설계하는 절차
- 시스템이 사용자에게 제공해야 하는 기능인 시스템
책임
을 파악 - 시스템 책임을 더 작은 책임으로 분할
- 분할된 책임을 수행할 수 있는 적절한 객체 또는
역할
을 찾아 책임을 할당 - 객체가 책임을 수행하는 중에 다른 객체의 도움이 필요한 경우 이를 책임질 적절한 객체 또는 역할을 찾기
- 해당 객체 또는 역할에게 책임을 할당함으로써 두 객체가
협력
- 시스템이 사용자에게 제공해야 하는 기능인 시스템
디자인 패턴
유사한 상황에서 반복적으로 적용할 수 있는 책임-주도 설계의 결과물
공통으로 사용할 수 있는 역할, 책임, 협력 템플릿
테스트-주도 개발
- 테스트를 작성하는 것이 아니라 책임을 수행할 객체 또는 클라이언트가 기대하는 객체의 역할이 메시지를 수신할 때 어떤 결과를 반환하고 그 과정에서 어떤 객체와 협력할 것인지에 대한 기대를 코드의 형태로 작성하는 것