본문 바로가기

IT Book Summary/Object: 객체지향설계

Chapter03 역할, 책임, 협력

객체지향 패러다임의 관점에서 핵심 -> 역할(role), 책임(responsibility), 협력(collaboration)

본질은 협력하는 객체들의 공동체를 창조하는 것. 협력을 구성하기 위해 적절한 객체를 찾고 적절한 책임을 할당하라.

이와같은 것을 고민하지 않고 구현에 먼저 초점을 맞추게 된다면 변경하기 어렵고 유연하지 못한 코드가 된다.

 

 

01. 협력

 

영화 예매 시스템을 돌아보자 -.

영화 예매라는 기능을 위해 협력하는 객체들의 상호작용함

객체들은 요청의 흐름을 따라 자신에게 분배된 로직을 실행하면서 전체기능을 완성.

메세지를 주고받으며 상호작용하는 것을 협력

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

객체들이 협력안에 수행하는 책임들이 모여 구성하는것 객체가 수행하는 역할

 

로직을 수행하며 책임을 다함 < 책임이 모여 역할을 구성 < 객체사이 메세지를 주고받으며 협력 

 

 

협력이란?

객체사이의 협력은 메세지 전송(message sending) 이라는 커뮤니케이션 수단을 이용해 협력을 구현한다.

객체지향 시스템은 자율적인 객체들의 공동체로, 객체들은 서로 협력하는 사회적인 존재이다.

 

 협력이란 어떤 객체가 다른 객체에게 무엇인가를 요청하는 것이다. 한 객체는 어떤것이 필요할 떄 다른 객체에게 전적으로 위임하거나 서로 협력한다. 즉, 두 객체가 상호작용을 통해 더 큰 책임을 수행하는 것이다. 객체사이의 협력을 설계할 때는 객체를 서로 분리된 인스턴스가 아닌 협력하는 파트너로 인식해야 한다.

 

메세지를 받은 객체는 스스로 처리할 방법을 선택하여 자신의 메서드를 실행해 요청에 응답하는 자율적인 존재이다.

객체의 자율성을 보장하기 위해 필요한 정보와 정보에 기반한 행동을 같은 객체안에 모아두어야한다.

자신이 할 수 없는 일을 다른객체에게 위임하면 협력에 참여하는 객체 전체의 자율성을 향상시킨다.

객체를 자율적으로 만드는 가장 기본적인 방법 -> 내부 구현을 캡슐화 시켜라

다른 객체의 내부구현에 직접 접근하는 것을 막아 변경의 여파가 확산되는것을 막을 수 있다.

 

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

 

객체란 상태와 행동을 함께 캡슐화하는 실행 단위.

어플리케이션 안에 어떤 객체가 필요한 이유는 단 하나 - 객체가 협력에 필요한 적절한 행동을 보유하고 있기 때문

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

 

Movie 의 행동을 결정하는 것은 영화예매를 위한 협력,이라는 문맥

 

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

상태는 행동을 수행하는 데 필요한 정보가 무엇인지로 결정된다.

Movie 가 기본요금인 fee와 할인정책인 discountPolicy하는 인스턴스 변수를 상태의 일부로 포함하는 이유는

요금 계산이라는 행동을 수행하는데 이 정보들이 필요하기 때문이다.

 

public class Movie {
    private Money fee;
    private DiscountPolicy discountPolicy;

    public Money calculateMovieFee(Screening screening) {
        return fee.minus(discountPolicy.calculateDiscountAmount(screening));
    }
}

 

상태는 객체가 행동하는 데 필요한 정보에 의해 결정
행동은 협력안에서 객체가 처리할 메시지로 결정
객체가 참여하는 협력이 객체를 구성하는 행동과 상태 모두를 결정
협력은 객체를 설계하는 데 필요한 일종의 문맥(context) 을 제공

 

02. 책임

객체를 설계하기 위해 필요한 문맥인 협력이 갖춰진 후 -> 협력에 필요한 행동을 수행할 수 있는 객체를 찾자.

 

책임이란?

 : 객체에 의해 정의되는 응집도 있는 행위의 집합

 

두가지 범주

하는 것(doing)

  • 객체를 생성하거나 계산을 수행하는 등의 스스로 하는 것
  • 다른 객체의 행동을 시작시키는 것
  • 다른 객체의 활동을 제어하고 조절하는 것

아는 것(knowing) 

  • 사적인 정보에 관해 아는 것
  • 관련된 객체에 관해 아는 것
  • 자신이 유도하거나 계산할 수 있는 것에 관해 아는 것

 

영화예매 시스템에서 아는것과 관련된 책임

Screening의 책임 ->  영화를 예매하는 것

Movie의 책임 -> 요금을 계산하는 것

 

