it-swarm-ko.tech

가치 대 개체 개체 (도메인 기반 디자인)

방금 DDD를 읽기 시작했습니다. Entity vs Value 객체의 개념을 완전히 파악할 수 없습니다. Value 객체를 Entity 객체로 설계 할 때 시스템이 직면 할 수있는 문제 (유지 관리 성, 성능 등)를 설명해 주시겠습니까? 예가 좋을 것입니다 ...

87
StackUnderflow

본질적인 구별로 축소되어 개체의 정체성은 중요하지만 가치 객체에는 중요하지 않습니다. 예를 들어, 누군가의 이름은 가치 개체입니다. Customer 엔터티는 고객 이름 (값 개체), List <Order> OrderHistory (엔터티 목록) 및 기본 주소 (일반적으로 값 개체)로 구성 될 수 있습니다. 고객 엔티티에는 ID가 있고 각 주문에는 ID가 있지만 이름은 없어야합니다. 일반적으로 개체 모델 내에서 주소의 ID는 중요하지 않습니다.

값 객체는 일반적으로 불변 객체로 표시 될 수 있습니다. 가치 객체의 하나의 속성을 변경하면 내용과 마찬가지로 정체성과 관련이 없기 때문에 본질적으로 기존 객체를 파괴하고 새로운 객체를 만듭니다. 적절하게 객체의 속성이 다른 인스턴스의 속성과 동일한 한 Name의 Equals 인스턴스 메서드는 "true"를 반환합니다.

그러나 고객과 같은 엔티티의 일부 속성을 변경해도 고객이 손상되지는 않습니다. 고객 엔티티는 일반적으로 변경 가능합니다. ID는 동일하게 유지됩니다 (적어도 한 번 객체가 지속되면).

당신은 아마 그것을 실현하지 않고 가치 객체를 만들 수 있습니다; 세분화 된 클래스를 작성하여 엔티티의 일부 측면을 나타낼 때마다 값 객체가 있습니다. 예를 들어, 유효한 값에 대한 제약이 있지만 더 간단한 데이터 유형으로 구성된 IPAddress 클래스는 값 객체입니다. EmailAddress는 문자열이거나 고유 한 동작 집합이있는 값 객체 일 수 있습니다.

데이터베이스에 ID가있는 항목이라도 개체 모델에 ID가 없을 수도 있습니다. 그러나 가장 간단한 경우는 함께 이해되는 몇 가지 속성의 합성입니다. Customer.FirstName, Customer.LastName, Customer.MiddleInitial 및 Customer.Title을 갖고 싶지 않은 경우 Customer.Name으로 구성 할 수 있습니다. 지속성에 대해 생각할 때 데이터베이스에 여러 필드가있을 수 있지만 개체 모델은 중요하지 않습니다.

102
JasonTrue

모든 속성에 의해 집합 적으로 정의 된 객체는 값 객체입니다. 속성이 변경되면 값 객체의 새 인스턴스가 있습니다. 이것이 바로 가치 객체가 불변 인 것으로 정의 된 이유입니다.

객체가 모든 속성에 의해 완전히 정의되지 않은 경우 객체의 아이덴티티를 구성하는 속성의 하위 집합이 있습니다. 나머지 속성은 객체를 재정의하지 않고 변경 될 수 있습니다. 이러한 종류의 객체는 변경할 수 없습니다.

구별하는 가장 간단한 방법은 가치 객체를 절대 변하지 않는 정적 데이터로 생각하고 엔터티를 응용 프로그램에서 진화하는 데이터로 생각하는 것입니다.

34
Richard Dorman

값 유형 :

  • 값 유형은 자체적으로 존재하지 않으며 엔티티 유형에 따라 다릅니다.
  • 값 유형 개체는 엔터티 유형 개체에 속합니다.
  • 값 유형 인스턴스의 수명은 소유 엔티티 인스턴스의 수명에 의해 제한됩니다.
  • 세 가지 값 유형 : 기본 (기본 데이터 유형), 복합 (주소) 및 콜렉션 (맵, 목록, 배열)

