Câu hỏi Các đối tượng Value vs Entity (Thiết kế Driven Miền)


Tôi mới bắt đầu đọc DDD. Tôi không thể hoàn toàn nắm bắt được khái niệm đối tượng Entity vs Value .. Ai đó có thể giải thích các vấn đề (bảo trì, hiệu suất ..vv) một hệ thống có thể gặp phải khi một đối tượng Value được thiết kế như một đối tượng Entity? Ví dụ sẽ là tuyệt vời ...


76
2017-09-16 18:27


gốc


Ở đây tôi đã viết một danh sách đầy đủ (IMO) của sự khác biệt giữa hai: enterprisecraftsmanship.com/2016/01/11/… - Vladimir


Các câu trả lời:


Giảm sự khác biệt thiết yếu, vấn đề nhận dạng cho các thực thể, nhưng không quan trọng đối với các đối tượng giá trị. Ví dụ: Tên của ai đó là một đối tượng giá trị. Một thực thể khách hàng có thể bao gồm một tên khách hàng (đối tượng giá trị), List <Order> OrderHistory (Danh sách các thực thể), và có lẽ là một địa chỉ mặc định (thường là một đối tượng giá trị). Pháp nhân Khách hàng sẽ có một ID, và mỗi đơn hàng sẽ có một ID, nhưng một Tên không nên; nhìn chung, trong mô hình đối tượng, danh tính của một Địa chỉ có thể không quan trọng.

Các đối tượng giá trị thường có thể được biểu diễn dưới dạng các đối tượng bất biến; thay đổi một thuộc tính của một đối tượng giá trị về cơ bản phá hủy đối tượng cũ và tạo một đối tượng mới, bởi vì bạn không quan tâm đến danh tính như với nội dung. Đúng, phương thức equals instance trên Name sẽ trả về "true" miễn là các thuộc tính của đối tượng giống hệt với các thuộc tính của một cá thể khác.

Tuy nhiên, việc thay đổi một số thuộc tính của một thực thể như Khách hàng không phá hủy khách hàng; một thực thể khách hàng thường có thể thay đổi. Danh tính vẫn giữ nguyên (ít nhất một khi đối tượng đã được duy trì).

Bạn có thể tạo các đối tượng giá trị mà không nhận ra nó; bất cứ lúc nào bạn đại diện cho một số khía cạnh của một thực thể bằng cách tạo ra một lớp học chi tiết, bạn đã có một đối tượng giá trị. Ví dụ, một lớp IPAddress, trong đó có một số ràng buộc về các giá trị hợp lệ nhưng bao gồm các kiểu dữ liệu đơn giản hơn, sẽ là một đối tượng giá trị. Một EmailAddress có thể là một chuỗi, hoặc nó có thể là một đối tượng giá trị với tập các hành vi của riêng nó.

Nó hoàn toàn có thể là ngay cả các mục có một danh tính trong cơ sở dữ liệu của bạn không có một bản sắc trong mô hình đối tượng của bạn. Nhưng trường hợp đơn giản nhất là tổng hợp một số thuộc tính hợp lý. Bạn có thể không muốn có Customer.FirstName, Customer.LastName, Customer.MiddleInitial và Customer.Title khi bạn có thể soạn những thứ đó với nhau như Customer.Name; chúng có thể sẽ là nhiều trường trong cơ sở dữ liệu của bạn vào thời điểm bạn nghĩ về sự kiên trì, nhưng mô hình đối tượng của bạn không quan tâm.


89
2017-09-16 19:03



