본문 바로가기

OBJECT

오브젝트 챕터3<역할, 책임, 협력>

챕터 3는 지난 챕터에서 설명했던 영화 예매 프로그램을 예시로 재활용합니다.

 

이번 글에서는 역할, 책임, 협력, RDD에 대해서 간략하게 정리했습니다.

 

 

협력

객체는 사회적인 존재다.
메시지 전송은 객체 사이의 유일한 커뮤니케이션 수단이다.
메시지를 수신한 객체는 메서드를 실행해 요청에 응답한다.

 

 

역할

객체가 특정한 협력 안에서 수행하는 책임의 집합을 역할이라고 부른다.

 

유연하고 재사용 가능한 협력이 역할을 통해 얻을 수 있는 장점이라고 했습니다. 역할은 대부분 인터페이스나 추상 클래스를 통해 구현된다는 것을 알면 이해가 쉬울 것 같습니다.

 

책임

협력에 참여하기 위해 객체가 수행하는 행동 책임이라고 부른다.
책임이란 객체에 의해 정의되는 응집도 있는 행위의 집합으로, 객체가 유지해야 하는 정보와 수행할 수 있는 행동에 대해 개략적으로 서술한 문장이다.
책임은 크게 '하는 것''아는 것' 두 가지 범주로 나누어 세분화됨.

 

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

 

 

책임 주도 설계 RDD

 객체 내부 구현에 초점을 맞춘 설계 방식.

 

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

 


 

 

public class Movie {
    private String title;
    private Duration runningTime;
    private Money fee;
    private DiscountPolicy discountPolicy;

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

 

저자는 클래스에 인스턴스 변수를 상태의 일부로 포함하는 이유는 행동을 수행하는 데 이 정보들이 필요하기 때문이라고 했습니다. 이 설명처럼 Movie 클래스에 fee와 discountpolicy 변수가 포함되어있는 이유도 calculateMovieFee메서드(행동)을 수행하기 위한 정보들이기 때문이겠습니다.

 

 


 

 

최종적으로 책임들이 모여 역할을 구성하고 역할들이 모여 하나의 협력(기능)을 구성하기 위해 집합된다고 이해했습니다.

이를 간단한 다이어그램을 그려보았습니다. 

 

 

 

 

객체는 책임을 수행하는 역할로 다이어그램상 책임의 하단에 위치할것이라고 생각합니다. 객체는 행동(메서드)으로서 협력에 참여합니다. 따라서 이 행동(메서드)은 협력에 필요한 행동어야 합니다.