[객체지향의 사실과 오해] 제 4장 | 역할, 책임, 협력

Jiwoo Kim·2021년 1월 29일
0
post-thumbnail

4장 | 역할, 책임, 협력

🔥 개별 객체의 행동이나 상태가 아닌 객체들 간의 협력에 집중하라
🔥 객체를 충분히 협력적으로 만든 후 협력의 문맥 안에서 객체를 충분히 자율적으로 만들어라


💻 협력

  • 협력은 다수의 연쇄적인 요청응답의 흐름으로 구성된다.
  • 요청과 응답은 협력에 참여하는 객체가 수행할 책임을 정의한다.

💻 책임

  • 어떤 객체에 대한 요청은 그 객체가 요청을 처리할 책임이 있음을 의미한다.
  • 책임을 어떻게 구현할 것인가가 아닌, 어떻게 할당할 것인가가 핵심이다.
  • 책임은 객체의 공용 인터페이스 (public interface)를 구성한다.

분류

  1. 하는 것 doing
  • 객체를 생성하거나 계산을 하는 등 스스로 하는 것
  • 다른 객체의 행동을 시작시키는 것
  • 다른 객체의 활동을 제어하고 조절하는 것
  1. 아는 것 knowing
  • 개인적인 정보에 대해 아는 것
  • 관련된 객체에 대해 아는 것
  • 자신이 유도하거나 계산할 수 있는 것에 대해 아는 것

💻 역할

  • 어떤 객체가 수행하는 책임의 집합은 객체가 협력 안에서 수행하는 역할을 암시한다.
  • 역할의 개념을 사용하면 유사한 협력을 추상화한다.
  • 객체가 역할을 대체 가능하기 위해서는 협력 안에서 역할이 수행하는 모든 책임을 동일하게 수행할 수 있어야 한다.
  • 역할의 대체 가능성행위 호환성을 의미하고, 행위 호환성은 동일한 책임의 수행을 의미한다.

💻 객체의 모양을 결정하는 협력

  1. 견고하고 깔끔한 협력을 설계해야 한다. 즉, 객체들이 주고받을 요청과 응답의 흐름을 결정하여 책임을 정의해야 하는 것이다.
  2. 협력이라는 문맥에서 객체가 수행하게 될 적절한 책임, 즉 행동을 결정해야 한다.
  3. 객체가 행동을 수행하기 위해 필요한 데이터를 결정해야 한다.
  4. 협력에 참여하기 위한 객체의 데이터와 행동이 결정된 후 클래스의 구현 방법을 결정해야 한다.

💻 객체지향 설계 기법

책임-주도 설계 (Responsiblity-Driven Design)

  • 협력에 필요한 책임들을 식별하고 적합한 객체에게 책임을 할당하는 방식
  • 기능은 더 작은 규모의 책임으로 분할되고 각 책임은 적절한 객체에 할당된다.
  • 객체는 자신의 책임 외의 것에 대해 적절한 객체를 찾아 필요한 작업을 요청한다.
  • 결과적으로 요청과 응답을 통한 객체들 간의 협력 관계가 구성된다.

디자인 패턴 (Design Pattern)

  • 책임-주도 설계의 결과로, 반복적으로 사용하는 문제해결을 위한 설계 템플릿(역할, 책임, 협력)의 모음
  • 특정 상황과 문제에 공통으로 사용할 수 있기 때문에 역할과 책임, 협력 관계를 빠르고 손쉽게 포착할 수 있다.

테스트-주도 개발 (Test-Driven Development)

  • 테스트를 먼저 작성하고 테스트를 통과하는 구체적인 코드를 작성하는 방식
  • 객체의 역할이 메시지를 수신할 때 어떤 결과를 반환하고 어떤 협력을 하는지에 대한 기대를 코드의 형태로 작성한다.
  • 객체지향에 대한 깊이 있는 지식과 책임-주도 설계의 원칙에 대한 종합적인 이해가 요구되는 개발 방식이다.

📝 느낀점

객체지향 설계를 할 때 가장 중요한 것은 역시 협력! 항상 협력, 행동, 그리고 상태 순서로 접근하는 것이 좋은 설계의 기반이 된다는 것을 기억하자. 그리고 이 장에서 TDD가 무엇인지 그리고 왜 사용하는지 배울 수 있었다. 테스트를 작성하는 것 자체에 진입장벽을 느끼고 있었는데, 내가 아직 경험이 많이 부족해서 당연히 그렇게 느끼는 게 맞다는 생각이 들었다. 어떤 객체가 어떤 역할을 해야 하는지 미리 정하고, 실제로 그렇게 수행하도록 코드를 짜야 하는데, 애초에 나는 어떤 기능이 필요한 지 정리조차 제대로 하지 않았기 때문에 테스트도 작성할 수가 없었던 것이다. 클래스부터 설계할 것이 아니라 협력관계와 책임부터 생각하기!!

0개의 댓글