vì trong dự án tôi đang làm việc, chúng tôi gửi tin nhắn về các vật dụng qua hàng đợi tin nhắn, tuần tự hóa chúng lên hàng đợi dưới dạng XML. Lược đồ XML chứa các thẻ cho các thuộc tính phổ biến cho tất cả các loại của các thông báo widget này, chẳng hạn như loại widget, tên lệnh và đích. Nó cũng có thể chứa một danh sách các cặp khóa-giá trị có kích thước tùy ý để cho phép lưu trữ các thuộc tính chỉ liên quan đến một loại thông báo tiện ích cụ thể. Các WidgetMessage
lớp đóng gói dữ liệu này và WidgetMessageXmlWriter
và WidgetMessageXmlReader
lớp này cung cấp serialization đến và đi từ XML.
Tôi đã thực hiện một số lớp đóng gói các thông điệp cụ thể, ví dụ: FooPlaySoundMessage
cho tiện ích 'Foo' hoặc tiện ích BarSetLightPatternMessage
'Bar'. Mỗi cái đều có một ToWidgetMessage
phương thức cá thể và một FromWidgetMessage
phương thức tĩnh để chuyển đổi sang và từ WidgetMessage
lớp. Mỗi gia đình thông điệp kế thừa từ một lớp trừu tượng cho loại phụ tùng, ví dụ FooMessage
và BarMessage
, do đó kế thừa lần lượt từ WidgetMessageMapping
lớp; cái này lưu trữ các thuộc tính thông báo chung và các phương thức được bảo vệ được sử dụng bởi các lớp con để chuyển đổi. Không có lớp nào trong số này kế thừa từ WidgetMessage
khi tôi không muốn chúng kế thừa thuộc tính bộ sưu tập giá trị khóa và các phương thức liên quan , do đó cần phải chuyển đổi thay vì truyền đơn giản.
Tôi thích sự đơn giản của API của tôi (ví dụ FooPlaySoundMessage msg = FooPlaySoundMessage.fromWidgetMessage(widgetMessage)
), nhưng thực tế tôi phải sử dụng các phương thức được bảo vệ trong lớp cơ sở để chia sẻ chức năng và phương thức tĩnh để hiển thị nó, khiến tôi tự hỏi liệu có phải có một hoặc hai lớp riêng biệt liên quan không ở đây (tương tự WidgetMessageXmlWriter
và WidgetMessageXmlReader
). Mặt khác, tôi nghĩ rằng một phần của quan điểm của OOP là nhóm dữ liệu và phương thức lại với nhau và do đó tránh "các đối tượng dữ liệu câm" .
Vì vậy, tôi có ý tưởng đúng bằng cách thêm các phương thức chuyển đổi vào các đối tượng dữ liệu của mình hay chức năng đó có nên được trích xuất sang một lớp khác không?
Cập nhật:
Tôi nghĩ rằng trong tất cả các chi tiết ở trên về nỗ lực hiện tại của tôi đối với một thiết kế, tôi đã không giải thích rõ ràng đủ vấn đề mà tôi đang cố gắng giải quyết.
Tóm lại, tôi có một lớp DTO "chung" có một số thuộc tính được gõ mạnh và một tập hợp các cặp khóa-giá trị để lưu trữ dữ liệu tùy chỉnh khác. Tôi muốn có một số lớp DTO chuyên biệt cho từng bộ dữ liệu tùy chỉnh lưu trữ tất cả dữ liệu giống như DTO chung, ngoại trừ các cặp giá trị khóa được thay thế bằng các thuộc tính được gõ mạnh. Thiết kế tốt nhất để chuyển đổi giữa hai loại DTO này là gì?