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 WidgetMessage
classe encapsula esses dados e as classes WidgetMessageXmlWriter
e WidgetMessageXmlReader
fornecem serialização de e para o XML.
Eu criei algumas classes que encapsulam mensagens específicas, por exemplo, FooPlaySoundMessage
para um widget 'Foo' ou BarSetLightPatternMessage
para um widget 'Bar'. Cada um deles tem um ToWidgetMessage
método de instância e um FromWidgetMessage
método estático para converter de e para a WidgetMessage
classe. Cada família de mensagens herda de uma classe abstrata para esse tipo de widget, por exemplo , FooMessage
e BarMessage
, que por sua vez herda da WidgetMessageMapping
classe; isso armazena as propriedades comuns da mensagem e os métodos protegidos usados pelas subclasses para conversão. Nenhuma dessas classes é herdada WidgetMessage
desde 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 WidgetMessageXmlWriter
e 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?