2016-07-20 5 views
0

나는 내 개체를 모델링하고 있으며 오랫동안이 문제로 어려움을 겪어 왔습니다. 여기 내 Person 법인입니다 : 내가 값 개체에 이러한 속성을 분할하는 것을 시도했다, 그러나 지금까지 나는 단지 VO로로 변환 할 수 있었다ddd - 값 개체를 올바르게 식별하는 방법?

Person 
    ID 
    Name 
    Email 
    Password 
    City 
    Phone 
    Biography 
    Rating 
    Description 

(예를 들어, 도시는 VO는 도시 이름을 만든 것입니다 , 및 국가 이름).

예를 들어 EmailPassword을 함께 넣으면 더 큰 VO를 만들어야합니까? Credentials VO? VO로 분리하기에 너무 깊이 지나고 있습니까? 어떤 도움을 크게 논의 후

[편집]

을 감사

, 최선의 해결책이 그룹화해야 이메일 및 비밀번호를 제외하고, 그것의 자신의 VO의 모든 속성을 유지하는 것으로 보인다 "신임장"VO.

답변

1

값 개체는 값을 고유하게 식별하는 개체입니다. 동일성은 고유성을 제공하는 명시 적 특성 (예 : ID)이 아닌 값에 의해 수행됩니다. 모든 값이 같은 경우 두 값 개체가 같습니다.

도메인 개체를 식별 할 때 도메인 전문가가 사용하는 언어를 따르십시오. 사람들을 토론 할 때 어떤 말을 사용합니까? 그들은 신임장이나 전자 메일 및 암호를 참조합니까?

또한 항상 함께 사용되는 속성 그룹을 확인하십시오. 비밀번호는 항상 이메일과 함께 사용하는 경우 다음이 동작을 밀어 수있는 예를 들어,는 자격 증명의 그룹 그들에게 의미가 객체한다 (즉, Credentials.Validate())

[업데이트]

의 모든 다음과 같은 속성 값에 대한 후보 당신이

이름

  • 거기 최소/최대 가치있는을 적용 할 필요가있는 불변에 따라 객체입니다 이름은 무엇입니까?
  • 허용되지 않는 문자가 있습니까? 그것은
  • 는 두 사람이 동일한 이메일 주소를 가질 수 있습니다 유효한 이메일 주소

이메일

  • 입니까?

비밀

  • 최소/최대 길이?
  • 필수 자국?
  • 잘못된 문자입니까?

전화

  • 는 유효한 전화 번호입니까?
  • 국제 전화 코드는 어떻게 처리합니까?

평가

  • 는 평가에 허용 A 최소 및 최대 값이 있습니까?
  • 어떻게 계산 되나요? (계산합니까?)

설명

전기

도시 등

....

위의 용 개체를 만드는 경우 int 또는 str과 같은 기본 값 대신 개념을 사용합니다. 비즈니스 규칙을 값 개체 안에 캡슐화 할 수 있습니다.

두 가지를 일관되게 사용하는 경우 전자 메일과 암호를 자격 증명 값 개체에 결합 할 수 있습니다. 즉, 자격 증명 등으로 로그인하십시오. Credentials 객체 외부에서 이메일을 사용해야하는 경우 Credentials.Email에 계속 액세스 할 수 있습니다.

+0

문제는이 프로젝트를 통해 DDD에 이빨을 긋고있는 것입니다. 솔로 작업을하고 있기 때문에 도메인 전문가이자 개발자이기도합니다. 유비쿼터스 언어 – Lucio

+0

두 번째 방법을 시도해보십시오 - 함께 자주 사용되는 것들 – tomliversidge

+0

문제는 일부 필드가 다른 필드없이 사용될 수 있다는 것입니다. 귀하의 예를 들어, 전자 메일 비밀 번호없이 사용할 수있는 프로필 페이지에 예를 들어, 표시하고, 그 이유는 내가 고민하고 있어요. – Lucio

1

당신이 가지고있는 것은 의심스러운 데이터 구조 (CRUD)로 보입니다. 적절한 DDD에서 "Create Person"과 같은 비즈니스 사례로 시작한 다음개념을 나타내는 모델을 찾습니다.

모델은 구성 요소 그룹과 비즈니스 규칙으로 정의됩니다. 구성 요소는 명시 적 ID없이 단순 또는 복합 값으로 표현할 수있는 사소한 개념을 나타내는 모델이며 특정 비즈니스 제약 조건을 캡슐화하기 때문에 일반적으로 VO입니다. 예를 들어, Email VO는 유효한 이메일 값을 가지고 있는지 확인합니다.

도메인이 더 큰 VO를 만드는 것이 합리적인지 알려주도록합니다. 일반적으로 VO로 시작하면 을 발견합니다. 다른 VO들로 구성되어 있습니다. 일반적으로, 우리는 위에서 아래로갑니다. 모델링 예제는 see here입니다.

도메인 전문가가 없지만 비즈니스 케이스에서 생각하고 각 사례에 대한 특정 모델을 식별하려고 시도 할 수는 없습니다. 결국 간단한 구조와 일부 데이터 유효성 검사 규칙으로 끝나면 CRUD 방식을 사용하기에 충분한 도메인을 확보했을 것입니다.

+0

링크 된 계정 모델링 예에서, 계좌 잔금을 초과 할 수 없습니다 invariant 구현됩니다 ? 당신은 이것에 대한 읽기 모델에 의지 할 것이고 그래서 결국 그것을 일관되게 만들겠습니까? 금액에 대한 일종의 제한이 있어야 엄청나게 많은 돈을 보상 할 필요가 없을 것입니다. – plalx

+0

@plalx 귀하가 말한 것은 전송 서비스가 아닌 도메인 서비스의 일부입니다. Transfer는 AccountBalance에 대해 알지 못합니다. 비즈니스 규칙은 더 많은 금액을 허용 할 수 있습니다.> 당신은 당좌 대월 수수료를 얻거나이를 방지합니다. 그러나 필자의 예는 전체 비즈니스 케이스가 아닌 집계에만 초점을 맞추 었습니다. – MikeSW

+0

제가 말하고자하는 것은 당좌 대월 거래를 방지 할 수있는 방법이 없다는 것입니다. 왜냐하면 이체는 유일한 총액이며 잔액에 대한 개념이 없기 때문입니다. 당좌 대월의 초과 지출을 피하기 위해 하루에 1000 달러를 초과하는 계좌 이체를했다고 가정 해보십시오. 누군가가 여러 개의 동시 전송 요청을 수행하여 경쟁 조건을 악용하여 일일 1000 달러를 누적하여 초과하는 시나리오는 어떻게 처리합니까? 나는 이것이 은행들이 분산 된 성격 때문에 따라야 만하는 모형이라고 생각하지만 불변량을 드러내는 것은 당좌 대월을 방지하는 것보다 훨씬 복잡합니다. – plalx

0

특정 도메인 모델 구조를 부과하지 마십시오. 유스 케이스 관점에서 도메인 모델링에 접근해야합니다.

Credentials VO에 전자 메일과 암호를 같이 넣어 더 큰 VO를 만들어야합니까?

2 개가 함께 사용되는 경우에만 사용해야합니다. 그들이하지 않으면, 그들을 떠나 함께 괜찮아요.

지원해야하는 불변량 수가 새로운 개념을 도입하는 것을 정당화 할만큼 충분히 높으면 하나의 속성을 자체 값 객체로 추출하는 것이 의미있는 경우가 있습니다. 자세한 내용은 this article을 참조하십시오.