Search
📖

[객체 지향의 사실과 오해] 4장. 역할, 책임, 협력

1. 협력

1.1 요청하고 응답하며 협력하는 사람들

협력은 한 사람이 다른 사람에게 도움을 요청할 때 시작됨
협력은 다수의 요청과 응답으로 구성되며 전체적으로 협력은 다수의 연쇄적인 요청과 응답의 흐름으로 구성됨

1.2 재판 속의 협력

재판속 협력
누군가가 왕에게 재판을 요청함으로써 재판이 시작된다.
왕이 하얀 토끼에게 증인을 부를 것을 요청한다.
왕의 요청을 받은 토끼는 모자 장수에게 증인석으로 입장할 것을 요청한다.
모자 장수는 증인석에 입장함으로써 토끼의 요청에 응답한다.
모자 장수의 입장은 왕이 토끼에게 요청했던 증인 호출에 대한 응답이기도 하다.
이제 왕은 모자 장수에게 증언할 것을 요청한다.
모자 장수는 자신이 알고 있는 내용을 증언함으로써 왕의 요청에 응답한다
특정 등장인물이 특정한 요청을 받아 들일 수 있는 이유는 요청에 대해 적절한 방식으로 응답하는데 필요한 지식과 행동방식을 갖고 있기 때문이다.
요청과 응답은 협력에 참여하는 객체가 수행할 책임을 정의한다.

2. 책임

어떤 객체가 어떤 요청에 대해 대답해 줄 수 있거나, 적절한 행동을 할 의무가 있는 경우 해당 객체가 책임을 가진다.
어떤 대상에 대한 요청은 그 대상이 요청을 처리할 책임이 있음을 의미한다.
예) 왕: 재판을 수행하라 라는 요청에 응답해야하므로 재판을 수행할 책임이 있음

2.1 책임의 분류

크레이그 라만의 책임의 분류
무엇을 할 수 있는가(doing)
객체를 생성하거나 계산을 하는 등의 스스로 하는 것
다른 객체의 행동을 시작시키는 것
다른 객체의 활동을 제어하고 조절하는 것
객체가 무엇을 알고 있는가(knowing)
개인적인 정보에 관해 아는 것
관련된 객체에 관해 아는 것
자신이 유도하거나 계산할 수 있는 것에 관해 아는 것
모자 장수
스스로 증인석에 입장해야 할 책임
모자 장수의 역할은 증인으로서의 책임도 있음. 그건 아는 것이 아니라 하는 것임
사실을 증언해야 할 책임
property의 개념. 모자장수가 또 다른 객체와의 협력을 통해 증언의 정보를 프로퍼티에 담고 있음. 이는 아는 것
외부에서 접근 가능한 공용 서비스 관점에서의 객체의 책임
객체의 외부에 제공 해 줄 수 있는 정보(아는 것의 측면. 객체의 프로퍼티)
외부에 제공해줄 수 있는 서비스(하는 것의 측면. 비즈니스 로직)
책임은 객체의 공용 인터페이스를 구성한다.
예시

2.2 책임과 메시지

메세지 전송(message-send)
객체가 다른 객체에게 주어진 책임을 수행하도록 요청을 보내는 것
두 객체간의 협력은 메세지를 통해 이루어짐
송신자: 메세지를 전송함으로써 협력을 요청하는 객체
수신자: 메세지를 받아 요청을 처리하는 객체
책임은 객체가 협력에 참여하기 위해 수행해야 하는 행위를 상위 수준에서 개략적으로 서술한 것
메세지는 책임을 구체화
책임은 상위 레벨의 개념
메세지는 하위 레벨의 개념
객체지향 설계: 협력에 참여하기 위해 어떤 객체가 어떤 책임을 수행해야 하고 어떤 객체로부터 메시지를 수신할 것인지를 결정하는 것으로부터 시작

3. 역할

3.1 책임의 집합이 의미하는 것

어떤 객체가 수행하는 책임의 집합은 객체가 협력 안에서 수행하는 역할을 암시한다.
판사와 증인이라는 역할을 사용하면 여러 경우의 협력을 하나의 협력으로 추상화할 수 있음.
역할
책임
객체
증인
증언한다 / 증인석에 입장한다
COUNT2

3.2 역할은 답이다

