07 / 함께 모으기
마지막장에서는 객체지향 설계를 위한 세 가지 관점을 1장 커피공화국 예제와 함께 설명한다.
사용자 관점에서의 도메인 설계부터 메시지 기반으로 한 인터페이스 설계, 기능 수행을 위한 클래스 구현까지..
앞서 배워온 개념들을 직접 적용해보고, 예제를 통해 정리해볼 수 있는 챕터이다.
객체 의인화, 메시지 위주의 설계, 책임과 협력, 사용자의 관점에서 본 도메인 모델, 인터페이스와 구현의 분리 등
올바른 객체지향 설계란 무엇이며 내가 이제까지 범해왔던 오류들은 무엇이었는지 예제 풀이 과정을 통해 정리해보자.
커피 전문점 도메인
다시 1장의 커피 공화국으로 얘기로 돌아가서
커피 전문점 도메인을 객체지향 관점에서 설계해보자
커피 전문점 안에는 메뉴판이 존재한다.
손님은 메뉴판에 있는 각 메뉴를 보고 바리스타에게 커피를 주문한다.
바리스타는 손님의 요청을 확인한 후 메뉴에 맞춰 커피를 제조하고 건넨다.
이 과정은 손님, 바리스타, 메뉴항목, 메뉴판 총 네개 객체의 협력으로 이뤄진다.
메뉴판 객체는 다수의 메뉴 항목을 포함하고 있으며,
메뉴판과 메뉴항목은 별개가 아닌 하나의 단위로 움직인다. (= 포함(containment) 또는 합성(composition) 관계)
손님은 객체는 커피를 주문하기 위해 메뉴판 객체타입을 인지하고 있어야 한다.
그렇다고 해서 메뉴판 객체가 손님 객체의 일부는 아니다. (= 연관(association) 관계)
설계하고 구현하기
협력을 설계할 때에는 객체가 어떤 기능을 제공할지 결정하는게 아니라
메시지가 어떤 객체에서 처리되면 좋을지. 즉, 메시지가 객체를 선택하게 해야 한다.
이 과정의 시작은 '커피를 주문하라' 에서 시작될 수 있다.
커피를 주문할 책임을 가진 객체는 어떤 것일까? 바로 손님 객체이다.
손님 타입의 인스턴스가 커피를 주문할 책임을 할당받았다.
손님은 커피를 주문하라는 책임을 가지지만 주문 가능한 메뉴는 알지 못한다.
따라서 손님은 특정 객체에게 메뉴 항목을 제공해 줄 것을 요청한다.
'메뉴 항목을 찾아라' 메시지가 새로 등장한다.
메뉴항목을 포함하고 있는 메뉴판 객체에게 이 메시지에 대한 책임을 할당한다.
메뉴판 객체는 메시지에 대한 응답으로 메뉴항목을 반환한다.
메뉴항목을 얻은 손님객체는 이 메뉴항목에 맞는 커피를 제조해달라고 요청한다.
'커피를 제조하라' 메시지에 대한 책임은 커피 제조를 할 수 있는 바리스타에게 할당된다.
위와 같이 커피 주문을 위해 필요한 메시지를 정리하고, 적합한 객체에게 이를 할당했다면
우리는 객체들의 인터페이스를 얻게된 것이다.
이후 메시지를 처리하기 위한 실제 구현을 이어 나간다.
손님은 '커피를 주문하라'는 메시지를 처리하기 위해 메뉴판과 바리스타 객체를 참조해야 한다.
위 객체 참조를 위해 구현과정에서 '주문하라' 메소드 인자로 메뉴판, 바리스타 객체를 전달받는 방법을 선택할 수 있다.
메뉴판은 '메뉴 항목을 찾아라'는 메시지를 처리하기 위해 메뉴항목을 내부적으로 관리하고 있어야 한다.
메뉴판은 메뉴항목 List의 각 인스턴스를 하나씩 검사해가면서 손님이 원하는 '메뉴항목'을 찾고, 이를 손님에게 반환할 수 있다.
코드와 세 가지 관점
커피 전문점에서 이뤄지는 협력 과정에서 객체를 찾아냈고,
과정 내 필요한 메시지를 파악한 후 적합한 객체에 책임을 할당했고,
인터페이스가 완료된 후 실제 수행을 위한 구현을 진행했다.
마틴파울러는 객체지향 설계 안에 존재하는 세 가지 연관된 관점에 관해 설명한다
이를 각각 개념, 명세, 구현 관점이라 부른다
개념 관점(Conceptual Perspective)
- 도메인 안에 존재하는 개념과 개념들 사이 관계를 표현
- 사용자가 도메인을 바라보는 관점을 반영
명세 관점(Specification Perspective)
- 사용자 영역인 도메인에서 벗어나 개발자 영역인 소프트웨어 위주로 초점을 맞춘 관점
- 객체에 초점을 맞춘 관점이며 객체가 협력을 위해 '무엇'을 할 수 있는가 위주로 바라봄
- 인터페이스 설계에 필요한 관점
( 인터페이스와 구현을 분리하라! )
구현 관점(Implementation Perspective)
- 객체들이 책임을 수행하기 위해 필요한 동작을 코드로 작성
- 객체의 책임을 '어떻게' 수행할지 초점을 맞춤
- 인터페이스 구현에 필요한 관점
'Book > 객체지향의 사실과 오해' 카테고리의 다른 글
[책 리뷰] 객체지향의 사실과 오해 (0) | 2023.01.02 |
---|---|
[정리] 객체지향의 사실과 오해 - 6장 (0) | 2022.12.31 |
[정리] 객체지향의 사실과 오해 - 5장 (0) | 2022.12.30 |
[정리] 객체지향의 사실과 오해 - 4장 (0) | 2022.12.29 |
[정리] 객체지향의 사실과 오해 - 3장 (0) | 2022.12.28 |
댓글