2008-09-16 44 views
75

Tôi vừa 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 ...Các đối tượng giá trị so với đối tượng (Thiết kế điều khiển tên miền)

+2

Ở đây tôi đã viết một (IMO) danh sách đầy đủ về sự khác biệt giữa hai: http: // enterprisecraftsmanship. com/2016/01/11/entity-vs-value-object-the-ultimate-list-of-different/ – Vladimir

Trả lời

86

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ị), Danh sách < Đặt hàng > 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.

Đối tượng giá trị thường có thể được biểu diễn dưới dạng đối tượng không thay đổi được; 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 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ó.

Hoàn toàn có thể là ngay cả các mục có nhận dạng trong cơ sở dữ liệu của bạn cũng không có nhận dạng 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.

+0

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 thứ 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 * mà 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

+0

Thứ gì đó giống như 'int [1]' có thể là giá trị không thể chia sẻ, giá trị bất biến có thể chia sẻ (nếu không có thứ 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) của chúng có thể được sử dụng để viết các giá trị có thể được đọc bằng cách sử dụng các giá trị 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

+0

@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ế truy cập vào trạng thái thông qua các thuộc tính chỉ đọc). –

6

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 đối tượng địa chỉ, chúng tôi muốn sử dụng nó làm đối tượng giá trị thay vì thực thể vì thay đổi đối tượng sẽ được phản ánh trên tất cả các đối tượng liên kết (ví dụ một Person).

Lấy trường hợp này: Bạn đang sống trong nhà của mình 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.

+0

"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 tôi sử dụng Thực thể cho Địa chỉ, tôi sẽ cho rằng sẽ có một Địa chỉ duy nhất mà tất cả các đối tượng Người 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

29

Bất kỳ đối tượng nào được xác định chung bởi tất cả thuộc tính của nó 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á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. Một cách đơn giả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.

2

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 có nhiều chủ đề nhìn thấy cùng một đối tượng khách hàng và nó có thể thay đổi, thì khi một chủ đề bắt đầu thay đổi 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) điều này là 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 nhiều mã về các thuộc tính.

3

địa chỉ có thể là đối tượng hoặc đối tượng giá trị tùy thuộc vào quy trình bận. đố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 đề bản sắc ứng dụng chuyển phát nhanh cho đối tượng địa chỉ

0

3 phân biệt giữa EntitiesValue Objects

  • Định danh vs bình đẳng về cơ cấu: Các đối tượng có nhận dạng, các đơn vị đều giống nhau nếu chúng có cùng 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 tôi xem xét hai đố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.

  • Tính đột biến so với bất biến: Đối tượng giá trị là cấu trúc dữ liệu không thay đổi trong khi các thực thể thay đổi trong thời gian cuộc sống .

  • Tuổi thọ: Value Objects nên thuộc to Entities

1

loại Value:

  • Giá trị các loại không tồn tại trên riêng của mình, tùy thuộc vào loại Entity.
  • Đối tượng Loại giá trị thuộc về Đối tượng loại đối tượng.
  • Tuổi thọ của thể hiện loại 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 Value: Basic (kiểu dữ liệu nguyên thủy), Composite (Địa chỉ) và Bộ sưu tập (Bản đồ, List, Mảng)

Đối tượng:

  • Entity loại có thể tồn tại trên riêng của mình (Identity)
  • Một thực thể có vòng đời 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ụ: Người, Tổ chức, Cao đẳng, Mobile, Home vv .. mọi đối tượng có bản sắc riêng của mình
Các vấn đề liên quan