협력하는 객체 사이의 관계에서 객체는 협력 객체에게 메시지를 전송하고
메시지를 전송받은 객체는 메시지를 처리할 수 있는 책임과 역할을 가진다.
Screening이 영화요금계산에 대한 처리를 Movice에 위임한다.
위임하는 이유는 Movie가 영화요금계산에 대한 정보를 가장 잘 알고 있기 때문이다.
만약 Screening이 영화 계산을 담당한다면 Movie의 자율성이 훼손된다.
객체 : 행동과 상태를 함께 캡슐화한 실행 단위
행동과 상태는 어떤 기준으로 선택되는가?
협력을 기준으로 선택된다.
Movie를 하면 떠오르는 이미지 : 영화 상영
하지만 Movie에 영화 상영이라는 정보는 어디에도 포함되지 않는다.
why?
Movie가 영화를 예매하기 위한 협력에 참여하고 있고 그 안에서 요금을 계산하는 책임을 담당하고 있기 때문이다.
책임
책임 : 객체가 협력에 참여하기 위해 수행하는 행동
책임을 판가름하는 기준 두 가지
1. 무엇을 할 수 있는가?
2. 무엇을 아는가?
Screening이 reserve 메시지를 수신하고 movie를 인스턴스 변수로 포함하는 이유는
협력안에서 영화를 예매할 책임을 수행하기 때문
Movie가 calculateMovieFee 메시지를 수신하고 fee와 discountPolicy를 속성으로 가지는 이유는 협력안에서 가격을 계산할 책임을 할당받았기 때문
여기에서 중요한 점은 객체는 자신이 할 수 없는 작업을 도와줄 객체를 알고 있을 책임이 있다는 점이다.
적절한 책임을 할당하는 것은 설계의 전체적인 품질을 좌우한다.
책임 할당
책임을 할당하는 것은 메시지를 받은 객체가 해당 메시지에 대해서 충분한 정보를 가지고 있지 않다면 그 정보에 대해 훨씬 잘 아는 객체에게
해당 메시지를 전달하는 것이다.
screening -> movie :
1. screening은 영화 예매의 메시지를 받았다.
2. 예매에 관련한 정보에 대해서는 전문가이지만 요금계산에 대해서는 전문가가 아니다.
3. 요금계산의 전문가인 movie에게 요금을 계산하라는 메시지를 전송한다.
책임 주도 설계란?
- 시스템이 사용자에게 제공해야 하는 기능인 시스템 책임을 파악한다.
- 시스템 책임을 더 작은 책임으로 분할한다.
- 분할된 책임을 수행할 수 있는 적절한 객체 또는 역할을 찾아 책임을 할당한다.
- 객체가 책임을 수행하는 도중 다른 객체의 도움이 필요할 경우 이를 책임질 적절한 객체 또는 역할을 찾는다.
- 해당 객체 또는 역할에게 책임을 할당함으로써 두 객체가 협력하게 한다.
이때 객체가 메시지를 선택하는 것이 아닌
메시지가 객체를 선택한다.
메시지가 객체를 선택하는 이유는 무엇일까?
- 최소한의 인터페이스를 가질 수 있게 도와주기 때문이다.
메시지를 받기 전까지 어떠한 인터페이스를 추가하지 않는다.
- 충분히 추상적인 인터페이스를 가질 수 있게 도와주기 때문이다.
어떻게가 아닌 무엇에 초점을 맞추어 인터페이스를 설계하기 때문에 추상화된 인터페이스를 설계할 수 있도록 도와준다.
행동이 상태를 결정한다.
객체지향 입문자들이 가장 쉽게 범하는 실수는 설계 시 상태에 초점을 맞추는 것이다.
이때 상태는 해당 객체가 무엇을 가지고 있는지에 대한 정보이다.
ex) Movie의 영화요금
상태는 객체가 정상적으로 동작하기에 필요한 도구일 뿐이다!
역할
역할이란 책임의 집합이다.
의문점 : 왜 역할이라는 개념을 추가해서 객체지향에 대한 개념을 어지럽히는가? 책임이라는 개념만으로도 충분히 가능한 부분 아닌가?
책임만을 개념으로 사용한다면 중복의 의미에서 문제가 생기게 된다.
AmountDiscountPolicy와 PercentDiscountPolict는
엄연히 같은 책임을 가지고 있다.
그렇다면 메시지 전달 시 각각 다르게 호출해야 하는가?(같은 책임임에도 불구하고)
no no!!
메시지를 역할에 주어서 역할은 필요에 따라서 갈아 끼우면 된다.
역할은 슬롯이다.
메시지에 응답할 수 있는 대표자라고 역할을 생각하면 될 것 같다.
객체와 역할의 차이
- 동일한 객체가 하나의 책임을 가지면 동일한 개념이 된다.
- 동일한 객체가 여러 개의 책임을 가지면 역할은 책임의 집합이라는 개념이 된다.
참고문헌
|
'Java > 객체지향' 카테고리의 다른 글
(OOP) 리스코프 치환 원칙 (0) | 2020.02.20 |
---|---|
(OOP) 객체지향에 대해서(2) - 은유 (0) | 2020.02.20 |
(OOP) 객체지향에 대해서(1) - 객체, 행동, 상태 (0) | 2020.02.19 |
(OOP) 객체지향 프로그래밍 (0) | 2019.12.30 |
(OOP) 객체, 설계 (0) | 2019.12.29 |