21 Aug 2020

객체지향 설계(협력, 책임, 역할) -1

객체지향 설계란 무엇일까?


  • 협력 : 객체들이 애플리케이션 기능을 구현하기위해 수행하는 상호작용을 협력이라고 한다.
  • 책임 : 객체가 협력에 참여하기 위해 수행하는 로직은 책임이라고 한다.
  • 역할 : 객체들이 협력한에서 수행하는 책임들이 모여 객체가 수행하는 역할을 구성한다.

협력

객체지향 시스템은 자율적인 객체들의 공동체다. 협력은 객체지향의 세계에서 기능을 구현할 수 있는

유일한 방법이다. 두 객체 사이의 협력은 하나의 객체가 다른 객체에게 도움을 요청할 때 시작된다.

메시지 전송(message sending)은 객체 사이의 협력을 위해 사용할 수 있는 유일한 수단이다.


메시지를 수신한 객체는 메서드를 실행해 요청에 응답한다. 여기서 객체가 메시를 처리할 방법을

스스로 선택한다는 점이 중요하다. 외부의 객체는 오직 메시지만 전송할 수 있을 뿐이며 메시지를 어떻게

처리할지는 메시지를 수신한 객체가 직접 결정한다. 이것은 객체가 자신의 일을 스스로 처리할 수 있는

자율적인 존재라는 것을 의미한다.


reserve->:Screening->calculateMovieFee(screening)->:Movie
//예매자 한 명의 여금 계산을 요청한다.
public class Movie{
    private Money fee;
    private DiscountPolicy discountPolicy;

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

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


책임

협력에 필요한 해동을 수행할 수 있는 적절한 객체를 찾아야 하는데 이때 협력에 참여하기 위해 객체가

수행하는 행동을 책임이라고 한다.


객체의 책임은 객체가 ‘무엇을 알고 있는가’, ‘무엇을 할 수 있는가’로 구성된다. 객체의 책임은 ‘하는 것’

‘아는 것’ 두 가지 범주로 나누어 세분화할 수 있다.


영화 예매 시스템에서 Screening의 책임은 영화를 예매하는것이다. Movie의 책임은 요금을 계산하는것이다.

Screening은 자신이 상영할 영화를 알고 있어야 한다.Movie는 예매가격을 계산할 책임을 진다.


책임 주도 설계

- 협력을 설계하기 위해서는 책임에 초점을 맞춰야한다. 어떤 책임을 선택하느냐가 전체적인 설계의 방향과

흐름을 결정한다. 이처럼 책임을 찾고 책임을 수행할 적절한 객체를 찾아 책임을 할당하는 방식으로

협력을 설계하는 방법을 책임 주도 설계(Responsibility-Driven Design, RDD)라고 부른다.


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

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

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

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

  • 해당 객체 또는 역할에게 책임을 할당함으로써 두 객체가 협력하게 한다.


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


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

했다는것이 중요하다. 메시지가 객체를 선택해야하는 두 가지 이유가 있다.

  • 첫째, 객체가 최소한의 인터페이스를 가질 수 있게 한다.

  • 둘째, 객체는 충분히 추상적인 인터페이스를 가질 수 있게 된다. 객체의 인터페이스는 무엇(what)

    을 하는지는 표현해야 하지만 어떻게(how) 수행하는지를 노출해서는 안 된다.


행동이 상태를 결정한다.

- 객체가 존재하는 이유는 협력에 참여하기 위해서이고, 객체의 행동은 객체가 협력에 참여할 수 있는

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

객체가 가질 수 있는 상태는 행동을 결정하고 나서야 결정할 수 있다. 협력이 객체의 행동을 결정하고

행동이 상태를 결정한다. 그리고 그 행동이 바로 객체의 책임이 된다.


역할

역할과 협력에서 객체는 협력이라는 주어진 문맥안에서 특정한 목적을 갖게 된다. 객체가 어떤 특정한

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

역할의 구현 역할을 구현하는 가장 일반적인 방법은 추상 클래스와 인터페이스를 사용하는 것이다. 협력의 관점에서 추상 클래스와 인터페이스는 구체 클래스들이 따라야 하는 책임의 집합을 서술한 것이다. 추상 클래스는 책임의 일부를 구현해 놓은 것이고 인터페이스는 일체의 구현 없이 책임의 집합만을 나열해 놓았다는 차이가 있지만 협력의 관점에서는 둘 모두 역할을 정의할 수 있는 구현 방법이라는 공통점을 공유한다. 추상 클래스와 인터페이스는 동일한 책임을 수행하는 다양한 종류의 클래스들을 협력에 참여시킬 수 있는 확장 포인트를 제공한다.이들은 동일한 책임을 수행할 수 있는 객체들을 협력 안에 수용할 수 있는 역할이다.


Tags:
0 comments