it-swarm-vi.tech

Đối tượng giá trị so với thực thể (Thiết kế hướng tên miền)

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

79
StackUnderflow

Giảm sự phân biệt thiết yếu, vấn đề nhận dạng đối với 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 Tên khách hàng (đối tượng giá trị), Danh sách <Order> OrderHistory (Danh sách thực thể) và có lẽ là Địa chỉ mặc định (thường là đối tượng giá trị). Thực thể khách hàng sẽ có một ID và mỗi đơn hàng sẽ có một ID, nhưng Tên thì không nên; nói chung, trong mô hình đối tượng, dù sao, 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 sẽ 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. Chính xác, phương thức cá thể Equals trên Tên 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 thể hiện 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ứ khi 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 một lớp hạt mịn, bạn đã có một đối tượng giá trị. Ví dụ, một IPAddress lớp, 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ị. 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 hợp các hành vi của chính nó.

Hoàn toàn có khả năng rằng ngay cả các mục có danh tính trong cơ sở dữ liệu của bạn cũng không có danh tính 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 của một số thuộc tính có ý nghĩa với nhau. Bạn có thể không muốn có Khách hàng.FirstName, Customer.LastName, Customer.MiddleInitial và Customer.Title khi bạn có thể kết hợp những người đó với tư cách là Khách hàng. họ có thể sẽ có nhiều trường trong cơ sở dữ liệu của bạn tại 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.

91
JasonTrue

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ó 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à bất biến.

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 hợp 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 xác định lại đối tượng. Loại đối tượng này không thể được định nghĩa ở bất biến.

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

30
Richard Dorman

Tôi không biết điều sau đây có đúng khô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ì 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 được liên kết ( một người chẳng hạn).

Hãy xem 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 Thực thể cho Địa chỉ, tôi sẽ lập luận 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 chuyển đi, bạn muốn cập nhật địa chỉ của anh ta. Nếu bạn cập nhật các thuộc tính của Thực thể Địa chỉ, 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 nghe có đúng không? Tôi phải nói rằng tôi đã/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, làm thế nào điều này sẽ được mô hình hóa trong cơ sở dữ liệu? Bạn sẽ 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 cũng có một định danh duy nhất? Trong trường hợp sau, những người sống trong cùng một ngôi nhà sẽ có một phiên bản khác nhau của một đối tượng Địa chỉ, nhưng những đối tượng đó sẽ giống nhau ngoại trừ thuộc tính ID của họ.

6
Christophe Herreman

địa chỉ có thể là thực thể hoặc đối tượng 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 vấn đề nhận dạng ứng dụng chuyển phát nhanh cho đối tượng địa chỉ 

3
Dharmesh

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ể nhầm lẫn giữa việc xem xét hiệu suất với mô hình dữ liệu. Trong ứng dụng Danh mục của chúng tôi, Khách hàng không thay đổi cho đến khi cần. Nghe có vẻ ngớ ngẩn - nhưng 'số lần đọc' dữ liệu của khách hàng vượt xa số 'ghi' và vì nhiều yêu cầu web đều tập trung 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 nhiều lần. 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ữ bộ đệm và cung cấp cùng một yêu cầu cho 99% (đa luồng) 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 'biên tập viên' để 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, 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 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.

2
n8wrl

Các loại giá trị:  

  • Các loại giá trị không tự tồn tại, phụ thuộc vào các 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 loại giá trị được giới hạn bởi tuổi thọ của thể hiện thực thể sở hữu.
  • Ba loại giá trị: Cơ bản (kiểu dữ liệu nguyên thủy), Kết hợp (Địa chỉ) và Bộ sưu tập (Bản đồ, Danh sách, Mảng)

Các thực thể:  

  • Các loại thực thể có thể tự tồn tại (Danh tính)
  • Một thực thể có vòng đời riêng của nó. 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, Organisation, College, Mobile, Home, v.v., mọi đối tượng đều có bản sắc riêng
2
Premraj

3 sự khác biệt giữa EntitiesValue Objects 

  • Định danh so với đẳng thức cấu trúc: Các thực thể có định danh, các thực thể giống nhau nếu chúng có cùng Định danh . Các đối tượng giá trị nằm ngoài bàn tay có sự bình đẳng về cấu trúc, chúng tôi xem xét hai các lĩnh vực là như nhau. Các đối tượng giá trị không thể Có định danh.

  • Khả năng tương tác và bất biến: 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 sống của chúng.

  • Tuổi thọ: Đối tượng giá trị nên thuộc về các thực thể

0
Ramin Farajpour