Các đối tượng có thể thay đổi được chia sẻ ở đâu? Nếu trong toàn bộ vũ trụ chỉ tồn tại một tham chiếu đến một đối tượng, danh tính của đối tượng sẽ không liên quan ngay cả khi nó có thể thay đổi được. Như tôi thấy, một điều là một thực thể nếu tồn tại một tham chiếu có thể được sử dụng để quan sát một khía cạnh của trạng thái có thể thay đổi không có tham chiếu đó đã được sử dụng để thay đổi nó. Nếu một điều không gắn với thế giới bên ngoài và hoặc là nó không thay đổi hoặc chỉ có một tham chiếu đến nó tồn tại ở bất kỳ đâu trong vũ trụ, thì kịch bản trên không thể xảy ra và nó là một giá trị. - supercat
Một cái gì đó giống như một int[1] có thể là giá trị có thể thay đổi không chia sẻ, giá trị không thể chia sẻ có thể chia sẻ (nếu không có nội dung nào chứa tham chiếu sẽ ghi vào nó) hoặc thực thể (nếu có từ hai tham chiếu trở lên và một trong số đó có thể được sử dụng để ghi giá trị có thể được đọc bằng cách sử dụng khác). Thật không may, tôi biết không có hỗ trợ ngôn ngữ trong Java hoặc .NET để ngăn chặn các đối tượng lớp đóng gói các giá trị có thể biến đổi do vô tình biến thành các thực thể. - supercat
@supercat, Nếu bạn có nghĩa là không có hỗ trợ đơn giản trực tiếp, tôi sẽ đồng ý, nhưng tôi làm điều này loại bỏ quyền truy cập công cộng vào các nhà xây dựng, chỉ sử dụng các nhà máy tĩnh để tạo các cá thể mới và hạn chế tất cả quyền truy cập vào trạng thái thông qua các thuộc tính chỉ đọc (Không có người định cư) . - Charles Bretana


Bất kỳ đối tượng nào được xác định chung bởi tất cả các thuộc tính của nó đều là một đối tượng giá trị. Nếu bất kỳ thuộc tính nào thay đổi bạn có một thể hiện mới của một đối tượng giá trị. Đây là lý do tại sao các đối tượng giá trị được định nghĩa là không thay đổi.

Nếu đối tượng không được xác định đầy đủ bởi tất cả các thuộc tính của nó thì có một tập con của các thuộc tính tạo nên danh tính của đối tượng. Các thuộc tính còn lại có thể thay đổi mà không cần định nghĩa lại đối tượng. Loại đối tượng này không thể được xác định tại bất biến.

Cách đơn giản hơn để phân biệt là suy nghĩ về các đối tượng giá trị là dữ liệu tĩnh sẽ không bao giờ thay đổi và các thực thể như dữ liệu phát triển trong ứng dụng của bạn.


29
2017-10-21 12:19





Tôi không biết nếu điều sau là đúng, nhưng tôi sẽ nói rằng trong trường hợp của một đối tượng Address, chúng ta muốn sử dụng nó như là một đối tượng Value thay vì một Entity vì các thay đổi đối với thực thể sẽ được phản ánh trên tất cả các đối tượng liên kết ( một ví dụ).

Lấy trường hợp này: Bạn đang sống trong nhà của bạn với một số người khác. Nếu chúng ta sử dụng Entity for Address, tôi sẽ cho rằng sẽ có một địa chỉ duy nhất mà tất cả các đối tượng Person liên kết đến. Nếu một người di chuyển ra ngoài, bạn muốn cập nhật địa chỉ của mình. Nếu bạn cập nhật các thuộc tính của Entity Address, tất cả mọi người sẽ có một địa chỉ khác. Trong trường hợp đối tượng giá trị, chúng tôi sẽ không thể chỉnh sửa Địa chỉ (vì nó không thay đổi) và chúng tôi sẽ buộc phải cung cấp Địa chỉ mới cho Người đó.

Điều này có đúng không? Tôi phải nói rằng tôi đã / cũng vẫn còn bối rối về sự khác biệt này, sau khi đọc cuốn sách DDD.

Đi thêm một bước nữa, mô hình này sẽ được mô hình hóa như thế nào trong cơ sở dữ liệu? Bạn có tất cả các thuộc tính của đối tượng Địa chỉ dưới dạng các cột trong bảng Person hay bạn sẽ tạo một bảng Địa chỉ riêng biệt cũng sẽ có một mã định danh duy nhất? Trong trường hợp thứ hai, những người sống trong cùng một ngôi nhà sẽ có một cá thể khác nhau của một đối tượng Địa chỉ, nhưng các đối tượng đó sẽ giống nhau trừ thuộc tính ID của chúng.


6
2017-09-18 10:07



