2010-11-01 38 views
5

Tôi hiểu rằng chúng ta không nên thay đổi trực tiếp các con của gốc tổng hợp, mà thay vào đó chúng phải được thực hiện thông qua các phương pháp trên thư mục gốc. Ví dụ: order.SetOrderLineQty(product, qty);Truy cập các Thành viên Tổng hợp được Phân loại Thành viên

Nhưng điều gì xảy ra nếu con cái của tập hợp gốc là nội dung trừu tượng? Hãy tưởng tượng bạn có Gốc tổng hợp xe hơi, chứa danh sách IWheel như một phần của tổng hợp. Làm thế nào bạn sẽ thêm/thay đổi các thuộc tính của bánh xe thông qua tổng hợp của nó-root (những người không biết gì về những loại bê tông của bánh xe họ có thể được)?

Ví dụ thế giới thực hơn là: Bác sĩ có thể tạo MedicalRerport (tổng hợp), chứa danh sách IMedicalNote (như một phần của tổng hợp MedicalReport). IMedicalNote là một lớp cơ sở/giao diện, được phân loại thành một vài lớp con cụ thể, ví dụ: BloodCheckNote, TemperatureNote, MineralConcentrationNote, v.v.

Mỗi phân lớp có các thuộc tính khác nhau và tất cả đều có thể chỉnh sửa. Tổng hợp MedicalReport có thể chứa một hoặc nhiều trong số các ghi chú này. (Mỗi phân lớp ghi chú có một điều khiển người dùng cụ thể để người dùng nhập/cập nhật chi tiết, được hiển thị dưới dạng bảng/tab trong màn hình Báo cáo y tế lớn)

Câu hỏi của tôi là, làm cách nào để thêm/chỉnh sửa các thuộc tính này ghi chú nghiêm ngặt thông qua tổng hợp-gốc của nó (MedicalReport)? Kể từ khi tôi không được phép thay đổi các ghi chú tài sản trực tiếp, một lựa chọn xấu xí là do phơi bày tất cả các thuộc tính lưu ý có thể vào thư mục gốc tổng hợp (MedicalReport), ví dụ:

report.SetWhiteBloodCellCount(cellCount); 
report.SetBloodCheckComment(comment); 
report.SetTemperature(bodyPart, temperature); 
report.AddMineral(mineral, concentration); 

Mỗi phương pháp sẽ cập nhật (hoặc tạo mới) lưu ý các mục trong bộ sưu tập trẻ em nội bộ của nó. Có 2 vấn đề rõ ràng với điều này:

  1. Chúng tôi phải xác định trước tất cả các thuộc tính có sẵn của tất cả các lớp con IMedicalNote có thể trên tổng hợp gốc. Điều đó không thể chấp nhận được vì số lượng lớp con được đảm bảo phát triển, phụ thuộc vào loại dữ liệu y tế mà chúng tôi muốn nắm bắt, đó là toàn bộ điểm của thừa kế ở vị trí đầu tiên.
  2. Có thể có nhiều phiên bản của cùng loại ghi chú trong danh sách. API này sẽ thất bại, vì chúng tôi không thể chỉ nói report.SetBloodCheckComment(comment) và hy vọng nó sẽ cập nhật một mục BloodCheckNote trong danh sách, bởi vì chúng tôi cho phép nhiều hơn một mục BloodCheckNote trong danh sách.

Tôi vẫn muốn duy trì tất cả các tương tác với các ghi chú này thông qua gốc tổng hợp của nó, vì nó phải kiểm soát liệu toàn bộ tập hợp MedicalReport có hợp lệ hay không, cho dù tổng hợp không thể sửa đổi, lạc quan kiểm tra đồng thời, vv Nhưng làm thế nào tôi có thể làm điều đó?

Trả lời

4

Tự hỏi liệu bạn có đang diễn giải sai hướng dẫn xung quanh nguồn gốc tổng hợp không (Hoặc có thể tôi đã làm ...).

Tôi chưa bao giờ đọc hướng dẫn nói: "tổng hợp phải cung cấp các phương thức proxy cho mọi thuộc tính có thể tưởng tượng được của tất cả các đối tượng tổng hợp của nó". Thay vào đó, tôi nghĩ rằng nó nói: "tổng hợp kiểm soát vòng đời, danh tính và mối quan hệ của các đối tượng tổng hợp của nó".

Vì vậy, nó hoàn toàn hợp lệ cho một khách hàng để yêu cầu tổng hợp cho một (transient) tham chiếu đến một trong các đối tượng của nó và làm một cái gì đó với nó.Tôi không có bản sao của tôi của DDD đây để xác nhận cách diễn đạt, nhưng điều đó có vẻ phù hợp với DDD summary ebook (p53) mà nói:

Có thể cho vào thư mục gốc để vượt qua tham chiếu thoáng qua của nội đối tượng các đối tượng bên ngoài, với điều kiện các đối tượng bên ngoài không giữ tham chiếu sau khi thao tác hoàn tất.

Vì vậy, trong trường hợp khách hàng của bạn sẽ hỏi MedicalReport ví dụ (s) của IMedicalNote, trở lại phân nhóm, hoạt động trên chúng cho phù hợp và vượt qua trở lại vào thư mục gốc nếu có. Như tôi nói: không thể nói chắc chắn là phù hợp với DDD, nhưng ý thức chung cho biết đó là giải pháp linh hoạt và có khả năng mở rộng hơn là cố gắng phản ánh mọi thuộc tính/phương pháp của mọi loại phụ trong gốc tổng hợp.

hth.

+0

Hiểu biết của tôi là bạn có thể truy xuất đối tượng bên trong (IMedicalNote) nhưng chỉ cho mục đích chỉ đọc. Bạn không được phép sửa đổi nó. Tất cả các sửa đổi phải được thực hiện thông qua thư mục gốc để nó có thể kiểm soát tính toàn vẹn. Ngoài ra, những gì bạn có nghĩa là bằng cách chuyển nó trở lại gốc? Một khi chúng ta sửa đổi thuộc tính của đứa trẻ bên ngoài, thì đó là nó, nó đã thay đổi (bằng cách tham chiếu), bỏ qua gốc, phải không? "Quay lại gốc" làm gì? – Sheepy

+0

Xin lỗi, trả lời phần nào mơ hồ. Root truyền lại các bản sao của các đối tượng mà khách hàng sau đó cập nhật và chuyển về gốc. Root sau đó chịu trách nhiệm kiểm tra các bất biến và thiết lập các mối quan hệ. Cung cấp một phân chia trách nhiệm hợp lý: root biết về các mối quan hệ và ràng buộc giữa các đối tượng tổng hợp nhưng không cần biết chi tiết của tất cả các kiểu con. Khách hàng có thể hoạt động trên các kiểu con cụ thể theo yêu cầu. Lưu ý Gốc có thể cần phải biết một số chi tiết loại phụ (ví dụ: nếu nó phải giữ chính xác một 'BloodCheckNote' nhưng có thể có nhiều' TemperatureNote's). – sfinnie

+0

Bạn muốn tạo một cơ chế sao chép sao cho thư mục gốc sẽ luôn trả về một bản sao của mỗi chú thích con khi được truy cập thông qua trình thu thập công khai của root? Và sau đó một cách để sao chép các giá trị này trở lại đối tượng thực tế của nó khi khách hàng trả lại những đứa trẻ này trở lại thư mục gốc. Chỉ muốn làm rõ nếu đó là những gì bạn có nghĩa là, bởi vì nó có vẻ giống như một chút công việc. Chúc mừng – Sheepy

Các vấn đề liên quan