본문 바로가기

IT 도서 정리/오브젝트

[오브젝트] CHATPER 3. 역할, 책임, 협력

3장에서는 객체지향 패러다임의 핵심인 역할, 책임, 협력에 대해서 자세히 설명한다.

 

협력 - 객체들이 애플리케이션의 기능을 구현하기 위해 수행하는 상호작용.

 

책임 - 객체가 협력에 참여하기 위해 수행하는 로직.

 

역할 - 객체들이 협력 안에서 수행하는 책임들의 집합.

 

 

 

협력(collaboration)

객체지향 세계에서 기능을 구현할 수 있는 유일한 방법으로,

한 객체가 다른 객체에게 도움을 요청할 때 시작된다.

 

 

메시지 전송 - 객체 사이의 협력을 위해 사용할 수 있는 유일한 커뮤니케이션 수단

 

메시지를 수신한 객체는 메서드를 실행해 요청에 응답한다.

객체 스스로 메서드를 선택하며, 이는 자신의 일을 스스로 처리할 수 있는 자율적인 존재라는 것을 의미한다.

 

 

협력이 설계를 위한 문맥을 결정한다

객체의 행동을 결정하는 것은  객체가 참여하고 있는 협력이다.

그리고, 객체의 상태를 결정하는 것은 행동이다.

 

협력 -> 행동 -> 상태

 

결론적으로 협력은 객체를 설계하는 데 필요한 일종의 문맥을 제공한다고 볼 수 있다.

 

 

책임(responsibility)

정의: 협력에 참여하기 위해 객체가 수행하는 행동.

 

책임은 하는 것(doing)아는 것(knowing)의 두 가지 범주로 나누어 세분화된다.

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

 

어떤 책임을 수행하려면 그 책임을 수행하는 데 필요한 정보도 함께 알아야 할 책임이 있다!

 

 

CRC 카드: 객체지향 설계 기법을 가르치기 위해 고안된 기법

1. 후보(Candidate)

2. 책임(Responsibility)

3. 협력자(Collaborator)

Candidate
Responsibility Collaborator
...  
   
   

 

책임 할당

책임의 할당 = 메시지의 이름을 정하는 것

 

 

 INFORMATION EXPERT(정보 전문가) 패턴: 책임을 수행하는 데 필요한 정보를 가장 잘 알고있는 전문가에게 그 책임을 할당하는 것.

정보 전문가에게 책임을 할당하는 방법
1. 협력에 필요한 메시지 찾기
2. 메시지에 적절한 객체를 선택
3. 1번과 2번을 반복.

메시지: 메시지를 수신한 객체의 책임을 결정하고, 객체의 퍼블릭 인터페이스를 구성한다.

 

 

책임을 할당할 때 고려해야 할 요소

1. 메시지가 객체를 결정한다는 것

2. 행동이 상태를 결정한다는 것

 

1. 메시지가 객체를 선택한다
1) 객체가 최소한의 인터페이스를 가질 수 있게 된다.
2) 객체가 충분히 추상적인 인터페이스를 가질 수 있게 된다.
2. 행동이 상태를 결정한다
1) 객체를 객체답게 만드는 것은 객체가 다른 객체엑 제공되는 행동이다.
2) 상태는 행동을 수행하기 위한 재료일 뿐이다.
3) 데이터-주도 설계(Data-Driven Design)은 객체의 내부 구현에 초점을 맞춘 설계로 좋지 않다.

 

책임 주도 설계(Responsibility-Driven Design, RDD)

책임을 찾고 책임을 수행할 적절한 객체를 찾아 책임을 할당하는 방식으로 협력을 설계하는 방법

 

과정

1. 시스템이 사용자에게 제공해야 하는 기능인 시스템 책임을 파악한다

2. 시스템 책임을 더 작은 책임으로 분할한다.

3. 분할된 책임을 수행할 수 있는 적절한 객체 or 역할을 찾아 책임을 할당한다.

4. 객체가 책임을 수행하는 도중 다른 객체의 도움이 필요한 경우, 이를 책임질 적절할 객체 or 역할을 찾는다.

5. 해당 객체 or 역할에게 책임을 할당해 두 객체가 협력하게 한다.

 

 

역할(role)

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

 

역할은 추상화를 기반으로 동일한 책임을 수행하는 두 개의 협력을 하나로 통합할 수 있다.

이를 통해

1. 불필요한 코드의 중복을 제거한다.
2. 협력을 유연하게 만든다.

 

 

객체지향을 연극에 비유해보자.

배역과 배우는 연극의 구성요소이다.

이때,

배역 = 역할
배우 = 객체

로 치환될 수 있다.

 

 

하지만, 적절한 책임과 협력의 큰 그림을 탐색하는 것이 제일 중요하며

역할과 객체의 명확한 구분은 그렇게 중요하지 않다.

 

 

역할의 구현

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

1. 추상 클래스 - 책임의 일부를 구현해둔 것
2. 인터페이스 - 일체의 구현 없이 책임의 집합만을 나열한 것.