Khách hàng có thể gọi các phương thức trên các thực thể khác với gốc tổng hợp không?


10

Evans giới thiệu trong cuốn sách "Thiết kế hướng tên miền" của mình trong Chương 6 "Uẩn" khái niệm về cốt liệu. Ông còn định nghĩa thêm các quy tắc để chuyển khái niệm đó thành một triển khai (Evans 2009, trang 128-129):

ENTITY gốc có thể trao các tham chiếu đến ENTITY bên trong cho các đối tượng khác, nhưng các đối tượng đó chỉ có thể sử dụng chúng tạm thời và chúng không thể giữ tham chiếu.

Sau khi xây dựng các quy tắc khác, ông tóm tắt chúng vào đoạn này:

Phân cụm các Thực thể và Đối tượng Giá trị thành Tập hợp và xác định ranh giới xung quanh mỗi Đối tượng. Chọn một Thực thể làm gốc của mỗi Tập hợp và kiểm soát tất cả quyền truy cập vào các đối tượng bên trong đường biên thông qua thư mục gốc. Cho phép các đối tượng bên ngoài chỉ giữ các tham chiếu đến thư mục gốc. Tham chiếu thoáng qua cho các thành viên nội bộ chỉ có thể được đưa ra để sử dụng trong một hoạt động duy nhất. Bởi vì root kiểm soát quyền truy cập, nó không thể bị che khuất bởi những thay đổi đối với bên trong. Sự sắp xếp này làm cho nó thực tế để thực thi tất cả các bất biến cho các đối tượng trong Tổng hợp và cho toàn bộ Tổng thể trong bất kỳ thay đổi trạng thái nào.

Vì vậy, việc sử dụng tạm thời chính xác có nghĩa là gì?

Đồng nghiệp của tôi hiểu rằng chỉ có gốc tổng hợp mới hiển thị giao diện chung cho khách hàng. Khách hàng sẽ không có cơ hội gọi bất kỳ hoạt động nào trên một thực thể khác ngoài gốc tổng hợp.

Sự hiểu biết của tôi về các câu trích dẫn là khác nhau. Tôi hiểu rằng nó thực sự rõ ràng cho phép khách hàng gọi các hoạt động trên các thực thể nội bộ. Tuy nhiên chỉ sau khi nhận được chúng từ gốc.

Vì vậy, hãy có một ví dụ cụ thể:

Hãy nói rằng Cartbao gồm nhiều Items. Mỗi cái Itemcó một Quantity. Mô hình nên hỗ trợ trường hợp sử dụng "Tăng số lượng của một Mục cụ thể". Không có bất biến nào có thể bị vi phạm, điều này ảnh hưởng đến mọi thứ bên ngoài Vật phẩm.

Là một mô hình vi phạm các quy tắc được trích dẫn ở trên, khi khách hàng có thể thực hiện việc này bằng cách gọi cart.item(itemId).increaseQuantity()hoặc khách hàng chỉ được phép gọi một cart.increaseItemQuantity(itemId)? Điều gì sẽ là lợi ích của sau này?


Cái nào có ý nghĩa hơn từ góc độ kinh doanh?
Robert Harvey

Đó là một ví dụ nhân tạo. Câu hỏi của tôi là về việc giải thích hai đoạn trích dẫn từ cuốn sách Evans. Nhưng các chuyên gia trong lĩnh vực nhân tạo sẽ nói về "tăng số lượng của một mặt hàng giỏ hàng". Vì vậy, giỏ hàng, vật phẩm và số lượng là một phần của UL.
Markus Malkusch

1
Ví dụ của bạn không giả tạo hơn sắc lệnh của Evans. Có thể hữu ích khi chỉ ra rằng DDD không thực sự là một kỹ thuật lập trình, mặc dù có nhiều người cố gắng sử dụng nó theo cách đó.
Robert Harvey

Bạn có thể chia sẻ thêm một chút văn bản từ cuốn sách, để các trích dẫn bị coi thường của bạn có nhiều bối cảnh hơn không?
Robert Harvey

2
Vâng cảm ơn. Điều Evans đang nói là bạn nên cho phép Root tổng hợp kiểm soát trạng thái bên trong của chính nó (một cách thực hành tốt cho bất kỳ lớp nào, thực sự). Do đó, có thể có ý nghĩa hơn khi cho phép xe đẩy kiểm soát số lượng tăng theo cart.increaseItemQuantity(itemId), nếu không vì lý do nào khác ngoài việc vi phạm Luật của Demeter. Gọi điện cart.increaseItemQuantity(itemId)cho phép bạn thực hiện những việc như cập nhật tổng số tiền của giỏ hàng.
Robert Harvey

Câu trả lời:


2

Miễn là Itemkhông thể tồn tại mà không Cartcó mặt, thì không có sự khác biệt giữa hai lựa chọn. Có thể giữ bất biến trong cả hai trường hợp.

Trong trường hợp phương thức được bật Item, Itemcó thể "thông báo" cho giỏ hàng mẹ của nó để kiểm tra bất biến khi cần thay đổi trạng thái của chính nó. Điều này làm cho mọi thứ phức tạp hơn một chút, bởi vì sau đó có sự phụ thuộc theo chu kỳ giữa ItemCart(mà tôi cho rằng không phải là vấn đề nhờ vào giả định trong câu đầu tiên và một cái gì đó mà IMO cần tồn tại theo cách nào đó).

Trong trường hợp phương thức được bật Cart, nó làm cho nó trở nên đơn giản hơn, vì không cần phải Itemtham khảo Cart. Nhưng nó làm cho nó phức tạp bởi vì bây giờ phương thức không chỉ kiểm tra bất biến và trạng thái thay đổi. Nhưng nó cũng cần đảm bảo vật phẩm (hoặc ID của nó) hợp lệ cho việc này Cart. Trong trường hợp khác, điều này đã được xử lý bằng phương thức truy vấn mục đã cho từ giỏ hàng.

tl; dr; Cả hai lựa chọn đều có những ưu điểm và nhược điểm rõ ràng và dường như không rõ ràng tốt hơn hay xấu hơn các lựa chọn khác.

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.