[객사오] 4. 역할, 책임, 협력
2023. 7. 26. 17:05ㆍComputer Sciences/OOP
협력
- 요청과 응답으로 연결되는 네트워크
- 한 사람이 다른 사람에게 도움을 요청할 때 시작
- 요청을 받은 사람은 일을 처리한 후 요청한 사람에게 필요한 지식이나 서비스를 제공하는 것으로 응답
- 다수의 요청과 응답으로 구성됨
- 전체적으로 다수의 연쇄적인 요청과 응답의 흐름으로 구성됨
책임
- 어떤 객체가 어떤 요청에 대해 대답해줄 수 있거나 적절한 행동을 할 의무
- 객체지향 설계의 품질을 결정하는 가장 중요한 요소
- 적절한 객체에게 적절한 책임을 할당해야 함
분류
하는 것 (doing)
- 객체를 생성하거나 계산을 하는 등의 스스로 하는 것
- 다른 객체의 행동을 시작시키는 것
- 다른 객체의 활동을 제어하고 조절하는 것
아는 것 (knowing)
- 개인적인 정보에 관해 아는 것
- 관련된 객체에 관해 아는 것
- 자신이 유도하거나 계산할 수 있는 것에 관해 아는 것
💡 책임은 객체의 외부에 제공해줄 수 있는 정보(아는 것)와 서비스(하는 것)의 목록이다. 따라서 객체의 공용 인터페이스(public interface)이다.
책임과 메시지
- 메시지 전송(message-sned): 객체가 다른 객체에게 주어진 책임을 수행하도록 요청을 보내는 것
💡 책임이 협력에서 요청을 수신하는 한 쪽의 객체 관점에서 무엇을 할 수 있는지 나열한 것이라면 메시지는 협력에 참여하는 두 객체 사이의 관계를 강조한 것이다.
⚠️ 책임과 메시지의 수준은 같지 않다. 책임은 객체가 협력에 참여하기 위해 수행해야 하는 행위를 상위 수준에서 개략적으로 서술한 것이다. 책임을 결정한 후 실제로 협력을 정제하면서 이를 메시지로 변환하라 때는 하나의 책임이 여러 메시지로 분할되는 것이 일반적이다.
역할
- 협력 내에서 다른 객체로 대체할 수 있음을 나타내는 일종의 표식
💡 역할을 대체하기 위해서는 각 역할이 수신할 수 있는 메시지를 동일한 방식으로 이해해야 한다. 따라서 역할을 대체할 수 있는 객체는 동일한 메시지를 이해할 수 있는 객체로 한정된다. 이는 객체지향 설계의 단순성(simplicity), 유연성(flexibility), 재사용성(reusability)을 뒷받침하는 핵심 개념이다.
협력의 추상화
- 하나의 협력 안에 여러 종류의 객체가 참여할 수 있게 함으로써 협력을 추상화
- 역할의 가장 큰 가치
- 설계자가 다뤄야 하는 협력의 개수 감소
- 구체적인 객체를 추상적인 역할로 대체함으로써 협력을 단순화
- 결과적으로 애플리케이션의 설계를 이해하고 기억하기 쉬워짐
대체 가능성
- 객체가 역할을 대체 가능하기 위해서는 협력 안에서 역할이 수행하는 모든 책임을 동일하게 수행할 수 있어야 함
💡 객체는 역할이 암시하는 책임보다 더 많은 책임을 가질 수 있다. 따라서 대부분의 경우에 객체의 타입과 역할 사이에는 일반화/특수화 관계가 성립하는 것이 일반적이다. 역할이 협력을 추상적으로 만들 수 있는 이유는 역할 자체가 객체의 추상화이기 때문이다.
객체의 모양을 결정하는 협력
협력을 따라 흐르는 객체의 책임
- 올바른 객체를 설계하기 위해서는 먼저 견고하고 깔끔한 협력 설계 필요
- 협력을 설계한다는 것 = 설계에 참여하는 객체들이 주고받을 요청과 응답의 흐름을 결정한다는 것
- 이렇게 결정된 요청과 응답의 흐름은 객체가 협력에 참여하기 위해 수행될 책임이 됨
- 객체에게 책임을 할당하고 나면 책임은 객체가 외부에 제공하게 될 행동이 됨
- 협력이라는 문맥에서 객체가 수행하게 될 적절한 책임, 즉 행동을 결정한 후에 그 행동을 수행하는 데 필요한 데이터를 고민해야 함
- 객체가 협력에 참여하기 위해 필요한 데이터와 행동이 어느 정도 결정된 후에 클래스의 구현 방법을 결정해야 함
💡 객체지향이 올바른 객체에 올바른 책임을 할당하는 것과 관련된 모든 것이라면 협력이라는 문맥 안에서 객체를 생각하는 것은 올바른 객체지향 애플리케이션을 구현하는 것과 관련된 모든 것이다.
💡 객체의 행위에 초점을 맞추기 위해서는 협력이라는 실행 문맥 안에서 책임을 분배해야 한다. 각 객체가 가져야 하는 상태와 행위에 대해 고민하기 전에 그 객체가 참여할 문맥인 협력을 정의하라. 객체지향 시스템에서 가장 중요한 것은 충분히 자율적이면서 협력적인 객체를 창조하는 것이다. 이 목표를 달성할 수 있는 가장 쉬운 방법은 객체를 충분히 협력적으로 만든 후에 협력이라는 문맥 안에서 객체를 충분히 자율적으로 만드는 것이다.
객체지향 설계 기법
책임-주도 설계
- 객체의 책임을 중심으로 시스템을 구축하는 설계 방법
- 시스템의 기능은 더 작은 규모의 책임으로 분할되고 각 책임은 책임을 수행할 적절한 객체에게 할당
- 객체가 책임을 수행하는 도중 스스로 처리할 수 없는 정보나 기능이 필요한 경우 적절한 객체를 찾아 필요한 작업 요청
- 요청된 작업을 수행하는 일은 작업을 위임받은 객체의 책임으로 변환
- 객체가 다른 객체에게 작업을 요청하는 행위를 통해 결과적으로 객체들 간의 협력 관계 형성
💡 만약 책임을 여러 종류의 객체가 수행할 수 있다면 협력자는 객체가 아니라 추상적인 역할로 대체된다.
협조적인 객체지향 시스템 설계 절차
- 시스템이 사용자에게 제공해야 하는 기능인 시스템 책임 파악
- 시스템 책임을 더 작은 책임으로 분할
- 분할된 책임을 수행할 수 있는 적절한 객체 또는 역할을 찾아 책임 할당
- 객체가 책임을 수행하는 중 다른 객체의 도움이 필요한 경우 이를 책임질 적절한 객체 또는 역할 찾기
- 해당 객체 또는 역할에게 책임을 할당함으로써 두 객체의 협력 형성
💡 역할, 책임, 협력은 유연하고 견고한 객체지향 시스템을 만드는 데 필요한 가장 중요한 재료다. 이에 집중하라.
'Computer Sciences > OOP' 카테고리의 다른 글
[객사오] 3. 타입과 추상화 (0) | 2023.07.26 |
---|---|
[객사오] 2. 이상한 나라의 객체 (0) | 2023.07.25 |
[객사오] 1. 협력하는 객체들의 공동체 (0) | 2023.07.25 |
[OOP] 헥사고날 아키텍처 맛보기 (0) | 2023.07.24 |