객체지향의 사실과 오해(역할, 책임, 협력 관점에서 본 객체지향) ‐ 협력하는 객체들의 공동체 - thought-corner/backend-roadmap GitHub Wiki

TL;DR

  • 객체를 스스로 생각하고 스스로 결정하는 현실 세계 생명체에 비유하는 것은 상태와 행위를 캡슐화하는 소프트웨어 객체의 자율성을 설명하는 데 효과적이다.
  • 역할은 어떤 협력에 참여하는 특정한 사람이 협력 안에서 차지하는 책임이나 임무를 의미한다. 어떤 사람이 손님이라면 그 사람은 커피를 주문하는 임무를 맡게 되는 것이고 캐셔는 손님으로부터 주문을 받아야만 한다. 바리스타 역할을 맡은 사람은 주문된 커피를 제조해야 할 책임이 있다.
  • 특정한 역할은 특정한 책임을 암시한다. 협력에 참여하며 특정한 역할을 수행하는 사람들은 역할에 적합한 책임이란 것을 수행하게 된다.
    • 사람 = 객체
    • 에이전트의 요청 = 메시지
    • 에이전트가 요청을 처리하는 방법 = 메서드
  • 애플리케이션의 기능은 더 작은 책임으로 분할되고 책임은 적절한 역할을 수행할 수 있는 객체에 의해 수행된다. 객체는 자신의 책임을 수행하는 도중에 다른 객체에게 도움을 요청하기도 한다.
  • 결론적으로 시스템은 역할과 책임을 수행하는 객체로 분할되고 시스템의 기능은 객체 간의 연쇄적인 요청과 응답의 흐름으로 구성된 협력으로 구현된다.

RFC 1

  • 결국 객체는 애플리케이션 기능을 구현하기 위해 존재하는 최소 단위가 아닐까 생각했다.
  • 일반적으로 객체는 다른 객체와의 협력을 통해 기능을 구현하게 된다.
  • 협력 공동체의 일원으로서 객체는 2가지 자격요건을 갖추어야 할 것이다.
    • 객체는 충분히 '협력적'이어야 한다. ⭢ 객체는 다른 객체의 요청에 귀 기울이고 다른 객체에게 적극적으로 도움을 요청할 정도로 오픈 마인드여야 한다. 외부의 도움을 무시한 채 모든 것을 스스로 처리하려고 하는 전지전능한 객체(God Object)는 지양하는 것이 좋다.
    • 객체는 충분히 '자율적'이어야 한다. ⭢ '자율적'이라는 단어의 뜻은 '자기 스스로의 원칙에 따라 어떤 일을 하거나 자기 스스로를 통제하여 절제하는 것'을 의미한다.

RFC 2

  • 객체를 상태(state)와 행동(behavior)을 함께 지닌 실체라고 정의할 수 있다.
  • 객체가 협력에 참여하기 위해 어떤 행동을 해야한다면 그 행동을 하는 데 필요한 상태도 함께 지니고 있어야 한다. 예를 들어 커피를 제조하는 바리스타가 제조 방법을 모른다는 것이 말이 안되는 것처럼 말이다.
  • 객체가 협력에 참여하는 과정 속에서 스스로 판단하고 스스로 결정하는 자율적인 존재로 남기 위해서는 필요한 행동과 상태를 함께 지니고 있어야 한다.
  • 이런 객체의 자율성은 객체 내/외부를 명확하게 구분하는 것으로부터 나온다. 객체는 다른 객체가 무엇(what)을 수행하는지는 알 수 있지만 어떻게(how) 수행하는지에 대한 부분은 알 수 없다.(=구체에 의존하기보다 추상화에 의존한다)

TA

  • 객체지향이란 시스템을 상호작용하는 자율적인 객체들의 공동체로 바라보고 객체를 이용해 시스템을 분할하는 방법이다.
  • 자율적인 객체란 상태와 행위를 함께 지니며 스스로 자기 자신을 책임지는 객체를 의미한다.
  • 객체는 시스템의 행위를 구현하기 위해 다른 객체와 협력한다. 각 객체는 협력 내에서 정해진 역할을 수행하며 역할은 관련된 책임의 집합이다.
  • 객체는 다른 객체와 협력하기 위해 메시지를 전송하고 메시지는 수신한 객체는 메시지를 처리하는 데 적합한 메서드를 자율적으로 선택한다.