for No projeto em que estou trabalhando, enviamos mensagens sobre widgets através de filas de mensagens, serializando-os nas filas como XML. O esquema XML contém tags para propriedades comuns a todos os tipos dessas mensagens de widget, como tipo de widget, nome do comando e destino. Também pode conter uma lista de pares de valores-chave de tamanho arbitrário para permitir o armazenamento de propriedades que são relevantes apenas para um tipo específico de mensagem do widget. A WidgetMessageclasse encapsula esses dados e as classes WidgetMessageXmlWritere WidgetMessageXmlReaderfornecem serialização de e para o XML.
Eu criei algumas classes que encapsulam mensagens específicas, por exemplo, FooPlaySoundMessagepara um widget 'Foo' ou BarSetLightPatternMessagepara um widget 'Bar'. Cada um deles tem um ToWidgetMessagemétodo de instância e um FromWidgetMessagemétodo estático para converter de e para a WidgetMessageclasse. Cada família de mensagens herda de uma classe abstrata para esse tipo de widget, por exemplo , FooMessagee BarMessage, que por sua vez herda da WidgetMessageMappingclasse; isso armazena as propriedades comuns da mensagem e os métodos protegidos usados pelas subclasses para conversão. Nenhuma dessas classes é herdada WidgetMessagedesde que eu não quero que elas herdem sua propriedade de coleção de valor-chave e métodos associados , daí a necessidade de conversão em vez de simples conversão.
Eu gosto da simplicidade da minha API (por exemplo FooPlaySoundMessage msg = FooPlaySoundMessage.fromWidgetMessage(widgetMessage)), mas o fato de eu estar precisando usar métodos protegidos em uma classe base para compartilhar funcionalidades e métodos estáticos para expô-las me faz pensar se deveria haver uma ou duas classes separadas envolvidas aqui (semelhante a WidgetMessageXmlWritere WidgetMessageXmlReader). Por outro lado, pensei que parte do objetivo do POO é agrupar dados e métodos e assim evitar "objetos de dados burros" .
Então, eu tenho a idéia certa adicionando métodos de conversão aos meus objetos de dados ou essa funcionalidade deve ser extraída para outra classe?
Atualizar:
Penso que em todos os detalhes acima da minha tentativa atual de design não expliquei com clareza suficiente o problema que estou tentando resolver.
Em resumo, eu tenho uma classe DTO "genérica" que possui algumas propriedades fortemente tipadas e uma coleção de pares de valores-chave para armazenar outros dados personalizados. Desejo ter algumas classes DTO especializadas para cada conjunto de dados personalizados que armazenam todos os mesmos dados que o DTO genérico, exceto com os pares de valores-chave substituídos por propriedades fortemente tipadas. Qual é o melhor design para converter entre esses dois tipos de DTO?