Khi tôi làm việc với sự hiểu biết về thiết kế điều khiển tên miền, tôi thấy rằng tôi có quy tắc có vẻ hoạt động, mặc dù tôi muốn xem liệu nó có quá mức cần thiết hay không và cũng muốn xem các quan điểm khác của cùng một tình huống.DDD Khi nào tôi nên tạo một đối tượng miền và một đối tượng bền vững thay vì sử dụng đối tượng persistence làm đối tượng miền?
Câu hỏi của tôi là: "Khi nào mô hình miền và mô hình bền vững được chứa trong các đối tượng riêng biệt?" Ngôn ngữ tôi chọn là Java vào lúc này và tôi đang sử dụng mô hình kho lưu trữ của Dữ liệu Mùa xuân.
Tôi thấy ba câu trả lời chính cho câu hỏi của mình.
- Luôn sử dụng các đối tượng tên miền riêng biệt từ các đối tượng kiên trì.
- Chỉ sử dụng các đối tượng tên miền riêng biệt khi đặt các phương thức miền (hành vi) đối với các đối tượng bền bỉ là không thực tế.
- Sử dụng các đối tượng bền vững làm đối tượng miền trong mọi trường hợp.
Để đặt câu hỏi về DDD, tôi thấy rằng tôi phải sử dụng ngữ cảnh bị ràng buộc ví dụ vì tôi chưa biết đủ về DDD để hỏi theo cách trừu tượng hơn.
Đây là bối cảnh giáp minh họa của tôi: nói rằng tôi có một hệ thống pháp điển hóa pháp luật với các quy tắc kinh doanh sau:
- Mỗi pháp luật về những cuốn sách phải được phân loại.
- Mỗi luật có một số nhận dạng với hai phần, một tiền tố số hóa mã hóa và hậu tố coassign mã hóa. (Ví dụ: 100-0100, 599-2030).
- Có nhiều khu vực pháp lý đang sử dụng hệ thống mã hóa luật và họ có thể tự tạo các đồng ký nhưng các tiền tố mã hóa toàn cầu và phải giống nhau trên tất cả các khu vực pháp lý để tạo điều kiện so sánh chung.
- các tiền tố số được mã hóa được nhóm thành các danh mục mã hóa rộng. loại pháp điển hóa có một dãy số, chẳng hạn như 100-199, 200-299, 700-799, vv
Để diễn tả bối cảnh bị chặn điều này như một mô hình bền bỉ tôi đã điều sau đây:
table: codification
fields: chart_code, prefix, coassign, codification_category
table: codification_chart
fields: chart_code, jurisdiction_description
table: codification_category
fields: category, low_category_number, high_category_number, description
table: global_codification
fields: prefix, coassign, codification_category
Tôi biết, tôi nên bắt đầu từ mô hình miền trước tiên. Tôi có một mô hình bền bỉ và một mô hình miền
Trong mô hình miền của tôi, tôi có ba miền đối tượng
public Codification {
private String prefix, coassign;
codificationCategory codificationCaegory; // an enum type
public Codification(...) { // set private vars }
// getters for private variables
}
public CodificationChart {
private List<Codification> chartCodifications = new ArrayList<>();
private String chartCode;
// public constructor to initialize private variables
// getters for private variables
public Codification addCodificationToChart(Codification){...}
public void removeCodificationFromChart(Codification){...}
public boolean checkCodificationInChart(Codification){...}
}
public enum CodificationCategory {
CIVIL, CRIMINAL, PROPERTY, CORPORATE, FAMILY, CONSUMER, ETHICS, BANKRUPTCY;
}
ORM Đối tượng:
JPA Mappings of the tables mentioned earlier with the "Entity" suffix added to their table names.
They are omitted for brevity.
Each one contains getters and setters like JPA Pojos do.
If someone asks for the Persistence objects code I will post it.
Điểm duy nhất mà đối tượng tên miền của tôi biết về mô hình persistence nằm trong đối tượng nhà máy của tôi CodificationChartFactory
, trong đó có các giao diện kho lưu trữ mà tôi đang sử dụng để tương tác với các đối tượng ORM được đề cập trước đó. Nhà máy này là phần duy nhất của miền sử dụng các kho lưu trữ kiên trì, do đó phần duy nhất tương tác với lớp kiên trì.
Tạo mô hình miền riêng biệt ở đây có nỗ lực lãng phí không? Tôi có thể thấy làm thế nào tôi có thể đặt các hành vi CodificationChart của tôi trên một đối tượng Persistence. Nó chỉ bằng cách nào đó cảm thấy sai lầm khi đặt những hành vi đó vào một đối tượng kiên trì, chỉ có công việc là lấy một bản ghi từ cơ sở dữ liệu.
Tôi chắc chắn sẽ được sửa chữa.
cảm ơn góc nhìn. Tôi hơi ngại trộn lẫn miền và kiên trì vì tôi nghĩ các chuyên gia khác không làm điều đó. Tôi sẽ thử nó và xem tôi thích nó như thế nào. Tôi đồng ý rằng việc tách biệt trong trường hợp sử dụng JPA chắc chắn có vẻ giống như một lớp phức tạp khác không cần thiết. Tôi thích cách bạn đã trả lời nhiều hơn về việc giữ mọi thứ lại với nhau. Tôi muốn xem câu trả lời nơi ai đó chủ trương tách họ để tôi có thể xem có lý do chính đáng nào để làm như vậy trong trường hợp sử dụng JPA hay không. –
Đây cũng chính xác là nơi tôi đứng, cảm ơn Augusto vì đã đặt nó tốt hơn tôi sẽ có :) Ngoài ra, tôi không biết nhiều về Java nhưng không có thay thế cho chú thích "xâm nhập" JPA, nơi các chi tiết bản đồ sẽ là bên ngoài để một số loại "bản đồ thông thạo" tập tin (như ngày cũ tốt cấu hình ORM XML nhưng trong mã)? Nó sẽ giúp ích rất nhiều với sự thiếu hiểu biết IMO. – guillaume31
@ guillaume31 Hibernate vẫn hỗ trợ ánh xạ XML (nhiều năm trước, tôi đã có các đồng nghiệp ưa thích phương pháp này, vì vậy sẽ không có mối liên hệ tĩnh giữa mã sản xuất và ánh xạ). Tôi không biết bất kỳ phần mở rộng có thể cho phép để xác định các bản đồ trong một DSL tốt đẹp ... nhưng nó có thể là một vấn đề xây dựng một (tiếc là, nó sẽ được cụ thể ORM). Cuối cùng ... Tôi đã không bao giờ nhìn thấy một ứng dụng mà truy cập dữ liệu là 100% trong suốt trong Java, nó luôn luôn là một trừu tượng bị rò rỉ. – Augusto