2017-02-15 3 views
1

저는 DDD를 처음 접했을 때 항상 재미있는 개념을 중심으로 머리를 감싸면서 필연적으로 어떤 점이나 상황에 도달하게됩니다. 특정 문제에 직면하여 학습해야합니다.DDD - 엔티티에서 값 객체를 파생합니다.

사용자에 관한 두 개의 다른 날짜 : DateOfBirth 및 이 있다고 가정 해보십시오. 두 가지 값을 따로 따로 구현하면 많은 의미가 있습니다. 그 일은 쉽습니다.

이제 응용 프로그램에서 UsersProjects에 참여할 수 있다고 가정 해 봅시다. 프로젝트에는 복수 members과이를 소유 한 단일 사용자가있을 수 있습니다.

따라서 ProjectMembersProjectOwner은 모두 후드 아래 Users입니다.

Project에서이 기능을 구현하는 방법은 두 가지가 있습니다

A : 강한 입력이 - 다음 값 개체로 "행동"클래스 ProjectMemberProjectOwner 만들기가. 랩퍼로 작동 시키거나 User 클래스를 확장하십시오.

B : 게으른 접근법 - 원하는 행동/기대에 따라 메소드와 매개 변수의 이름을 지정하고 User 오브젝트를 누르기 만하면됩니다.

내 생각에 B 다음에 오는 것은 DDD 원칙을 삭제하는 것을 의미합니다.

다음과 같은 A는 수십 개의 클래스로 이어질 것이며, 많은 클래스는 아무 것도하지 않고 형식 안전성을 강화합니다.

단순한 날짜와 비교하여 사용자가 엔티티이거나 골재를 모으는 동시에 혼란 스럽기 때문에 혼란 스럽습니다.

A, B 또는 세 번째 옵션이 있습니까?

답변

2

다음과 같은 A는 수십 개의 클래스로 이어질 수 있지만 그 중 많은 클래스는 아무 것도하지 않고 형식 안전성을 강화합니다.

아니요, 도메인 모델에서 발견 한 차이점을 문서화합니다. 이러한 구별이 모델의 동작에 어떻게 영향을 미치는지 아직 이해하지 못할 수도 있지만 장소 소유자와 적절한 언어를 제공하므로 (귀하의 이름이 유비쿼터스 언어를 기반으로한다고 가정 할 때) 도메인 모델이보다 밀접하게 정렬됩니다 비즈니스와

그건 아무것도 아닙니다.

단순한 날짜와 비교하여 사용자가 엔티티이거나 심지어는 집계되는 루트와 동시에 복잡하기 때문에 혼란 스럽습니다.

한 가지 명심해야 할 점은 습관으로 참조 개체를 보호하는 집계 외부에서 참조하지 않는 것입니다. 따라서 ProjectOwner 대신 ProjectOwnerId입니다.

흥미로운 아무것도, 당신은 구문의 비트와 함께 동일한 유형을 사용할 수 있습니다 (특히 다른 식별자 비교를 제외하고 많은 일을하지 않는 불투명 한 일을하는 경향이 식별자)를하지 않는 유형의

설탕은 유형 안전을 보장합니다. 예를 Identifier<T>를 들어

오히려 당신이 식별자

의 각 철자에 대해서는 다른 구현을 생산하도록 요구보다, 암시 적으로 당신에게 Identifier<ProjectMember>Identifier<ProjectOwner>을 제공합니다