Melhores Práticas para carregar objetos de XML serializado em C #
-
03-07-2019 - |
Pergunta
Saudações,
Eu tenho um objeto particular que pode ser construído a partir de um arquivo, como tal:
public class ConfigObj
{
public ConfigObj(string loadPath)
{
//load object using .Net's supplied Serialization library
//resulting in a ConfigObj object
ConfigObj deserializedObj = VoodooLoadFunction(loadpath);
//the line below won't compile
this = thisIsMyObj;
}
}
Eu quero, em essência, dizer "ok, e agora esse objeto que acabamos desserializado, este é o objeto que de fato são." Existem algumas maneiras de fazer isso, e eu estou querendo saber o que é considerado uma das melhores práticas. Minhas idéias são:
- Criar uma função de cópia-into-me que copia o campo objeto pelo campo. Esta é a implementação atual e eu tenho certeza que é uma idéia horrível desde sempre que um novo membro é adicionado ao objeto que eu preciso também lembrar-se de adicioná-lo para a função de 'cópia em-me', e não há nenhuma maneira que seja sustentável .
- Criar um método estático para a classe ConfigObj que atua como um construtor de-facto para carregar o objeto. Isso soa muito melhor, mas não muito melhor-prática-y.
Eu não estou totalmente feliz com qualquer um dos dois, no entanto. Qual é a melhor prática reconhecida aqui?
Solução
A segunda opção é o que é chamado um fábrica método e é uma técnica de design comum. Se você usar essa técnica, você pode achar que você precisa saber o tipo de classe que você irá carregar antes de realmente carregar a classe. Se você topar com esta situação, você pode usar um tipo de nível superior de fábrica que olha para o fluxo e chama o método de fábrica para o tipo apropriado de classe.
Outras dicas
Não há nada de errado em ter um método estático em vez de um construtor. Na verdade, ele tem um número de vantagens .
Eu sempre ir com o método estático. Geralmente é uma espécie de uma hierarquia que é carregado e, portanto, apenas o objeto raiz precisa do método. E não é realmente uma abordagem incomum no framework .NET (por exemplo Graphics.FromImage), então ele deve estar bem com os usuários de sua classe.