협력안에서 객체에게 할당한 책임이 외부의 인터페이스와 내부의 속성을 결정

 

책임과 메시지의 크기는 다르다. 책임이 메시지보다 추상적이고 개념적으로 더 큼.

 

객체의 알고있을 책임

  • 자신이 맡은 책임을 수행하는데 필요한 정보
  • 자신이 할수없는 작업을 도와줄 객체
  • 어떤 책임을 수행하는데 필요한 정보

객체지향 개발에서 가장 중요한 능력은 책임을 능숙하게 소프트웨어 객체에 할당하는 것 -크레이그 라만

 

적절한 협력이 적절한 책임을 제공하고, 적절한 책임을 적절한 객체에게 할당해야 단순하고 유연한 설계를 창조

객체에세 얼마나 적절한 책임을 할당하느냐가 설계의 전체적인 품질은 결정.

 

책임 할당

필요한 정보를 가장 잘 알고 있는 전문가에게 책임을 할당하는것이 자율적인 객체를 만드는 기본

책임 할당을 위한 Information Expert(정보 전문가) 패턴

 

영화를 예매하는 것. 이 기능을 시스템이 제공하는 기능으로 할당

영화 예매 정보를 가장 많이 알고 있는 객체에게 책임을 할당하자. -> Screening

예매가격 계산 정보를 가장 많이 알고 있는 객체에게 책임을 할당 -> Movie

 

객체지향 설계는 협력에 필요한 메시지를 찾고 적절한 객체를 선택하는 반복적인 과정을 가짐.

이런 메시지가 수신 객체의 책임을 결정함. 객체의 퍼블릭 인터페이스를 구성.

-> 시스템을 구성하는 객체들의 인터페이스와 오퍼레이션 목록

 

기본적인 전략 : 책임을 수행할 정보전문가를 찾자.

 

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

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

메시지가 객체를 결정

객체에게 책임을 할당하는데 필요한 메시지를 먼저 식별 -> 객체를 나중에 선택

  • 최소한의 인터페이스. 미니멀한 크기
  • 추상적인 인터페이스. 최소한의 노출

 

행동이 상태를 결정

객체가 협력에 적합한지를 결정하는 것은 그 객체의 상태가 아니라 행동. 그 행동이 객체의 책임이 된다.

 

03. 역할

 

역할과 협력

협력을 모델링 할때 역할에게 책임을 할당

 

유연하고 재사용 가능한 협력

: 역할이 중요한 이유

 

두 종유의 객체가 참여하는 협력을 개별적으로 만들 필요 없이 동일한 책임을 수행하는, 포괄하여 추상화로 하나로 통합.

두종류의 객체를 교대로 바꿔 끼울수 있는 슬롯 - 역할

 

ex) 인터페이스 업캐스팅, 다형성, 늦은 바인딩, 상속, 컴파일 시간 의존성과 실행시간 의존성의 차이.

 

객체 대 역할

역할 - 객체가 참여할 수 있는 일종의 슬롯 - 여러종류의 객체들이 참여하는것 - 설계의 구성요소를 추상화

 

협력 -> 역할 -> 객체 -> 클래스

단순하게 객체로 시작하고 - 반복적으로 책임과 협력을 정제 - 필요한순간에 객체로부터 역할을 분리

 

역할과 추상화

추상화

  • 상위수준의 정책을 쉽게 표현할수 있음. 불필요한 것을 생략하고 핵심 개념을 강조. 너무 세부적인 사항은 큰 그림을 방해하기 때문에.
  • 설계를 유연하게 만든다. 역할이라는 슬롯이 다양한 객체를 수용.기존 코드를 수정하지않고 새로운 행동을 추가.

추상화는 상황을 단순화 한다.

역할은 협력을 추상화 한다.

 

배우와 배역

 

연극 = 협력 , 배역 = 역할, 극본 = 코드,

연기하다 = 수행하다, 배우 = 객체

 

  • 배역은 연극 배우가 특정 연극에서 연기하는 역할
  • 배역은 연극이 상영되는 동안에만 존재하는 일시적 개념
  • 연극이 끝나면 배우는 배역이라는 역할에서 벗어나 원래 연극배우로 돌아옴
  • 서로다른 배우들이 동일한 배역을 연기
  • 하나의 배우가 다양한 연극에서 서로 다른 배역을 연기

 

  • 역할은 객체의 페르소나
  • 역할은 객체가 협력에 참여하는 잠시 동안만 존재. 일시적 개념
  • 역할은 시스템 문맥 안에서만 정의 할수 있음
  • 객체는 다수의 역할을 가짐.
  • 역할은 특정 객체 종류를 캡슐화, 대체가능한 객체들은 다형적