Chap04 역할, 책임, 협력

이연희·2022년 7월 23일
0

협력

일상생활 속에서 이뤄지는 협력의 본질은 요청과 응답으로 연결되는 사람들의 네트워크다. 협력은 한 사람이 다른 사람에서 도움을 요청할 때 시작된다. 요청을 받은 사람은 일을 처리한 후에 요청을 보낸 사람에게 응답한다.

책임

객체지향의 세계에서 어떤 객체가 어떤 요청에 대해 대답해줄 수 있거나 적절한 행동을 할 의무가 있는 경우 해당 객체가 책임을 가진다고 한다.

책임의 분류

협력의 참여하는 객체들은 목표를 달성하는데 필요한 책임을 수행한다. 즉 객체는 '객체가 무엇을 알고 있는가(knowing)'와 '무엇을 할 수 있는가(doing)'로 구성된다.

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

즉, 책임은 객체의 외부에 제공해 줄 수 있는 정보(아는 것)와 외부에 제공해 줄 수 있는 서비스(하는 것)의 목록이다. 따라서 책임은 객체의 공용 인터페이스(public interface)를 구성한다.

책임과 메시지

객체가 다른 객체에게 주어진 책임을 수행하도록 요청을 보내는 것을 메시지 전송(message-send)이라 한다. 메시지를 통해 협력을 요청하는 객체를 송신자라고 하고 메시지를 받아 요청을 처리하는 객체를 수신자라 한다. 메시지는 협력을 위해 한 객체가 다른 객체로 접근할 수 있는 유일한 방법이다.

역할

협력 안에서 역할(Role)은 "이 자리는 해당 역할을 수행할 수 있는 어떤 객체라도 대신할 수 있다"라고 말하는 것과 같다. '판사'라고 적혀 있는 자리는 하트 왕과 하트 여왕이 대신할 수 있으며, '증인'이라고 적혀있는 자리는 모자 장수, 요리사, 앨리스가 대신할 수 있다. 역할을 이용해 협력을 추상화했기 때문에 '판사'나 '증인'의 역할을 수행할 수 있는 어떤 객체라도 협력에 참여할 수 있다.

역할(role)은 객체지향 설계의 단순성(simplicity), 유연성(flexibility), 재사용성(reusability)을 뒷받침하는 핵심 개념이다.

협력의 추상화

역할의 가장 큰 가치는 하나의 협력 안에 여러 종류의 객체가 참여할 수 있게 함으로써 협력을 추상화할 수 있다는 것이다.

대체 가능성

객체는 협력 안에서 역할이 수행할 수 있는 행동을 그대로 수행할 수 있어야 한다. 역할의 대체 가능성은 행위 호환성을 의미하고, 행위 호환성은 동일한 책임의 수행을 의미한다.

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

흔한 오류

많은 사람들이 시스템에 필요한 데이터를 저장하기 위해 객체가 존재한다는 선입견을 가지고 있다. 객체가 존재하는 이유는 행위를 수행하며 협력에 참여하기 위해서다. 실제로 중요한 것은 객체의 행동 즉 책임이다.

두번째 선입견은 객체지향이 클래스와 클래스 간의 관계를 표현하는 시스템의 정적인 측면에 중점을 둔다는 것이다. 중요한 것은 정적인 클래스가 아니라 협력에 참여하는 동적인 객체며, 클래스는 단지 시스템에 필요한 객체를 표현하고 생성하기 위해 프로그래밍 언어가 제공하는 구현 메커니즘이다. 핵심은 객체가 협력 안에서 어떤 책임과 역할을 수행할 것인지를 결정하는 것이다.

객체지향 설계 기법

책임-주도 설계(Responsibility-Driven Desgin)

협력에 필요한 책임들을 식별하고 적합한 객체에게 책임을 할당하는 방식으로 애플리케이션을 설계한다. 이 방법은 객체지향 패러다임의 전문가들이 애플리케이션을 개발할 때 어떤 방식으로 사고하고 무엇을 기반으로 의사결정을 내리는지 잘 보여준다.

  • 시스템이 사용자에게 제공해야 하는 기능인 시스템 책임을 파악한다.
  • 시스템 책임을 더 작은 책임으로 분할한다.
  • 분할된 책임을 수행할 수 있는 적절한 객체 또는 역할을 찾아 책임을 할당한다.
  • 객체가 책임을 수행하는 중에 다른 객체의 도움이 필요한 경우 이를 책임질 적절한 객체 또는 역할을 찾는다.
  • 해당 객체 또는 역할에게 책임을 할당함으로써 두 객체가 협력하게 한다.

디자인 패턴(Design Pattern)

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

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

테스트-주도 개발 방법은 테스트를 먼저 작성하고 테스트를 통과하는 구체적인 코드를 추가하면서 애플리케이션을 완성해가는 방식이다. 이 방법은 테스트가 아닌 설계를 위한 기법이다. 테스트-주도 개발의 핵심은 테스트 작성이 아니다. 테스트는 단지 얻을 수 있는 보너스 같은 것이며 실제 목적은 구체적인 코드를 작성해나가면서 역할, 책임, 협력을 식별하고 식별된 것이 적합한지 피드백받는 것이다.

테스트-주도 개발의 기본 흐름은 실패하는 테스트를 작성하고, 테스트를 통과하는 가장 간단한 코드를 작성한 후(중복 가능), 리팩토링을 통해 중복을 제거하는 것이다. 테스트-주도 개발을 통해 '작동하는 깔끔한 코드'를 얻을 수 있다.

테스트-주도 개발은 테스트를 작성하는 것이 아니라 책임을 수행할 객체 또는 클라이언트가 기대하는 객체의 역할이 메세지를 수신할 때 어떤 결과를 반환하고 그 과정에서 어떤 객체와 협력할 것인지에 대한 기대를 코드의 형태로 작성하는 것이다.

profile
공부기록

0개의 댓글