www.notion.so/2-GRASP-c485daef91e74ae1925641406f126b7c
2. 책임 할당을 위한 GRASP 패턴
- General Responsibility Assignment Software Pattern (일반적인 책임할당을 위한 소프트웨어 패턴)
도메인 개념에서 출발하기
- 설계 시작전 도메인에 대한 개략적인 모습을 그려보는것이 유용하다.
- 어떤 책임을 할당할때 가장 먼저 고민해야하는 유력한 후보가 바로 도메인
- 설계를 시작할때 완벽할 필요는 없다.
- 도메인 개념을 정리하는데 너무 많은 시간을 들이지말고 빠르게 설계와 구현을 진행하라.
- 올바른 도메인 모델이란 존재하지 않는다
- 실용적이면서 유용한 모델이 정답이다
정보 전문가에게 책임을 할당하라
- 책임을 애플리케이션에 대해 전송된 메시지로 간주하고 이 메시지를 책임질 첫번째 객체를 선택하는 것으로 설계를 시작한다.
- 책임을 수행하는데 필요한 메시지를 결정해야 한다.
- 메시지는 메시지를 수신할 객체가 아니라 메시지를 전송할 객체의 의도를 반영해서 결정해야 한다.
메시지를 전송할 객체는 무엇을 원하는가 ?
- 우선 첫번째는 바로 영화를 예매하는 것이다.
- 메시지의 이름은 예매하라가 절절한것 같다.
메시지를 수신할 적합한 객체는 누구인가 ?
- 객체가 상태와 행동을 통합한 캡슐화의 단위 이므로 스스로 처리해야하는 자율적인 존재여야만 한다.
- 객체의 책임과 책임을 수행하는데 필요한 상태는 동일한 객체 안에 존재해야 한다.
- 따라서 객체에게 책임을 할당하는 첫 번째 원칙은 책임을 수행할 정보를 알고 있는 객체에게 책임을 할당하는 것이다.
- GRASP에서는 이를 INFORMATION EXPERT (정보 전문가) 라고 한다.
- 여기서 이야기하는 정보는 데이터와 다르다
- 책임을 수행하는 객체가 정보를 알고 있다고 해서 그 정보를 저장하고 있을 필요는 없다.
- 객체는 해당 정보를 제공 할수 있는 다른 객체를 알고 있거나 필요한 정보를 계산해서 제공할 수도 있다.
- 어떤 방식이건 정보 전문가가 데이터를 반드시 저장하고 있을 필요는 없다.
- 이제 예매하라 메시지를 수신했을 때 Screening이 수행해야 하는 작업의 흐름을 생각해보자, 이제부터는 외부의 인터페이스가 아닌 Screening의 내부로 들어가 메시지를 처리하기 위해 필요한 절차와 구현을 고민해보는 것이다.
- 지금은 개략적인 수준에서 객체들의 책임을 결정하는 단계이기 때문에 너무 세세한 부분까지 고민할 필요는 없다.
- 단지 Screening이 책임을 수행하는 데 필요한 작업을 구상해보고 스스로 처리할 수 없는 작업이 무엇인지를 가릴 정도의 수준이면 된다.
- 만약 스스로 처리할수 없다면 외부에 도움을 요청해야 한다. 이요청이 외부로 전송해야하는 새로운 메시지가 되고, 최종적으로 이 메시지가 새로운 객체의 책임으로 할당된다. 이같은 연쇄적인 메시지 전송과 수신을 통해 협력 공동체가 구성되는 것이다.
예매에 필요한 것은 영화의 가격이다 Screening은 스스로 처리할수 없고 이 정보는 Movie가 들고 있다.
- movie는 영화가격을 계산할 책임을 가지게 됬다.
Movie는 스스로 할인여부를 판단할수 없다. 메시지를 전송해 외부에 요청하자.
- DiscountCondition이 이 책임을 할당받을수 있다.
- 이 친구는 스스로 처리할수 있기에 외부에 요청하지 않는다.
- 이렇게 Information Expert 패턴은 객체에게 책임을 할당할 때 가장 기본이 되는 책임할당 원칙이다.
- Information Expert 패턴은 객체란 상태와 행동을 함께 가지는 단위라는 객체지향의 가장 기본적인 원리를 책임할당의 관점에서 표현한다.
- Information Expert패턴을 따르는것만으로도 자율성 높은 객체들로 구성된 협력 공동체를 구축할 가능성이 높아지는것이다.
높은 응집도와 낮은 결합도
- 설계는 트레이드오프 란것을 기억하자.
- 올바른 책임 할당을 위해 Information Expert 패턴 이외의 다른 책임 할당 패턴들을 함께 고려할 필요가 있다.
- 위에서 보면 Moive가 DiscountCondition에 할인여부를 묻는데 이건 Screening에서도 물어봐도된다. 하지만 왜 Moive가 물어보게 했을까 ?
- 그 이유는 응집도와 결합도에 있다
- 책임을 할당할 때 항상 고려해야되는 기본 원리다.
- 다양한 대안들이 존재한다면 응집도와 결합도의 측면에서 더 나은 대안을 선택하는 것이 좋다.
- 다시말해 두 협력 패턴중에서 높은 응집도와 낮은 결합도를 얻을수 있는 설계가 있다면 그것을 선택해야 한다는 것이다.
- GRASP에서는 이를 low Coupling ( 낮은 결합도 ) 패턴과 High Cohesion ( 높은 응집도 ) 패턴 이라고 부른다.
- 도메인을 보면 Moive는 이미 DiscounCondition을 가지고 있다 낮은 결합도를 위해 Moive에서 하는것이 더 좋다.
- 이를 높은 응집도 측면에서 본다면 Screening의 책임은 예매하는것이다.
- 하지만 요금계산과 관련된 책임을 일부 떠안을 경우 요금계산식이 변경되면 Screening이 변경되고 서로 다른 이유로 변경되는 책임을 짊어지게 된다. 그러므로 응집도가 낮아질수 밖에 없다
창조자에게 객체 생성 책임을 할당하라.
- 영화예매 협력의 최종 결과물은 Reservation 인스턴스를 생성하는 것이다.
- 이것은 어떤 객체에게 Reservation 인스턴스를 생성할 책임을 할당해야 한다는 것을 의미한다.
- GRASP의 CREATOR ( 창조자 ) 패턴은 이같은 경우에 어떤 객체에게 할당할지 지침을 제공하는 패턴이다.
- B가 A객체를 포함하거나 참조한다.
- B가 A객체를 기록한다.
- B가 A객체를 긴밀하게 사용한다.
- B가 A객체를 초기화하는데 필요한 데이터를 가지고 있다 ( 이 경우 B는 A에 대한 정보전문가다 )
- CREATOR 패턴의 의도는 그 객체를 사용해야 하는 객체는 어떤 방식으로든 생성될 객체와 연결될 것이기 때문에 잘알고 있어야한다.
- 다시 말해 두 객체는 서로 결합한다.
- 이미 결합돼 있는 객체에게 생성 책임을 할당하는 것은 추가적인 결합도가 생성되지 않으므로 결합도에 영향을 끼치지 않는다.
- Screening이 Moive도 알고 예매정보를 생성하는 것에 대한 정보도 정보전문가이므로 Screening이 CREATOR로 적당하다
'book > 오브젝트' 카테고리의 다른 글
5장 - 4. 책임주도 설계의 대안 (0) | 2021.05.11 |
---|---|
5장 - 3. 구현을 통한 검증 (0) | 2021.05.10 |
5장 - 1 책임 할당하기 (0) | 2021.05.08 |
4장 설계 품질과 트레이드오프 (0) | 2021.05.05 |
오브젝트 3장 - 역할, 책임, 협력 (0) | 2021.04.30 |