동일한 역할 수행 가능 = 협력 내 동일한 책임의 집합을 수행할 수 있는 것을 의미 동일한 역할 수행 객체들은 동일한 메세지를 수신할 수 있기 때문
유사한 협력을 추상화해서 인지 과부하를 줄일 수 있다.
역할은 객체 지향 설계의 단순성, 유연성, 재사용성을 뒷받침하는 핵심 개념

3.3 협력의 추상화

역할은 협력을 추상화 할 수 있음
하나의 협력안에 여러 종류의 객체를 참여할 수 있게 함
예시) 판사 - 증인
왕-모자장수의 협력
왕-요리사의 협력
여왕-엘리스의 협력

3.4 대체 가능성

역할은 협력안에서 구체적인 객체로 대체될 수 있는 추상적인 협력자
역할은 다른 객체에 의해 대체 가능함을 의미
객체는 역할이 암시하는 책임보다 더 많은 책임을 가질 수있음
왕: 재판의 책임/ 국정을 돌보는 책임
모자 장수: 증인의 책임/ 모자 판매의 책임
객체의 타입과 역할 사이에는 일반화/특수화 관계가 성립
일반화: 좀 더 일반적인 개념을 의미
특수화: 좀 더 구체적인 개념을 의미

4. 객체의 모양을 결정하는 협력

4.1 흔한 오류

선입견 1 - 객체는 시스템에 필요한 데이터를 저장하기 위해 존재한다
데이터는 객체가 행위를 수행하기 위한 재료일 뿐
객체 존재 이유는 행위를 수행하며 협력에 참여하기 위함
객체의 행동, 책임이 제일 중요함
선입견 2 - 객체지향이 클래스와 클래스 간의 관계를 표현하는 시스템의 정적인 측면에 중점을 둔다
클래스는 객체를 표현하는 한가지의 매커니즘에 불과함
객체가 협력 안에서 어떠한 책임과 역할을 수행할 건지를 결정하는 것

4.2 협력을 따라 흐르는 객체의 책임

객체 설계를 위해서는 견고하고 깔끔한 협력을 설계해야함
협력 설계? 설계에 참여하는 객체들이 주고받을 요청과 응답의 흐름을 결정한다는 것을 의미
요청과 응답의 흐름은 객체들이 협력에 수행할 책임이 된다.
책임 = (외부에 제공하게될) 행동
행동 후에 상태(데이터), 클래스 구현 방법등을 결정
예시)
재판이라는 협력
누군가는 재판을 진행, 누군가는 증인을 부름, 누군가는 증언한다.
협력 구성을 위한 책임을 고안 후 책임에 필요한 객체를 선택
왕, 하얀토끼, 모자 장수에게 책임 할당
위의 객체들이 외부에 제공하게될 행동을 정의
행동 정의 후 각 객체들이 필요한 데이터 정의
협력이라는 실행 문맥 안에 책임을 분배 → 객체의 행위에 초점을 맞출 수 있음

5. 객체지향 설계 기법

5.1. 책임 주도 설계

올바른 책임을 올바른 객체에게 할당하는 것
객체의 책임을 중심으로 시스템을 구축하는 설계 방법
책임 주도 설계 절차
1.
시스템이 사용자에게 제공해야 하는 기능인 시스템 책임을 파악한다.
2.
시스템 책임을 더 작은 책임으로 분할한다.
3.
분할된 책임을 수행할 수 있는 적절한 객체 또는 역할을 찾아 책임을 할당한다.
4.
객체가 책임을 수행하는 중에 다른 객체의 도움이 필요한 경우 이를 책임질 적절한 객체 또는 역할을 찾는다.
5.
해당 객체 또는 역할에게 책임을 할당함으로써 두 객체가 협력하게 한다.

5.2. 디자인 패턴

COMPOSITE 패턴
전체와 부분을 하나의 단위로 추상화 해야하는 경우에 사용 가능
디렉토리와 파일간의 관계
디렉토리 내 디렉토리를 넣고 싶은 경우

5.3. 테스트-주도 개발

단순히 테스트를 작성하는 것이 아님
책임을 수행할 객체가 기대하는 객체의 역할이 메세지를 수신할 때, 어떤 결과를 반환하고, 그 과정에서 어떤 객체와 협력할 건지에 대한 기대를 코드의 형태로 작성한 것