더 뛰어난 객체 설계를 하기 위해 역할 / 책임 / 협력에 대해 정리한다.
- 객체지향 설계의 전체적인 품질을 결정하는 것은 개별 객체의 품질이 아니라 여러 객체들이 모여 이뤄내는 협력의 품질이다.
- 훌륭한 객체지향 설계자는 객체들 간의 요청과 응답 속에서 창발하는 협력에 초첨을 맞춰 애플리케이션을 설게한다.
- 협력이 자리를 잡으면 저절로 객체의 행동이 드러나고 뒤이어 적절한 객체의 상태가 결정된다.
협력
협력
은 한 사람이 다른 사람에게 도움을요청
할 때 시작된다.- 요청을 받은 사람은 일을 처리한 후 요청한 사람에게 필요한 지식이나 서비스를 제공하는 것으로 요청에
응답
한다. - 다른 사람으로부터 요청을 받은 사람 역시 자신에게 주어진 일을 처리하던 중에 다른 사람의 도움이 필요한 경우가 있다. 결과적으로 협력은 다수의 요청과 응답으로 구성되며 전체적으로 협력은 다수의 연쇄적인 요청과 응답의 흐름으로 구성된다.
재판속에서의 협력
- 누군가가 왕에게 재판을
요청
함으로써 재판이 시작 - 왕이 하얀 토끼에게 증인을 부를 것을
요청
- 왕의 요청을 받은 토끼는 모자 장수에게 증인석으로 입장할 것을
요청
- 모자 장수는 증인석에 입장함으로써 토끼의 요청에
응답
- 모자 장수의 입장은 왕이 토끼에게 요청했떤 증인 호출에 대한
응답
- 이제 왕은 모자 장수에게 증언할 것을
요청
- 모자 장수는 자신이 알고 있는 내용을 증언함으로써 요청에
응답
왕 - 재판을 수행할 의무
가 있으며, 재판에 필요한 지식을 가지고 있음
토끼 - 목격자에 대해 알고 있으며, 목격자를 부를 의무
가 있음
책임
- 객체지향의 세계에서는 어떤 객체가 어떤 요청에 대해 대답해 줄 수 있거나, 적절한 행동을 할 의무가 있는 경우 해당 객체가
책임
을 가진다고 말한다.
왕 - 재판을 수행할 책임
을 가지고 있음
토끼 - 목격자를 불러올 책임
을 가지고 있음
모자 장수 - 증언할 책임
을 가지고 있음
어떤 대상에 대한 요청은 그 대상이 요청을 처리할 책임
이 있음을 암시한다.
객체지향 개발에서 가장 중요한 능력은 책임을 능숙하게 소프트웨어 객체에 할당하는 것.
객체의 책임을 이야기할 때는 일반적으로 외부에서 접근 가능한 공용 서비스의 관점에서 이야기한다.
즉, 책임은 객체의 외부에 제공해 줄 수 있는 정보(아는 것의 측면)와 외부에 제공해 줄 수 있는 서비스(하는 것의 측면)의 목록이다.
따라서 책임은 객체의 공용 인터페이스(public interface)
를 구성한다.
객체지향 설계는 협력에 참여하기 위해 어떤 객체가 어떤 책임을 수행해야 하고 어떤 객체로부터 메시지를 수신할 것인지를 결정하는 것으로부터 시작된다.
역할
어떤 객체가 수행하는 책임의 집합은 객체가 협력 안에서 수행하는 역할을 암시한다.
ex)
모자 장수는 재판이라는 협력 안에서 '증인석에 입장한다' 와 '증언한다'라는 책임을 가진다.
모자 장수는 '증인'이라는 역할
을 수행하고 있다.
역할은 재사용 가능하고 유연한 객체지향 설계를 낳는 매우 중요한 구성요소이다.
'증인'이라는 역할
을 수행하는 요리사라는 객체가 새로이 등장하였다.
요리사는 '증인석에 입장한다', '증언한다'라는 책임을 가지고 있다.
왕은 모자 장수에게 했던 것 처럼 요리사에게 증언할 것을 요청할 수 있다.
'증인'이 모자장수에서 요리사로 바겼다고 협력을 별도로 유지하고 관리해야하는가? 아니다. '증인'이라는 역할(role)을 사용하기 때문에 하나의 협력으로 추상화할 수 있게 된다. 즉, 역할은 협력 내에서 다른 객체로 대체할 수 있음을 나타내는 일종의 표식이다.
동일한 역할을 수행할 수 있다는 것은 해당 객체들이 협력 내에서 동일한 책임의 집합을 수행할 수 있다는 것을 의미한다.
동일한 역할을 수행하는 객체들이 동일한 메시지를 수신할 수 있기 때문에 동일한 책임을 수행할 수 있다는 것은 매우 중요한 개념이다.
역할의 개념을 사용하면 유사한 협력을 추상화해서 인지 과부하를 줄일 수 있다. 또한 다양한 객체들이 협력에 참여할 수 있기 때문에 협력이 좀 더 유연해지며 다양한 객체들이 동일한 협력에 참여할 수 있기 때문에 재사용성이 높아진다.
올바른 객체를 설계하기 위해서는 먼저 협력을 설계해야 한다.
- 객체들이 주고받을 요청과 흐름을 결정한다. - 협력 설계
- 결정된 요청과 응답의 흐름은 객체가 협력에 참여하기 위해 수행될 책임이 된다. - 책임 부여
- 객체에게 책임을 할당하고 나면 책임은 객체가 외부에 제공하게 될 행동이 된다. 협력이라는 문맥에서 객체가 수행하게 될 적절한 책임, 즉 행동을 결정한 후에 그 행동을 수행하는 데 필요한 데이터를 고민한다.
- 객체가 협력에 참여하기 위해 필요한 데이터와 행동이 어느 정도 결정된 후 클래스 구현 방법을 결정한다.
- 클래스와 데이터는 협력과 책임의 집합이 결정된 후에야 무대 위에 등장할 수 있다.
협력 -> 책임 -> 역할
올바른 객체에 올바른 책임을 할당하자.
출처) 객체지향의 사실과 오해
'프로그래밍 노트 > 객체지향프로그래밍' 카테고리의 다른 글
[객체지향] 객체의 책임과 메시지 (0) | 2022.09.11 |
---|---|
[객체지향] 추상화에 대해서 (0) | 2022.09.07 |
[객체지향] 객체 설계시 주의해야할 점 (0) | 2022.09.07 |
[객체지향] 객체지향 프로그래밍에서 객체란 무엇을 뜻하는 것일까? (0) | 2022.09.02 |
[객체지향] 타입과 추상화 (0) | 2020.02.03 |