Thiết kế API nào để lưu trữ dữ liệu chung theo định dạng cụ thể hơn?


8

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 WidgetMessagelớp đóng gói dữ liệu này và WidgetMessageXmlWriterWidgetMessageXmlReaderlớ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ụ: FooPlaySoundMessagecho tiện ích 'Foo' hoặc tiện ích BarSetLightPatternMessage'Bar'. Mỗi cái đều có một ToWidgetMessagephương thức cá thể và một FromWidgetMessagephương thức tĩnh để chuyển đổi sang và từ WidgetMessagelớ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ụ FooMessageBarMessage, do đó kế thừa lần lượt từ WidgetMessageMappinglớ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ừ WidgetMessagekhi 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ự WidgetMessageXmlWriterWidgetMessageXmlReader). 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ì?


Âm thanh như mô hình trang trí? - en.wikipedia.org/wiki/Decorator_potype
Stevo

Thứ hai đó. Tôi nghĩ bạn ổn.
Stu

1
Ngoài ra, như một sự ngẫu nhiên sang một bên: nếu nó hiệu quả với bạn, thì đó là.
Stu

Tin nhắn làm gì thay vì chỉ là tin nhắn?
Piotr Gwiazda

Trách nhiệm duy nhất của các lớp này là được chuyển đổi sang và từ lớp WidgetMessage. Có một dự án 'Widget Comms tiêu thụ WidgetMessages và nói chuyện với các widget; Tôi chưa thêm chức năng giao tiếp như vậy vào các lớp WidgetMessageMapping này vì chỉ có dự án Widget Comms mới biết cách nói chuyện với các widget, trong khi các tin nhắn có thể được tạo ở nhiều phần khác nhau của ứng dụng. Các WidgetMessageMappings chỉ đơn giản là để tránh phân tích thông điệp và mã tạo thông báo được trải rộng trên các lớp của ứng dụng.
Robert Johnson

Câu trả lời:


1

Nếu FooPlaySoundMessage biết cách phát âm thanh và cả cách tự ánh xạ tới định dạng hàng đợi tin nhắn, bạn có thể nói rằng lớp có nhiều hơn một trách nhiệm. Nếu nó trực tiếp ủy thác âm thanh thực sự phát cho một lớp khác, FooPlaySoundMessage của bạn về cơ bản là một đối tượng truyền dữ liệu. Đặt các ánh xạ phổ biến trong một lớp cơ sở dùng chung có vẻ tốt đối với tôi trong trường hợp đó.

Tôi có lẽ sẽ tách nó ra mặc dù. Các đối tượng truyền dữ liệu thường có ít hoặc không có mã, bạn có thể xem FooPlaySoundMessage là một.

Tại một số điểm, bạn có thể phải truyền cùng một dữ liệu bằng một số phương tiện khác hoặc một số định dạng khác (có lẽ là json?). Bây giờ bạn có thể YAGNI và tách nó ra.

Tôi có thể tạo một số lớp xử lý tin nhắn để phân tích các phần chung, phát hiện loại tin nhắn và sau đó ủy quyền cho một trình phân tích cú pháp cụ thể, ví dụ FooPlaySoundXmlMessageParser. Khi nghi ngờ ủng hộ thành phần hơn thừa kế.


Chỉ có WidgetMessage được chuyển đổi sang và từ XML - các DTO chuyên dụng sẽ chỉ được chuyển đổi sang và từ WidgetMessages. Trong thiết kế hiện tại của tôi, chúng vẫn được gọi là 'tin nhắn', mặc dù đó chỉ là WidgetMessage được đưa vào hàng đợi, vì vậy tôi có thể hiểu được sự nhầm lẫn của bạn. Tôi đã cập nhật câu hỏi của mình để giải thích rõ hơn vấn đề tôi đang cố gắng giải quyết.
Robert Johnson
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.