Limpieza del código generado: ¿Refactorizador o mapa?

8

Contexto:

Recientemente tuve que lidiar con un archivo de clase generado por XSD.exe. Tenía 3500 líneas de largo con nombres de clase / variable ridículamente verbosos (piense someRidiculouslyLongPrefixThenMaybeOneThingUniqueAtTheEnd, difícil de comparar de un vistazo someRidiculouslyLongPrefixThenMaybeOneOtherThingChanged) y anotaciones por todas partes. En pocas palabras, me llevó años averiguar qué demonios estaba pasando. Lo leí y pensé que nunca pondría mi nombre al lado de algo así que ... No limpio.

Pregunta:

1) ¿Es una mala práctica meterse con el código generado (es decir, limpiarlo)?

2) ¿Sería una mejor práctica escribir un mapeador para mapear las clases generadas a mis propias clases bonitas y limpias (con las que podría trabajar, muy feliz)?

EDITAR:

Gracias por todos los comentarios.

Si realmente iba a hacer algo interesante con él (es decir, si hubiera objetos de dominio que fueran cualquier cosa menos objetos de transporte), entonces creo que los asignaría a clases 'más limpias', lo que tendría que hacer de todos modos para obtener cualquier tipo de funcionalidad fuera de ellos. En este caso, las clases son efectivamente DTO, por lo que quizás tenga sentido que el nombre coincida con los elementos correspondientes. Como se indicó, no necesito tocarlo, solo para llamar a los accesores / mutadores antes de pasar los datos a otra capa para su procesamiento.

Por ahora, creo que los dejaré bien en paz.

Tom Tom
fuente
¿Por qué tendría que mirar (y mucho menos cambiar) el código generado? Aparte de depurar el generador de código, pero ese no parece ser el caso.
Eran las definiciones de clase. : |
Tom Tom
2
Sí, lo entiendo, pero el hecho de que se genere significa que nadie (de nuevo, salvo quizás el autor del generador de código) debería tener que mirar el código generado. Llámalo, sí (si los nombres de clase / método te molestan, ¿no puedes escribir un adaptador que aísle la fealdad?), Pero no lo mires.
tenía exactamente el mismo problema con xsd- fui con 2
jk.
Punto tomado, delnan. Me ocuparé de los nombres sin sentirme demasiado sucio. Después de todo, no los creé.
Tom Tom

Respuestas:

14

El peligro de refactorizar el código generado para limpiar y ordenar es que si la herramienta la regenera usted u otro desarrollador, los cambios se perderían.

Su equipo podría ubicarse en una posición en la que estaría generando el código en otro archivo y copiándolo en la versión limpia y refactorizando para aplicar cambios que solo requieren tiempo y recursos. (He estado allí con la versión original de Entity Framework).

Si no puede vivir con los nombres generados, cambie la fuente que genera o haga lo que sugiere en el n. ° 2.

NikolaiDante
fuente
44
La única vez que debe editar el código generado es si está SEGURO de que no tendrá que volver a generarlo NUNCA. Si intenta confiar en las ediciones manuales y tiene que volver a generar, seguramente perderá algo en el camino.
Michael Kohne
La sobrecarga de mantenimiento es definitivamente el factor decisivo: gracias.
Tom Tom
1
@MichaelKohne Luego, tres semanas después, los requisitos cambian solo un poco y tienes que hacerlo de todos modos. = P
Izkata
10

Como regla general, nunca toque el código generado, porque hacerlo significa prometer que nunca lo volverá a generar, o tendrá que rehacer todos los cambios que haya realizado. Si desea que el código generado se vea mejor, debe automatizar tanto la generación del código como la limpieza; por ejemplo, si genera un archivo XML en algún lugar, es posible que desee ejecutarlo xmlindentcomo parte de su proceso de compilación.

Por razones similares, el código generado no pertenece al control de origen. Pones los datos y las reglas bajo control de origen y dejas que tu script de compilación maneje la generación del código.

Cualquier cambio en el código generado tiene que pasar por el generador de código, es decir, si desea que el código generado se vea diferente, cambie las entradas del generador de código, el generador de código en sí mismo o aplique un procesamiento posterior programable. Pero no edite a mano.

Una excepción son los generadores de código de estilo 'andamio', donde ejecuta el generador una vez para darle un esqueleto a partir del cual construye más. Con ellos, nunca volverá a ejecutar el generador para el mismo archivo, por lo que simplemente trata el archivo generado como un archivo fuente normal y olvida que proviene de un generador.

tdammers
fuente
Puntos interesantes RE: control de origen / proceso de construcción. Hmm (Lo siento, no puedo hacer +1 todavía; tuve que crear una nueva cuenta: $)
Tom Tom
Tenga en cuenta que a veces el código generado es bastante costoso de crear. Por ejemplo, si escanea la base de datos y tiene una base de datos grande, es posible que no tenga que hacer eso cada vez que decida hacer un nuevo pago / sucursal / lo que sea
Earlz
3

Estoy totalmente de acuerdo con la respuesta de @NikolaiDante (+1).

En dotnet / c # tiene el concepto de "clases parciales": el código fuente de la "clase a usar" consiste en 2 archivos separados, una parte generada y una parte añadida / editada manualmente. Sus api-beautifications van en el archivo "manual" que el generador de códigos no sobrescribirá.

En el mundo java / hybris usan la herencia para el código no generado:

Tiene, por ejemplo, un Cliente de clase con sus "api-beautifications" que hereda de "GeneratedCustomer".

k3b
fuente
Es una solución interesante, pero me temo que permanece en el ámbito de una sobrecarga de mantenimiento (escribir / actualizar clases de contenedor para cada cambio en el código generado). ¡Pero gracias!
Tom Tom