도메인 모델
- 도메인 + 모델
- 도메인: 사용자가 프로그램을 사용하는 대상 분야
- 모델: 지식을 선택적으로 단순화하고 의식적으로 구조화한 형태
- 도메인 모델 → 사용자가 프로그램을 사용하는 대상 영역에 관한 지식을 선택적으로 단순화하고 의식적으로 구조화한 형태
- 객체지향의 가장 큰 장점은 도메인을 모델링하기 위한 기법과 도메인을 프로그래밍하기 위해 사용하는 기법이 동일하다는 것이다.
→ 도메인 모델링에서 사용한 객체와 개념을 프로그래밍 설계에서의 객체와 클래스로 변환할 수 있으며(연결완전성), 코드의 변경으로부터 도메인 모델의 변경 사항을 유추할 수 있다(가역성, reversibility).
Use case
- 사용자의 목표를 달성하기 위해 사용자와 시스템 간에 이뤄지는 상호작용의 흐름을 텍스트로 정리한 것
- 일차 액터(primary actor)라 불리는 행위자의 요청에 대한 시스템의 응답으로서, 다양한 조건하에 있는 시스템의 행위를 서술한다.
Use case의 특성
- 사용자와 시스템 간의 상호작용을 보여주는 텍스트다.
- 하나의 시나리오가 아니라 사용자의 목표와 관련된 모든 시나리오의 집합이다.
- 시나리오를 use case instance라고 부르기도 한다.
- 단순히 feature의 목록을 나타내는 것이 아니라 feature 간의 관계를 포함하고 있다.
- Use case를 사용하면 연관된 기능들을 함께 묶을 수 있다.
- 사용자 인터페이스와 관련된 세부 정보를 포함하지 않는다(essential use case).
- 시스템의 내부 구조나 실행 메커니즘에 관련된 정보를 제공하지 않는다.
책임-주도 설계는 유스케이스로부터 첫 번째 메시지와 사용자가 달성하려는 목표를, 도메인 모델로부터 기능을 수용할 수 있는 안정적인 구조를 제공받아 실제로 동작하는 객체들의 협력 공동체를 창조한다. (p. 199)
객체 지향 설계 안에 존재하는 세 가지 관점
개념 관점(Conceptual Perspective)
- 도메인 안에 존재하는 개념과 개념들 사이의 관계를 표현하는 것에 초점
- 실제 도메인의 규칙과 제약을 최대한 유사하게 반영하는 것이 핵심이다.
e.g. 커피 전문점이라는 도메인이 있을 때 메뉴판, 메뉴 항목, 손님, 바리스타, 커피 등의 객체 사이를 포함(containtment) 또는 연관(association) 등의 관계로 표현할 수 있다.
명세 관점(Specification Perspective)
구현 관점(Implementation Perspective)
- 객체들이 책임을 수행하는 데 필요한 동작하는 코드를 작성하는 것에 초점
개념 관점, 명세 관점, 구현 관점은 동일한 코드를 바라보는 서로 다른 관점이며, 코드를 읽으며 세 가지 관점에 대응되는 요소가 명확히 드러나지 않는다면 각 관점이 명확히 드러나는 방향으로 수정함으로써 변화에 대한 코드의 유연성을 증가시킬 수 있다.
객체지향 설계 시 유념할 점
- 중요한 것은 설계가 아니라 코드다.
→ 협력을 구상하는 단계에 너무 오랜 시간을 쏟지 말고 최대한 빨리 코드로 구현하여 설계를 검증, 수정하자.
- 인터페이스를 결정할 때는 객체 내부에 대한 어떠한 가정도 하지 말아야 한다.
→ 먼저 객체의 책임을 결정한 후에 객체의 속성을 결정하자.
- 변화에 탄력적인 인터페이스를 만들어야 한다.
→ 클래스의 public 메서드는 다른 클래스가 협력할 수 있는 공용 인터페이스를 드러내며, 인터페이스의 수정은 해당 객체와 협력하고 있던 모든 객체에게 영향을 미친다. 따라서 최대한 변화에 안정적인 인터페이스를 설계하도록 노력하자.
- 인터페이스와 구현을 분리해야 한다.
→ 캡슐화를 위반하여 구현이 인터페이스 밖으로 노출되거나 인터페이스와 구현의 경계가 불명확하지는 않은지 확인하자.
Source
와 제인 대박;; 이책도 다읽고;; 대단해여!!