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?
fonte
Respostas:
Se o FooPlaySoundMessage souber tocar som e também como se mapear para um formato de fila de mensagens, você poderá dizer que a classe tem mais de uma responsabilidade. Se delegar diretamente o som real que está sendo reproduzido em uma classe diferente, o FooPlaySoundMessage será basicamente um objeto de transferência de dados. Colocar mapeamentos comuns em uma classe base compartilhada me parece bom nesse caso.
Eu provavelmente separaria isso embora. Os objetos de transferência de dados geralmente têm pouco ou nenhum código; você pode ver o FooPlaySoundMessage como um.
Em algum momento, talvez você precise transmitir os mesmos dados por outros meios ou por outro formato (json, talvez?). Você poderia YAGNI por agora e separá-lo então.
Eu provavelmente criaria uma classe de manipulador de mensagens que analisa as partes comuns, detecta o tipo de mensagem e, em seguida, delega para um analisador específico, por exemplo, FooPlaySoundXmlMessageParser. Em caso de dúvida, favorecer a composição sobre a herança.
fonte