오브젝트: 코드로 이해하는 객체지향 설계 3장을 읽으며
오브젝트: 코드로 이해하는 객체지향 설계 3장을 읽으며
느낀점
역할, 책임, 협력의 중요성에 대해 새롭게 이해하게 되었음. 특히 협력(collaboration)을 시작점으로, 이 협력 속에서 필요한 역할(role)을 정의하고, 적절한 객체(object)를 선택해 각 역할을 수행하게 하는 구조가 인상적이었음.
객체는 구체적으로 클래스를 인스턴스화한 존재로서, 역할에 따라 협력 속에서 유기적으로 연결되고 책임을 다하도록 설계된다는 점.
역할, 책임, 협력
객체지향 패러다임에서 핵심은 역할(role), 책임(responsibility), 협력(collaboration)
- 객체지향의 본질을 협력하는 개체들의 공동체를 창조하는 것.
- 협력을 구성하기 위해 적절한 객체를 찾고 적절한 책임을 할당하는 과정에서 드러남
- 역할, 책임, 협력이 제자리를 찾지 못한다면 응집도 높은 클래스와 중복 없느 상속 계층을 구현한다고 하더라도 애플리케이션이 침몰할 수 있음.
- 협력:객체들이 애플리케이션의 기능을 구현하기 위해 수행하는 상호작용을 협력이라고 함.
- 책임: 객체가 협력에 참여하기 위해 수행하는 로직을 책임이라고 부름
- 역할: 객체들이 협력안에서 수행하는 책임들이 모여 객체가 수행하는 역할을 구성.
협력
객체는 고립된 존재가 아니라 기능이라는 더 큰 목표 달성을 위해 협력하는 사회적 존재
- 객체의 협력은 다른 객체에 도움을 요청할 때 시작
- 메시지 전송(message send)는 객체 사이의 협력을 위해 사용할 수 있는 유일한 커뮤니케이션 수단
- 메시지를 수신한 객체는 메서드를 실행해 요청에 응답.
- 객체를 자율적으로 만드는 가장 기본적인 방법은 내부 구현을 캡슐화하는 것
협력이 설계를 위한 문맥 결정
상태는 객체가 행동하는 데 필요한 정보에 의해 결정되고 행동은 객체가 처리할 메시지로 결정됨.
- 협력은 객체를 설계하는 데 필요한 일종의 문맥(context)를 제공
책임
협력에 참여하기 위해 객체가 수행하는 행동을 책임이라고 부름
- 하는 것(doing)
- 객체를 생성하거나 계산을 수행하는 등의 스스로 하는 것.
- 다른 객체의 행동을 시작시키는 것
- 다른 객체의 활동을 제어하고 조절하는 것
- 아는 것(knowing)
- 사적인 정보에 관해 아는 것
- 관련된 객체에 관해 아는 것
- 자신이 유도하거나 개선할 수 있는 것에 대해 아는 것
책임 할당
자율적인 객체를 만드는 가장 기본적인 방법은 책임을 수행하는 데 필요한 정보를 전문가에 할당하는 것
- INFORMATION EXPERT(정보 전달) 패턴이라고 부름
책임 주도 설계
책임을 찾고 책임을 수행할 적절한 객체를 찾아 책임을 할당하는 방식으로 협력을 설계하는 방법
- INFORMATION EXPERT(정보 전달) 패턴이라고 부름
- 협력은 객체를 설계하기 위한 구체적인 문맥을 제공
- 책임 주도 설계는 자연스럽게 객체의 구현이 아닌 책임에 집중할 수 있음.
메시지가 객체를 결정한다
객체에게 책임을 할당하는 데 필요한 메시지를 먼저 식별하고 메시지를 처리할 객체를 나중에 선택하는 것이 중요.
- 최소한의 인터페이스(minimal interface)
- 객체의 퍼블릭 인터페이스에 어떤 것도 추가하지 않기 땜문에 꼭 필요한 크기의 인터페이스를 가질 수 있음.
- 추상적인 인터페이스(abstract interface)
- 무엇(what)을 하는지 표현해야 하지만 어떻게(how) 수행하는지를 노출해서는 안됨.
행동이 상태를 결정한다
객체가 존재하는 이유는 협력에 참여하기 위해서
- 객체 내부 구현에 초점을 맞춘 설계 방법을 데이터 주도 설계(Data-Dreven Design)이라고 한다.
- 협력 관계 속에서 다른 객체에게 무엇을 제공해야 하고 다른 객체로부터 무엇을 얻어야 하는지를 고민해야 휼룡한 책임을 수확할 수 있음.
- 상태는 단지 객체가 행동을 정상적으로 수행하기 위해 필요한 재료일 뿐
역할과 협력
역할의 구현
- 역할의 구현은 가장 일반적으로 추상 클래스와 인터페이스를 사용하는 것.
객체 대 역할
역할은 객체가 참여할 수 있는 일종의 슬롯
- 적합한 책임을 수행하는 대상이 한 종류라면 간단하게 객체로 간주
- 여러 종류의 객체들이 참여할 수 있다면 역할
협력(collaboration) --> reference --> 역할(role) --> select from --> 객체(object) -- instance of --> 클래스(class)
역할은 유연하고 확장 가능하며 일관된 구조를 가지는 시스템을 구축하는 데 매우 중요
- 역할을 설계 중심 개념으로 보는 역할 모델링(Role Modeling)이라고 함