Đối tượng giá trị duy nhất so với thực thể


8

Cố gắng chuyển đổi một số thực thể thành các đối tượng giá trị Tôi bị mắc kẹt trong trường hợp một đối tượng giá trị phải là duy nhất trong một tổng hợp.

Giả sử chúng ta có một thực thể Phim tạo gốc của tổng hợp. Đây Movie tổ chức có liên quan với một số bộ AdvertisementEvent đối tượng với vai trò hiển thị một quảng cáo tại timestamp nhất định.

Các AdvertisementEvent chứa một liên kết đến một số Banner phải được hiển thị, tọa độ và một số bộ lọc có hiệu lực.

AdvertisingEvent chỉ là một tập hợp các tham số cấu hình, tôi không chắc liệu tôi có nên quan tâm đến danh tính của nó hay không và coi nó như một đối tượng có giá trị lớn. Tuy nhiên, tôi quan tâm rằng trong Phim chỉ có một AdvertisingEvent tại một dấu thời gian nhất định, thậm chí có thể là xung quanh dấu thời gian.

Tôi thấy khó phân chia những nghi ngờ của mình trong nhiều câu hỏi độc lập, vì vậy họ đi:

  1. Liệu một tập hợp các tham số cấu hình nghe có vẻ như một đối tượng giá trị?
  2. Tôi có pha trộn khái niệm về tính độc đáo của AdvertisingEvent trong quy tắc toàn vẹn giao dịch và phim không?
  3. bất kỳ lựa chọn nào trong điểm (2) ngụ ý rằng AdvertisingEvent phải là thành viên của tổng hợp do Phim tạo ra không?
  4. Đối tượng AdvertisingEvent của tôi có phải là Thực thể, Đối tượng Giá trị hay Đối tượng Sự kiện không? (Tôi đã sử dụng hậu tố Sự kiện trong tên để làm nổi bật sự nhầm lẫn của mình)
  5. Là những đối tượng giá trị lớn như thế này là một mùi thiết kế?

Tôi đoán rằng tôi không xử lý một Sự kiện theo nghĩa DDD vì đó không phải là điều chỉ xảy ra . Sự kiện DDD thực sự sẽ giống như AdvertisingEventReached

Câu trả lời:


9

Sự khác biệt giữa đối tượng Thực thể và Giá trị phải dựa trên câu hỏi: Nếu tôi có hai đối tượng có cùng nội dung (hai Quảng cáo liên kết đến cùng một Biểu ngữ có cùng tham số), tôi nên xử lý chúng khác nhau hoặc có thể thay thế chúng bằng cách khác mà không ảnh hưởng đến cách thức hoạt động của phần mềm?

Trong trường hợp này, tôi sẽ nói rằng bạn có thể thay thế một AdvertisingEvent bằng một giá trị khác bằng các giá trị tương tự mà không ảnh hưởng đến hoạt động của phần mềm. Điều này làm cho chúng trở thành các đối tượng Giá trị (giá trị được chứa là giá trị, không phải là danh tính của chính đối tượng).

Đối với kích thước của một đối tượng Giá trị: Miễn là nó chứa một tập hợp các tham số nhất quán cho một trách nhiệm, không có giới hạn về mức độ lớn của một đối tượng Giá trị. Trong quá trình thực hiện, có thể tốt khi chú ý đặc biệt đến các đối tượng có giá trị lớn để đảm bảo chúng không bị sao chép một cách không cần thiết và quá mức nhưng nếu không thì không có vấn đề gì.

Đối với các ràng buộc về số lượng AdvertisingEvents bạn có trong Phim , đây là một ràng buộc về mối quan hệ giữa Phim và bộ sưu tập AdvertisingEvents của nó , không phải trên một trong các lớp đó. Như vậy, vị trí hợp lý nhất để thực thi ràng buộc là tại điểm bộ sưu tập được duy trì trong Phim (do đó, trong phương thức mà bạn cố gắng thêm AdvertisingEvent ).


Cám ơn rất nhiều! Mặc dù đã đọc rất nhiều lần về việc hỏi câu hỏi đó để phân biệt các Thực thể với Đối tượng Giá trị, nhưng lần này cuối cùng nó đã "nhấp chuột". Tôi đoán tôi cần một vấn đề trong cuộc sống thực của mình để học bài học đó. Tôi yêu vấn đề của mình vì nó đã phơi bày en Object Object (không phải là Sự kiện Miền) và những gì dường như là duy nhất (là bất biến). Tôi đoán rằng trong câu hỏi của tôi, tôi nên nói "bất biến" thay vì "quy tắc toàn vẹn giao dịch".
SystematicFrank

Thật thú vị ... như là một tác dụng phụ của việc hiểu rõ hơn sự khác biệt này, bây giờ tôi có thể thấy rõ tầm quan trọng của các đối tượng giá trị không trạng thái / không thể thay đổi để cải thiện tính ổn định của chương trình. Tôi đoán rằng tôi đã suy nghĩ quá nhiều về các chi tiết triển khai GUI ... đột biến dễ dàng là tốt trong Lớp ứng dụng, nhưng trong Lớp Miền tôi muốn Quảng cáo không thể thay đổi được!
SystematicFrank
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.