엔티티 :

  • 엔티티 유형은 자체적으로 존재할 수 있습니다 (ID)
  • 엔터티에는 자체 수명주기가 있습니다. 다른 엔티티와 독립적으로 존재할 수 있습니다.
  • 예 : 개인, 조직, 대학, 모바일, 가정 등
6
Premraj

다음이 올바른지 모르겠지만 Address 객체의 경우 엔터티 대신 Value 객체로 사용하려고합니다. 엔터티 변경 사항은 연결된 모든 객체에 반영되므로 ( 예를 들어 사람).

이 경우를 생각해보십시오 : 당신은 다른 사람들과 함께 집에 살고 있습니다. 우리가 주소에 엔티티를 사용한다면, 모든 Person 객체가 링크하는 하나의 고유 한 주소가있을 것이라고 주장합니다. 한 사람이 밖으로 나가면 자신의 주소를 업데이트하려고합니다. 주소 엔터티의 속성을 업데이트하면 모든 사람의 주소가 달라집니다. Value Object의 경우, 우리는 Address를 변경할 수 없으며 (불변이기 때문에) 그 Person을 위해 새로운 Address를 제공해야합니다.

이 소리가 맞습니까? 나는 DDD 책을 읽은 후에도 여전히이 차이점에 대해 혼란스러워했다.

한 걸음 더 나아가서 데이터베이스에서 어떻게 모델링할까요? Person 테이블에 Address 개체의 모든 속성을 열로 사용합니까, 아니면 고유 식별자가있는 별도의 Address 테이블을 생성 하시겠습니까? 후자의 경우 같은 집에 사는 사람들은 각각 다른 Address 객체 인스턴스를 가지지 만 ID 속성을 제외하고는 동일한 객체가됩니다.

6

주소는 업무 프로세스에 따라 달라지는 엔티티 또는 값 개체 일 수 있습니다. 주소 개체는 택배 서비스 응용 프로그램의 엔터티 일 수 있지만 주소는 다른 응용 프로그램의 값 개체 일 수 있습니다. 주소 개체에 대한 택배 응용 프로그램 ID 문제

4
Dharmesh

나는 다른 스레드에서 이것에 대해 물었고 여전히 혼란 스럽다고 생각합니다. 성능 고려 사항과 데이터 모델링을 혼동 할 수 있습니다. 카탈로그 애플리케이션에서 고객은 필요할 때까지 변경되지 않습니다. 그것은 바보처럼 들리지만 고객 데이터의 '읽기'는 '쓰기'보다 훨씬 많으며 많은 웹 요청이 객체의 '활성 세트'에 충돌하고 있기 때문에 고객에게 계속해서로드하고 싶지 않습니다. 그래서 나는 고객 객체에 대한 불변의 길로 향했습니다.로드하고 캐시하고 고객을보고 싶어하는 (멀티 스레드) 요청의 99 %에 동일한 것을 제공하십시오. 그런 다음 고객이 무언가를 변경하면 '편집자'가 새 고객을 만들고 이전 고객을 무효화합니다.

내 관심사는 많은 스레드가 동일한 고객 객체를보고 변경 가능한 경우 하나의 스레드가 변경되기 시작하면 다른 스레드에서 발생할 수 있습니다.

내 문제는 이제 1) 합리적이며 2) 속성에 대한 많은 코드를 복제하지 않고이를 수행하는 가장 좋은 방법입니다.

2
n8wrl

EntitiesValue Objects의 3 가지 차이점

  • 식별자 대 구조적 동등성 : 엔티티에는 식별자가 있고 동일한 식별자를 가진 엔티티는 동일합니다. 손을 넘어 가치 객체는 구조적 평등을 가지므로 모든 필드가 동일 할 때 두 개의 가치 객체가 동일한 것으로 간주합니다. 값 객체는 식별자를 가질 수 없습니다.

  • 변경 성 대 불변성 : Value Objects는 불변의 데이터 구조이며 엔터티는 수명 동안 변경됩니다.

  • 수명 : 가치 개체는 엔터티에 속해야합니다.

0
Ramin Farajpour