for Nel progetto a cui sto lavorando inviamo messaggi sui widget sulle code dei messaggi, serializzandoli sulle code come XML. Lo schema XML contiene tag per le proprietà comuni a tutti i tipi di questi messaggi widget, come il tipo di widget, il nome del comando e la destinazione. Può anche contenere un elenco di coppie chiave-valore di dimensioni arbitrarie per consentire la memorizzazione di proprietà che sono rilevanti solo per un tipo specifico di messaggio widget. La classe WidgetMessage
incapsula questi dati e le classi WidgetMessageXmlWriter
e WidgetMessageXmlReader
forniscono la serializzazione da e verso XML.
Ho creato alcune classi che incapsulano messaggi specifici, ad esempio FooPlaySoundMessage
per un widget "Foo" o BarSetLightPatternMessage
per un widget "Bar". Ognuno di essi ha un metodo di istanza ToWidgetMessage
e un metodo statico FromWidgetMessage
per la conversione in e dalla classe WidgetMessage
. Ogni famiglia di messaggi eredita da una classe astratta per quel tipo di widget, ad es. FooMessage
e BarMessage
, che a loro volta ereditano dalla classe WidgetMessageMapping
; questo memorizza le proprietà dei messaggi comuni e i metodi protetti utilizzati dalle sottoclassi per la conversione. Nessuna di queste classi eredita da WidgetMessage
poiché non desidero che ereditino la relativa proprietà della raccolta valori-chiave e i metodi associati , quindi la necessità di conversione piuttosto che la semplice trasmissione.
Mi piace la semplicità della mia API (ad es. FooPlaySoundMessage msg = FooPlaySoundMessage.fromWidgetMessage(widgetMessage)
), ma il fatto che io debba usare metodi protetti in una classe base per condividere funzionalità e metodi statici per esporlo, mi chiedo se ci debba essere una classe separata o due coinvolti qui (simile a WidgetMessageXmlWriter
e WidgetMessageXmlReader
). D'altra parte, ho pensato che parte del punto di OOP fosse raggruppare insieme dati e metodi e quindi evitare "oggetti dati stupidi" .
Quindi, ho un'idea giusta aggiungendo metodi di conversione ai miei oggetti dati, o questa funzionalità dovrebbe essere estratta in un'altra classe?
Aggiornamento:
Penso che in tutti i dettagli sopra del mio attuale tentativo di progettazione non ho spiegato abbastanza chiaramente il problema che sto cercando di risolvere.
In sintesi, ho una classe DTO "generica" che ha alcune proprietà strongmente tipizzate e una collezione di coppie chiave-valore per memorizzare altri dati personalizzati. Voglio avere alcune classi DTO specializzate per ogni set di dati personalizzati che memorizzino tutti gli stessi dati del DTO generico, tranne che con le coppie chiave-valore sostituite da proprietà strongmente tipizzate. Qual è il miglior design per la conversione tra questi due tipi di DTO?