본문 바로가기
독서 기록

[오브젝트] 3장 - 역할, 책임, 협력

by 워냥 2024. 3. 11.

 

내용 정리: 20240311 TIL

1. 개요

3장은 역할, 책임, 협력에 초점을 맞춰 설명한다.

이전 장에서는 객체지향 프로그래밍의 다양한 기법들을 살펴봤지만, 이번 장에서는 그 기법을 넘어선 설계의 본질적인 요소에 대해 살펴본다.

아무리 효과적인 기법을 사용했다 하더라도 역할과 책임, 협력이 적절하지 못하다면 설계는 망가지게 된다.


2. 협력

협력(collaboration)은 객체들이 애플리케이션의 기능을 구현하기 위해 수행하는 상호작용을 의미한다.

객체들은 협력을 통해 메시지를 주고받으며, 메시지를 수신한 객체는 적절한 메서드를 실행하여 요청에 응답한다.

 

설계 관점에서 협력은 문맥(context)을 결정하는 중요한 요소다.

객체의 상태는 그 객체가 행동하는 데 필요한 정보에 의해 결정된다.

이 행동은 협력 내에서 객체가 처리할 메시지로 결정된다.

 

따라서 협력을 정의하는 과정은 각 객체의 행동과 상태를 어떻게 구성해야 할지에 대한 문맥을 제공한다.


3. 책임

책임이란?

책임(responsibility)은 협력에 참여하기 위해 객체가 수행하는 행동이다.

협력 내에서 객체가 유지해야 할 정보와 수행할 수 있는 행동을 개략적으로 설명한 것이 책임이다.

 

책임은 메시지보다 추상적인 개념이다.

처음에는 단순해 보이던 책임이 여러 메시지로 세분화될 수 있다.

또한 하나의 객체가 수행할 수 있다고 생각했던 책임이 여러 객체들이 협력해야 하는 큰 책임이 되기도 한다.

 

책임의 분류

책임은 크게 두 가지 유형로 나뉜다: '무엇을 할 수 있는가(doing)'와 '무엇을 알고 있는가(knowing)'.

 

책임의 관점에서 두 유형은 밀접하게 연결되어 있다.

객체는 자신이 맡은 책임을 수행하는 데 필요한 정보를 알고 있을 책임이 있다.

또한 객체는 자신이 할 수 없는 작업을 도와줄 객체를 알고 있을 책임이 있다.

 

객체에게 책임을 주기 위해서는 어떤 행동을 해야 하고 그 행동을 위해 무엇을 알아야 하는지 결정하면 된다.

 

책임 할당

적절한 책임을 적절한 객체에 할당해야 단순하고 유연한 설계가 가능하다.

가장 간단한 방법은 필요한 정보를 가장 잘 알고 있는 정보 전문가(Information Expert) 객체에게 책임을 할당하는 것이다.

 

응집도와 결합도 관점에서 정보 전문가가 아닌 다른 객체에게 책임을 할당하는 경우도 있다.

하지만 기본적으로 책임을 수행할 정보 전문가를 찾는 것이 좋다.

 

책임 주도 설계

책임 주도 설계(Responsibility-Driven Design, RDD)는 책임을 찾고 책임을 수행할 객체를 찾아 책임을 할당하는 방식으로 협력을 설계한다.

 

책임 주도 설계 과정은 다음과 같다:

 

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

책임 주도 설계에서 볼 수 있듯 객체의 상태가 아닌 행동에 집중해야 한다.

상태는 단지 객체가 행동을 정상적으로 수행하기 위해 필요한 재료일 뿐이다.

 

협력이 객체의 행동을 결정하고, 행동은 상태를 결정한다.

그 행동이 바로 객체의 책임이다.


4. 역할

역할이란?

역할(role)은 객체가 어떤 특정한 협력 안에서 수행하는 책임의 집합을 의미한다.

협력을 설계할 때는 구체적인 객체가 아닌 역할에게 책임을 할당한다고 생각하자.

 

역할은 객체를 한 단계 더 추상화한 것이다.

이를 통해 다양한 종류의 객체가 동일한 역할을 수행할 수 있도록 한다.

 

역할을 구현하는 일반적인 방법은 추상 클래스와 인터페이스를 사용하는 것이다.

두 방법은 다양한 종류의 클래스들을 협력에 참여시킬 수 있는 확장 포인트가 된다.

 

객체와 역할의 구분

한 종류의 객체만이 협력에 참여하는 경우까지 역할로 추상화할 필요는 없다.

과도한 추상화는 오히려 설계의 복잡성을 증가시킬 수 있다.

따라서 협력에 적합한 책임을 수행하는 대상이 한 종류면 객체, 여러 종류면 역할이라고 부르는 것이 좋다.

 

역할과 객체를 직관적으로 구분하는 것은 어렵다.

처음에는 모든 것을 객체로 보고 책임과 협력을 정제해 가며 필요한 순간에 역할을 분리하자.


5. 느낀 점

객체지향에서 강조하는 역할, 책임, 협력에 대해서 구체적으로 이해할 수 있었다.

 

협력은 설계의 흐름을 알게 해 준다.

책임은 협력 안에서 객체가 수행해야 할 행동이다.

역할은 공통된 책임을 추상화한 것이다.

 

다형성, 상속, 캡슐화와 같은 기법에만 집중했을 때는 그 목적이 와닿지 않았다.

하지만 넓은 관점에서 바라보니 이 기법들은 역할, 책임, 협력을 실현하기 위한 도구임을 알게 되었다.

 

좋은 객체지향 설계를 위해 집중해야 할 것은 단순한 기법의 적용이 아니다.

역할과 책임을 중심으로 하여 협력을 구축해야 객체지향이 원하는 설계를 할 수 있을 것이다.

댓글