2009-04-27 12 views
0

도메인 기반 디자인에서는 ID가있는 개체가 엔터티라는 것이 일반적입니다. 예를 들어 어떤 사람이라도 여러 가지 형태의 신원 (이름 등)을 갖게됩니다.개체/값 개체 선택

그러나 값 개체는 신원이없는 개체입니다. 하나의 공통 값 객체는 주소이지만 주소에는 ID가 없습니다. 그러나 데이터베이스 계층에서 우리는 복합 키를 가질 수 있습니다. 이 개념은 DDD에서 작동합니까? 그것은 도로명, 우편 번호 및 문 번호 (도시 및 도시와 같은 정보 생략)의 조합으로 주소를 식별 할 수있게합니다. 돈은 또 다른 가치 객체가 될 것입니다.

식별 할 수있는 필드가 하나도없는 개체에서 차이가있는 것처럼 보이고 값 개체는 실제 개체에 속하지 않는 경향이 있습니다. 예를 들어 "I"(내 이름으로 대체)는 신발 등을 착용 할 수 있지만 "나는"신발, 셔츠 등이 아닙니다 (http://www.lostechies.com/blogs/joe_ocampo/archive/2007/04/23/a-discussion-on-domain-driven-design-value-objects.aspx).

사물에 대해 생각하는 것이 올바른 방법입니까? 또한이 사고 방식으로 C#의 값/참조 유형 선택에이 방법을 적용 할 수 있습니다. 그래도 DDD 방식을 사용할 수 있습니까? 아마도 더 나은 당신이 일치하는 말 -

감사

답변

0

나는 그들이 도메인 중심의 디자인에서 이해되는 나는이 문제에 대해 전문가로부터 멀리 나는 비록 당신이 (엔티티와 올바른 값 유형 구분의 개념을 생각 이 개념들에 대한 나의 이해). 그러나 C#에서 참조 또는 값으로 해당 개체를 모델링할지 여부를 결정할 때이를 결정 메트릭으로 사용하지 말라고 조언합니다.

값과 참조 형식의 주요 차이점은 값 형식이 메서드에 전달 될 때 값 형식이 복사된다는 것입니다. 이는 스택이 힙이 아닌 스택에 위치 할 확률이 높아지고 전달하는 데 더 많은 비용이들 수 있음을 의미합니다. 크기가 고려 요인이됩니다. 구조체는 크기가 16 바이트 (설명문 하단에 here)이어야하고 포괄적 인 주소 구조 (집 번호, 집 이름, 거리 지역, 도시, 국가 등 ...)가 있어야이 규칙을 쉽게 위반할 수 있습니다.

엔티티의 의미론 : value :: class : struct는 매우 유사하며 데이터를 모델링함으로써 많은 이점을 볼 수 있습니다 (동일한 주소에 사는 두 명의 사람은 이 아닙니다. 주소를 변경하면 한 사람의 주소가 변경되어 다른 사람의 주소가 변경되어서는 안되기 때문에 구조로 주소를 지정하면 이러한 구분이 적용됩니다. 반면 응용 프로그램의 모든 사람은 같은 사람을 가리켜 야합니다. 그러나 성능 및 메모리 고려 사항이 있습니다. 아마도 불변 클래스가 이러한 값 유형에 적합할까요?

요약 : DDD에서 개체와 값의 구분은 개체의 기준에 따라 결정됩니다. 코드에서 수행하려는 작업을 기반으로 코드를 작성해야합니다.

+0

엔티티/값 개체 구분은 C#에서 클래스와 구조체를 선택하는 데 도움이 될 수 있습니다. 나는 예외가 발생할 수있는 고려 사항이 있다고 확신한다. 반대의 경우에는 반대 유형을 선택하고 객체에 대한 다른 모든 사실은 한 유형에 적합하게 만든다. 그러나 주소 (건물)를 수정할 수 있습니다. 이것은 변경 가능하지 않아야합니까? 엔진은 작은 항목의 구조 및 복합 요소 일 수 있지만 수정할 수도 있습니다. – dotnetdev

+0

솔직히 나는 여러분의 의견을 전적으로 따르지 않을지 모르지만, 주소의 변경 가능성과 관련하여 내가 불변의 클래스를 제안한 이유는 사람 A의 주소가 변경 될 때 사람 B에게 인스턴스 A 클래스에 대한 새로운 고유 한 인스턴스를 만들려면 강제로 주소 클래스의. 이것은 구조체에서 얻을 수있는 주요 이점이며 클래스를 사용하여 동일한 동작을 수행 할 수 있음을 보여 주려고했습니다. –

+0

비즈니스 관점에서 볼 때 조금 까다 롭습니다. 예를 들어, 한 가족이 집을 갖지만이 역시 참조 유형입니다. 아이들이 어렸을 때 그들은 집을 옮기지 않으므로 그 집은 공유 된 참조입니다. – dotnetdev