객체지향의 사실과 오해(역할, 책임, 협력 관점에서 본 객체지향) ‐ 협력하는 객체들의 공동체 - thought-corner/backend-roadmap GitHub Wiki
TL;DR
객체를 스스로 생각하고 스스로 결정하는 현실 세계 생명체에 비유하는 것은 상태와 행위를 캡슐화하는 소프트웨어 객체의 자율성을 설명하는 데 효과적이다.
역할은 어떤 협력에 참여하는 특정한 사람이 협력 안에서 차지하는 책임이나 임무를 의미한다. 어떤 사람이 손님이라면 그 사람은 커피를 주문하는 임무를 맡게 되는 것이고 캐셔는 손님으로부터 주문을 받아야만 한다. 바리스타 역할을 맡은 사람은 주문된 커피를 제조해야 할 책임이 있다.
특정한 역할은 특정한 책임을 암시한다. 협력에 참여하며 특정한 역할을 수행하는 사람들은 역할에 적합한 책임이란 것을 수행하게 된다.
사람 = 객체
에이전트의 요청 = 메시지
에이전트가 요청을 처리하는 방법 = 메서드
애플리케이션의 기능은 더 작은 책임으로 분할되고 책임은 적절한 역할을 수행할 수 있는 객체에 의해 수행된다. 객체는 자신의 책임을 수행하는 도중에 다른 객체에게 도움을 요청하기도 한다.
결론적으로 시스템은 역할과 책임을 수행하는 객체로 분할되고 시스템의 기능은 객체 간의 연쇄적인 요청과 응답의 흐름으로 구성된 협력으로 구현된다.
RFC 1
결국 객체는 애플리케이션 기능을 구현하기 위해 존재하는 최소 단위가 아닐까 생각했다.
일반적으로 객체는 다른 객체와의 협력을 통해 기능을 구현하게 된다.
협력 공동체의 일원으로서 객체는 2가지 자격요건을 갖추어야 할 것이다.
객체는 충분히 '협력적'이어야 한다. ⭢ 객체는 다른 객체의 요청에 귀 기울이고 다른 객체에게 적극적으로 도움을 요청할 정도로 오픈 마인드여야 한다. 외부의 도움을 무시한 채 모든 것을 스스로 처리하려고 하는 전지전능한 객체(God Object)는 지양하는 것이 좋다.
객체는 충분히 '자율적'이어야 한다. ⭢ '자율적'이라는 단어의 뜻은 '자기 스스로의 원칙에 따라 어떤 일을 하거나 자기 스스로를 통제하여 절제하는 것'을 의미한다.
RFC 2
객체를 상태(state)와 행동(behavior)을 함께 지닌 실체라고 정의할 수 있다.
객체가 협력에 참여하기 위해 어떤 행동을 해야한다면 그 행동을 하는 데 필요한 상태도 함께 지니고 있어야 한다. 예를 들어 커피를 제조하는 바리스타가 제조 방법을 모른다는 것이 말이 안되는 것처럼 말이다.
객체가 협력에 참여하는 과정 속에서 스스로 판단하고 스스로 결정하는 자율적인 존재로 남기 위해서는 필요한 행동과 상태를 함께 지니고 있어야 한다.
이런 객체의 자율성은 객체 내/외부를 명확하게 구분하는 것으로부터 나온다. 객체는 다른 객체가 무엇(what)을 수행하는지는 알 수 있지만 어떻게(how) 수행하는지에 대한 부분은 알 수 없다.(=구체에 의존하기보다 추상화에 의존한다)
TA
객체지향이란 시스템을 상호작용하는 자율적인 객체들의 공동체로 바라보고 객체를 이용해 시스템을 분할하는 방법이다.
자율적인 객체란 상태와 행위를 함께 지니며 스스로 자기 자신을 책임지는 객체를 의미한다.
객체는 시스템의 행위를 구현하기 위해 다른 객체와 협력한다. 각 객체는 협력 내에서 정해진 역할을 수행하며 역할은 관련된 책임의 집합이다.
객체는 다른 객체와 협력하기 위해 메시지를 전송하고 메시지는 수신한 객체는 메시지를 처리하는 데 적합한 메서드를 자율적으로 선택한다.