"Hãy lấy trường hợp này: Bạn đang sống trong nhà của bạn với một số người khác. Nếu chúng ta sử dụng Entity for Address, tôi sẽ cho rằng sẽ có một địa chỉ duy nhất mà tất cả các đối tượng Person liên kết tới". Tôi nghĩ rằng mỗi người trong số họ có một ví dụ riêng của Địa chỉ, nhưng chúng chỉ giống nhau (giống như mỗi người trong số họ có thể có 5 đô la tiền giấy, nhưng điều đó không có nghĩa là nó là cùng một tờ giấy bạc) - Prokurors


địa chỉ có thể là đối tượng thực thể hoặc giá trị phụ thuộc vào quá trình busiess. đối tượng địa chỉ có thể là thực thể trong ứng dụng dịch vụ chuyển phát nhanh nhưng địa chỉ có thể là đối tượng giá trị trong một số ứng dụng khác. trong các vấn đề nhận dạng ứng dụng chuyển phát nhanh cho đối tượng địa chỉ


3
2018-03-18 12:59





Tôi hỏi về điều này trong một chủ đề khác và tôi nghĩ rằng tôi vẫn còn bối rối. Tôi có thể cân nhắc hiệu suất khó hiểu với mô hình hóa dữ liệu. Trong ứng dụng Cataloging của chúng tôi, Khách hàng không thay đổi cho đến khi cần. Điều đó nghe có vẻ ngu ngốc - nhưng 'đọc' dữ liệu khách hàng vượt xa số lượng 'viết' và vì nhiều yêu cầu web đều được nhấn vào 'bộ hoạt động' của các đối tượng, tôi không muốn tiếp tục tải Khách hàng một lần nữa. Vì vậy, tôi đã đi xuống một con đường bất biến cho đối tượng khách hàng - tải nó, lưu trữ nó, và phục vụ cùng một đến 99% (đa luồng) yêu cầu mà muốn xem khách hàng. Sau đó, khi một khách hàng thay đổi một cái gì đó, hãy lấy một 'người biên tập' để tạo một Khách Hàng mới và làm mất hiệu lực của một khách hàng cũ.

Mối quan tâm của tôi là nếu nhiều chủ đề nhìn thấy cùng một đối tượng khách hàng và nó có thể thay đổi được, thì khi một chủ đề bắt đầu thay đổi nó thì tình trạng lộn xộn xảy ra ở những người khác.

Vấn đề của tôi bây giờ là, 1) là điều này hợp lý, và 2) cách tốt nhất để làm điều này mà không cần sao chép rất nhiều mã về các thuộc tính.


2
2018-04-21 13:41





Loại giá trị: 

  • Các kiểu giá trị không tồn tại một mình, phụ thuộc vào loại thực thể.
  • Đối tượng Loại giá trị thuộc về đối tượng loại thực thể.
  • Tuổi thọ của một thể hiện kiểu giá trị được giới hạn bởi tuổi thọ của cá thể thực thể sở hữu.
  • Ba loại giá trị: Cơ bản (kiểu dữ liệu nguyên thủy), Tổng hợp (Địa chỉ) và Bộ sưu tập (Bản đồ, Danh sách, Mảng)

Thực thể: 

  • Các loại thực thể có thể tồn tại một mình (Danh tính)
  • Một thực thể có chu kỳ sống riêng. Nó có thể tồn tại độc lập với bất kỳ thực thể nào khác.
  • Ví dụ: Person, Organization, College, Mobile, Home vv .. mọi đối tượng đều có bản sắc riêng

1
2018-01-28 04:24





3 khác biệt giữa Entities và Value Objects 

  • Định danh và công bằng cấu trúc: Các thực thể có số nhận dạng, các thực thể giống nhau nếu chúng có cùng số nhận dạng. Các đối tượng giá trị vượt ra ngoài bàn tay có sự bình đẳng về cấu trúc, chúng ta xem xét hai các đối tượng giá trị bằng nhau khi tất cả các trường đều giống nhau. Các đối tượng giá trị không thể có số nhận dạng.

  • Mutability vs immutability: Các đối tượng giá trị là các cấu trúc dữ liệu bất biến trong khi các thực thể thay đổi trong thời gian cuộc sống của họ.

  • Tuổi thọ: Các đối tượng giá trị phải thuộc về các thực thể


0
2017-11-21 20:40