Contexto:
Recentemente, tive que lidar com um arquivo de classe gerado pelo XSD.exe. Tinha 3500 linhas de comprimento com nomes de classe / variável ridiculamente detalhados (pense someRidiculouslyLongPrefixThenMaybeOneThingUniqueAtTheEnd
- difícil de comparar de relance someRidiculouslyLongPrefixThenMaybeOneOtherThingChanged
) e anotações em todo o lugar. Resumindo, levei anos para descobrir o que diabos estava acontecendo. Eu li e pensei que nunca colocaria meu nome ao lado de algo tão ... Não limpo.
Questão:
1) É uma má prática mexer com o código gerado (ou seja, limpe-o).
2) Seria melhor prática escrever um mapeador para mapear as classes geradas para minhas próprias classes agradáveis e limpas (com as quais eu poderia trabalhar com prazer)?
EDITAR:
Obrigado por todos os comentários.
Se eu realmente faria algo interessante com ele (por exemplo, se houvesse objetos de domínio que não fossem objetos de transporte), acho que os mapeia para classes 'mais limpas', o que eu teria que fazer de qualquer maneira para obter tipo de funcionalidade deles. Nesse caso, as classes são efetivamente DTOs; portanto, talvez faça sentido que a nomeação corresponda aos elementos correspondentes. Como afirmado, não preciso tocá-lo - apenas para ligar para acessadores / mutadores antes de passar os dados para outra camada para processamento.
Por enquanto, acho que vou deixá-los em paz.
fonte
Respostas:
O perigo de refatorar o código gerado para aprender e arrumar é que, se ele for regenerado novamente pela ferramenta por você ou por outro desenvolvedor, as alterações serão perdidas.
Sua equipe pode se colocar em uma posição em que você geraria o código em outro arquivo, copiá-lo para a versão limpa e refatorar para aplicar as alterações, o que leva tempo e recursos. (Eu estive lá com a versão original do Entity Framework.)
Se você não conseguir conviver com os nomes gerados, altere a fonte gerada ou faça o que você sugere no item 2.
fonte
Como regra geral, nunca toque no código gerado, pois isso significa prometer que você nunca mais o gerará novamente ou terá que refazer todas as alterações feitas. Se você deseja que o código gerado fique mais bonito, é necessário automatizar a geração e a limpeza do código; por exemplo, se você gerar um arquivo XML em algum lugar, convém executá-lo
xmlindent
como parte do seu processo de construção.Por razões semelhantes, o código gerado não pertence ao controle de origem. Você coloca os dados e as regras sob controle de origem e permite que o script de construção lide com a geração de código.
Quaisquer alterações no código gerado precisam passar pelo gerador de código, ou seja, se você deseja que o código gerado pareça diferente, altere as entradas do gerador de código, o próprio gerador de código ou aplique o pós-processamento com script. Mas não edite manualmente.
Uma exceção são os geradores de código no estilo 'andaimes', onde você executa o gerador uma vez para fornecer um esqueleto a partir do qual você constrói mais. Com eles, você nunca executará o gerador novamente para o mesmo arquivo; portanto, basta tratar o arquivo gerado como um arquivo de origem regular e esquecer que ele vem de um gerador.
fonte
Concordo totalmente com a resposta de @NikolaiDante (+1).
No dotnet / c #, você tem o conceito de "classes parciais": o código-fonte para a "classe usar" consiste em 2 arquivos separados, uma parte gerada e uma parte adicionada / editada manualmente. Suas api-embeautifications vão para o arquivo "manual" que não será sobrescrito pelo codegenerator.
No mundo java / hybris, eles usam herança para o código não gerado:
Você tem, por exemplo, uma classe Customer com suas "API-embelezamentos" herdadas de "GeneratedCustomer".
fonte