역할, 책임, 협력

객체지향 세계에서도 인간과 비슷하게 협력이라는 문맥이 객체의 행동 방식을 결졍한다.

협력이라는 문맥을 고려하지 않은 채 객체가 가져야할 상태와 행동을 고민하면 안된다.

  • 훌륭한 객체지향 설계란 겉모습은 아름답지만 협력자들을 무시하는 오만한 객체를 창조하는 것이 아니라 조화를 이루며 적극적으로 상호작용하는 협력적인 객체를 창조하는 것이다.
    • 비록 그 객체를 따로 떼어놓고 봤을 때는 겉모습이 다소 기묘하고 비합리적이더라도 말이다.

객체의 모양을 빚는 것은 객체가 참여하는 협력이다. 어떤 협력에 참여하는지가 객체에 필요한 행동을 결정하고, 필요한 행동이 객체의 상태를 결정한다.

p123

역할이 답이다.
  • 앨리스의 이야기 중 재판 과정을 예시로 들어 재판을 받는 대상과 증명을 하는 대상, 판정을 내리는 대상은 계속 바뀔 수 있다.
    • 이러한 과정은 서로 너무 유사하기에 하나의 협력으로 다루고 싶다.

하나의 협력으로 만드는 방법

역할을 기준으로 나누면 된다. ‘판사’의 역할, ‘증인’의 역할로 하나의 협력으로 추상화할 수 있다.

역할은 ‘이 자리는 해당 역할을 수행할 수 있는 어떤 객체라도 대신할 수 있습니다.’와 같다.

물론 어떤 객체라도 가능하지는 않다. 요청에 대한 메시지를 수신할때, 동일한 방식으로 이를 이해해야 한다.

p126

  • 동일한 역할을 수행하는 객체들이 동일한 메시지를 수신할 수 있기 때문에 동일한 책임을 수행할 수 있다.
    • 역할의 개념을 사용하면 유사한 협력을 추상화해서 인지 과부하를 줄일 수 있다.

객체지향 설계 단순성(simplicity) 유연성(flexibility) 재사용성(reusability)

협력의 추상화 -> 역할의 가장 큰 가치

하나의 협력 안에 여러 종류의 객체가 참여할 수 있게 함으로써 협력을 추상화 한다.

p127

객체는 역할이 암시하는 책임보다 더 많은 책임을 가질 수 있다.

객체의 타입과 역할 사이에는 일반화/특수화 관계가 성립하는 것이 일반적이다.

일반화/특수화 관점에서 좀 더 일반적인 개념을 의미하는 역할은 일반화이며 좀 더 구체적인 개념을 의미하는 객체의 타입은 특수화다.

역할이 협력을 추상적으로 만들 수 있는 이유는 역할 자체가 객체의 추상화이기 때문이다.

객체지향 설계 기법

역할, 책임, 협력의 관점에서 애플리케이션을 설계하는데 유용한 방법 세가지.

  • 책임-주도 설계 (Responsibility-Driven Design) 방법

협력에 필요한 책임들을 식별하고 적합한 객체에게 책임을 할당하는 방식

  • 디자인 패턴 (Design Pattern)

전문가들이 반복적으로 사용하는 해결방법을 정의해 놓은 설계 템플릿의 모음 / 전문가들이 특정 문제를 해결하기 위해 이미 식별해 놓은 역할, 책임, 협력의 모음

패턴을 알고 있다면 바퀴를 반복적으로 발명할 필요가 없다. 여러분이 필요로 하는 역할, 책임, 협력이 디자인 패턴 안에 이미 존재하기 때문이다.

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

테스트를 먼저 작성하고 테스트를 통과하는 구체적인 코드를 추가하면서 애플리케이션을 완성해가는 방식

테스트가 아니라 설계를 위한 기법

핵심은 테스트 작성이 아니라 (이것은 별도의 보너스) 실제 목적은 구체적인 코드를 작성해나가면서 역할, 책임, 협력을 식별하고 식별된 역할, 책임, 협력이 적합한지를 피드백 받는 것

COMPOSITE 패턴 을 설명하는 예시 중…

  • 디자인 패턴은 공통으로 사용할 수 있는 역할, 책임, 협력의 템플릿이다.

테스트 주도 개발

  • 객체가 이미 존재한다고 가정하고 객체에게 어떤 메시지를 전송할 것인지에 관해 먼저 생각하라
  • 역할, 책임, 협력의 관점에서 객체를 바라보지 않을 경우 무의미하다.

테스트-주도 개발은 책임-주도 설계의 기본 개념을 따른다. 사전 설계없이 테스트-주도 개발을 진행하는 개발자들은 책임-주도 설계의 단계적인 절차와 기법들을 짧은 시간에 감각적으로 수행하는 사람들이다.

때로는 요구사항으로부터 특정 패턴이 필요하다는 것을 눈치채고 패턴을 목표로 빠르게 테스트를 작성한다.

협력 안에서 객체의 역할과 책임이 무엇이고 이것이 클래스와 같은 프로그래밍 언어 장치로 구현되는 방식에 대한 감각을 갖춰야만 효과적인 테스트를 작성할 수 있다.

테스트를 작성하기 위해 객체의 메서드를 호출하고 반환값을 검증하는 것은 순간적으로 객체가 수행해야 하는 책임에 관해 생각한 것이다.

테스트에 필요한 간접 입력 값을 제공하기 위해 스텁(stub)을 추가하거나 간접 출력 값을 검증하기 위해 목 객체(mock object)를 사용하는 것은 객체와 협력해야 하는 협력자에 관해 고민한 결과를 코드로 표현한 것이다.

자세히..

레베카 워프스브록이 고안한 책임-주도 설계 방법은 말 그대로 객체의 책임을 중심으로 시스템을 구축하는 설계 방법을 말한다.