nhibernate - name - ¿Es la generación de código una cosa mala?
meta tags para seo (20)
Code Generator puede ahorrarte un tiempo valioso, pero ten en cuenta que si comienzas a generar grandes cantidades de código, eso también significa que tu código no está SECO, lo que significa mucha repetición. Esto podría introducir problemas para el mantenimiento del código y degradar la elegancia de su código.
Si se encuentra generando muchos bloques de código repetidos o código similar, intente encontrar una mejor manera, como la generación de código de Class Factories / Runtime. Se tarda más en escribir, pero es más divertido y más elegante. También facilita el mantenimiento.
Por último, si tiene la libertad de elegir su idioma, puede probar ActiveRecord de Ruby (un paquete de rieles), DataMapper o Sequel. Todos ellos son excelentes ORM que requieren una configuración mínima.
Esta es una pregunta subjetiva.
Recientemente he estado tratando de aprender NHibernate. El problema con esto es al menos 2 veces:
- Mapeo de archivo xml que necesita ser codificado a mano
- Clase de entidad que necesita codificación manual
Aunque NHibernate es un marco maravilloso, pero la necesidad de escribir un archivo de mapeo y crear clases de entidades que imiten las tablas de la base de datos es difícil de escribir. Existen algunas herramientas que pueden aliviar este problema, como Castle ActiveRecord o NHibernate Fluent.
Pero tanto como esas herramientas pueden reducir el problema de repetición de código, todavía hay algún código de duplicación que tiene que escribir, o algunos atributos decorativos que debe poner. Ahora estoy probando alguna herramienta de generación de código que me permite generar los archivos de mapeo y las clases de entidad directamente desde la base de datos. Para mí esta es una tarea que ahorra más esfuerzo.
¿Qué piensas?
Creo que la cuestión de si usar o no la generación de código depende de cuáles sean sus objetivos con el código.
Su ejemplo de una capa de acceso a datos es bueno. Su problema con NHibernate es que usted mismo debe generar las clases de dominio. Si sus clases de dominio se asignan directamente al esquema de la base de datos, esto no es un problema. Sin embargo, una de las fortalezas de NHibernate en este escenario es precisamente que PUEDE definir sus propias clases de dominio y que no tienen que asignarse con precisión a la capa de base de datos. Eso significa que puede ajustar su capa de base de datos más adelante y el único código que debe cambiar es el archivo de mapeo. Si utilizas la generación de código, es probable que tengas que ajustar mucho más código, y los ajustes no siempre serán tan sencillos como los ajustes a los archivos de mapeo.
Creo que la mayoría de las personas que responden negativamente con respecto a la generación de código no son desarrolladores de .NET o no saben nada sobre la generación de código.
El uso de .NET frente a otras plataformas hace una gran diferencia, ya que .NET tiene construcciones incorporadas en los lenguajes para hacer posible aumentar y extender fácilmente el código generado.
Creo que la mayoría de los desarrolladores de .NET que leen este artículo ya están utilizando la generación de código y ni siquiera lo saben, Entity Framework usa plantillas de generación de código T4
https://msdn.microsoft.com/en-us/library/bb126445.aspx
¿Por qué la generación de código es "buena"?
Utiliza la generación de código por un motivo: para unir dos capas de aplicación dispares, generalmente entre la base de datos y la aplicación. Comúnmente, la tarea de crear una abstracción de un esquema de base de datos en una aplicación es metódica, en lugar de codificarla a mano, es mejor generar dicho código, ya que generar el código asegura la consistencia.
La gente habló sobre los dolores de cabeza de mantener el código generado por el código, yo hablaría sobre los dolores de cabeza de mantener el código creado manualmente que crea inconsistentemente una abstracción de un sistema de base de datos. Los errores se producen a menudo cuando se trata de un marco que se comporta de manera inconsistente. La generación de código le permite crear código basado en un patrón en múltiples entidades que es consistente.
Código que genera un marco en C # asegurando que sus plantillas usen clases parciales y métodos parciales ...
https://msdn.microsoft.com/en-us/library/wa80x488.aspx
... le permite crear extensiones y aumentar el código generado caso por caso. Estas construcciones existen en C # por ninguna otra razón.
Codigo generar repositorios, entidades e interfaces para ambos. No produciría un sistema que funcione con una base de datos sin utilizar la generación de código.
Creo que si el código generado es más o menos el mismo que escribiría manualmente, entonces siga adelante.
Si está bien hecho, difícilmente tendrá que regresar y modificarlo dentro de un par de meses. Después de que genere su código y realice algunos ajustes, encontrará paz en ese proyecto: P
En general, no desea editar el código generado después de que se haya generado (especialmente si la entrada al generador de código es compleja y / o es probable que cambie).
Creo que generalmente está bien usar la generación de código como parte de un proceso de compilación (por lo tanto, el código generado nunca está bajo el control de la versión).
Mi experiencia en la generación de código "one-shot" (donde el código se genera y luego se ajusta y amplía manualmente) es que es una fuente de dolor. Si alguna vez desea volver y cambiar los datos a partir de los cuales se generó el código, casi siempre tendrá que fusionar manualmente sus cambios personalizados ...
Es una espada de doble filo. Por un lado, puede ser un gran ahorro de tiempo. Mire el tamaño de los apéndices que VS genera cuando lo apunta a un archivo WSDL. No me gustaría tener que codificar eso cada vez que quisiera consumir un nuevo servicio web.
Por otro lado, como usted señala, casi siempre tendrá que modificar sutilmente el código generado, lo que puede generar errores si no sabe exactamente lo que está haciendo, ya que el código generado puede ser bastante laberíntico. Entonces, supongo que mi respuesta es: familiarizarse con lo que se emite desde el generador de código antes de confiar en él.
Estoy de acuerdo con la mayoría de los comentaristas de que la generación de código no es ni buena ni mala. He visto que el código generado es una gran fuente de dolor, así como una solución pragmática para algún problema.
PERO, en su caso, definitivamente vería una característica particular de Fluent NHibernate: el mapeo automático. Más información here .
Una vez configurado, puede crear clases persistentes que se asignan automáticamente al db escribiendo nada más que sus clases de entidad. Esta es la forma correcta de hacerlo: definir su modelo de dominio en la base de datos es un poco complicado (al menos si puede evitarlo).
Mis 2 centavos, al menos.
La generación de código en tiempo de construcción es mala porque:
es mucho más difícil de mantener: un nuevo programador que analiza el proyecto puede perder una semana comprendiendo que realmente se genera un código;
requiere que se genere una compilación completa, y en un entorno de desarrollo no querrás pasar por una compilación completa a menudo;
cuando ocurre una excepción en un código generado, estás atascado;
requiere una configuración SCM adicional (a menudo compleja) para ignorarla;
no puedes modificarlo incluso si lo deseas, porque se anulará en la siguiente compilación;
cambiar las definiciones a partir de las cuales se genera el código puede resultar en romper la base de código, pero esto no se encuentra hasta más tarde (es decir, es posible que se esté desarrollando felizmente al tener un código roto).
La generación de código es algo bueno cuando se hace correctamente, pero con demasiada frecuencia se hace mal.
En mi opinión, los generadores de código deben ser lo suficientemente inteligentes como para manejar los cambios en el código generado. En los días de .NET 1.0, incluso los nuevos generadores de código de Visual Studio .NET podrían hacer eso, dentro de lo razonable. Con .NET 2.0 tenemos clases parciales para hacerlo aún más fácil.
Y, sin embargo, todavía hay algunos generadores que son incapaces de funcionar más de una vez.
Mis reglas para la generación de código "bueno":
- El código debe generarse dentro del IDE para el cual se genera el código. No ejecutables de terceros. Normalmente, este es un complemento de Visual Studio, pero esta regla también se aplica a otros idiomas.
- El código generado debe proporcionar capacidades de extensión claras y fáciles.
- El código generado debería ser invisible para el desarrollador.
- En otras palabras, el desarrollador solo debe usar el diseñador para modificar el código generado.
La generación de código está bien siempre y cuando entienda lo que se está generando o cuando haya reemplazado un valor predeterminado por uno personalizado (caso en cuestión)
Por ejemplo . Esto es parte del mapeo nhibernate generado por MyGeneration
Porque hay un
Está cambiado
propiedad
/// <summary>
/// Returns whether or not the object has changed its values.
/// </summary>
Public virtual bool IsChanged { get; private set; }
¿Cambiará? ¿Cuándo cambiará esto? y lo que pasa cuando cambia.
Una clase de entidad nhibernate hecha a mano probablemente tendrá solo propiedades de columna y constructores.
Estos son todos los escenarios con los que se encontrará, especialmente en un mundo empresarial donde hay cientos de programadores trabajando en un proyecto y la mediocridad es un hecho de la vida.
Otra preocupación es el control de la granularidad , especialmente cuando es parte de la compilación y un buen día te das cuenta de que debería estar bien afinado.
Afortunadamente, los marcos como .net permiten clases parciales, métodos de extensión, etc. que le ayudan a lidiar con estas situaciones.
Larry Wall (el creador de Perl) dice que las tres virtudes cardinales son la pereza, la impaciencia y la arrogancia, y que hay versiones buenas y malas de cada una.
Usted está ejemplificando la pereza (la buena manera) al tratar de automatizar el trabajo aburrido y no creativo. Bien por usted.
Trataría de asegurarme de no tener que modificar el código generado, si es posible, tal vez proporcionando enlaces para agregar personalizaciones.
Muchas buenas respuestas.
Resolver problemas al hacer que los programas escriban programas es una gran idea, pero no hay una gran idea que no pueda ser mal utilizada.
La pregunta básica que le hago a un generador de código es "¿Entiendo lo que está haciendo?".
Si no lo hago, entonces probablemente no me ayude.
No podríamos funcionar en casi el nivel que hacemos sin la generación de código. Es ubicuo.
Sin la generación de código, estaríamos configurando manualmente bits en palabras de microcódigo ancho para enviar las cosas al bus correcto.
Lo que realmente eres de mí es: "¿Está bien que tome algo de este increíble poder para mi propio uso?"
A lo que respondería: "Claro, pásate. Solo recuerda 1) con gran poder es una gran responsabilidad y, 2) solo úsalo para el bien, nunca para el mal".
No tengo absolutamente nada en contra de generar código que no necesite ser modificado: eso es lo que hacen los compiladores :-)
Usar herramientas para guardar la escritura que habría hecho de todos modos, también está bien. En el nivel más simple de esto, la función de autocompletar por el IDE es "generación de código".
Pueden surgir problemas cuando genera un código bastante complejo, luego realiza cambios sustanciales a mano y luego desea repetirlo con la última versión del generador de código. En general, es muy difícil desenredar los cambios y aplicarlos a la nueva versión. diff3 (o sin embargo, su control de código fuente funciona) puede funcionar, pero está lejos de ser una ayuda para nada.
Lo mismo se aplica cuando realiza cambios importantes en el código fuente abierto: si no puede encapsular sus responsabilidades en archivos separados con cambios mínimos en la base, entonces, cada vez que una nueva versión se distribuye, tiene un montón de trabajo de borrachos propensos a errores. tus manos. Así que piénsalo de esta manera: tu proyecto se basa en la fuente que no escribiste. Si hay alguna posibilidad de que desee incorporar cambios a ese código, debe aislarlo correctamente.
La regla de oro es que todo lo que se haga automáticamente debería ser repetible. La generación de código no es repetible si se requiere algún pensamiento para convertir lo que produce en lo que desea.
No, ¿por qué debería ser? Si puedo conseguir una herramienta para hacer el código molesto y aburrido para mí, ¡puedo hacer cosas más interesantes mientras tanto!
Bagazo
No. Code-gen no es ni bueno ni malo. Es simplemente una herramienta. Si lo usas bien, puede ahorrarte un tiempo inconmensurable. Por otro lado, si lo usa mal, puede terminar costándole la misma cantidad de tiempo inconmensurable.
Un pequeño chisme, si hago código-gen en un entorno oo, te sugiero que envuelvas las clases generadas si quieres extenderlas de las generadas.
Para obtener un excelente ejemplo de código generado que es muy extensible, consulte el kit de herramientas DSL que forma parte del SDK de Visual Studio. Uno lo usa para definir su propio lenguaje gráfico específico de dominio (que se genera), y gran parte del comportamiento se puede personalizar a través de clases parciales y anulaciones. Es una combinación muy poderosa.
Dos notas: .NET hace bastante generación de código detrás de la escena. Las expresiones regulares, las transformaciones XML y el código XML Serializer se generan sobre la marcha. Por supuesto, lo mismo se aplica a ASP.NET, y me sorprendería encontrar que no se usa más que esto (estoy pensando en XAML).
Además, quiero decir explícitamente que las clases generadas por el Diseñador de DataSet y por "Agregar referencia web" y "Agregar referencia de servicio" son todas clases parciales. Puede dejar los archivos generados completamente solo, y aún así extender las clases generadas. Consulte la parte inferior de Formas de personalizar su proxy ASMX para obtener un ejemplo de esto.
Si no está utilizando la generación de código en su desarrollo hasta cierto punto, entonces está haciendo más trabajo del que debería. La generación de código utilizada correctamente mejorará la calidad del código, hará que el proyecto sea más fácil de mantener y lo ayudará a entregar la solución más rápido con menos errores.
He escrito 3 generadores de código, pero actualmente uso Code Smith. A veces uso las plantillas de NETTiers. A veces uso la mía propia.
Realmente no me importa qué generador usas. CodeBreeze, CodeSmith, LLBLGen, archivos xslt, etc ...
Obtener uno, aprenderlo, amarlo.
CADA proyecto en el que he estado durante 10 años o más, incluye algún código generado.
Comience aquí: < http://www.dotnetrocks.com/default.aspx?showNum=63 >
< http://www.dotnetrocks.com/default.aspx?showNum=304 >
< http://www.dnrtv.com/default.aspx?showNum=77 >
< http://www.dnrtv.com/default.aspx?showNum=133 >
< http://www.nettiers.org/Home.ashx >
Tengo que correr Disfrutar.
Usar la generación de código para comenzar tu esfuerzo está bien en mi opinión. El problema surge cuando necesita modificar el código generado para manejar casos especiales, o cuando encuentra que su código generado no es lo que debería ser, entonces encontrar a la persona que trabaje en el código generado puede ser difícil dependiendo de su equipo. Trabajé en un proyecto recientemente donde el código fue generado por una persona, y él usó su propio método mágico para hacerlo ... Terminó convirtiéndose en un cuello de botella, así que al final detuvimos la generación del código y las cosas funcionaron bastante bien. .
Yo uso generadores de código todos los días. Ha reducido dramáticamente el tiempo que necesito para escribir la parte aburrida / tediosa de la aplicación.
Puedo recomendar altamente el uso de Ruby como herramienta de generación de código. Genero tanto código C ++ como C # de Ruby. La entrada al generador de código es un simple DSL interno.