.net - studio - ¿Usas herramientas de generación de código?
visual studio code execute c# (21)
¿Utiliza herramientas de generación de código (además de las utilizadas para generar proxies y las de los diseñadores integradas en Visual Studio)?
¿Qué parte (s) de su aplicación genera?
¿Usted típicamente hace rodar su propio generador? Si es así, ¿qué tipo de generador escribes (plantillas asp, codón, etc.)? Si no, ¿qué herramientas de terceros usa?
Actualmente estoy trabajando en algunos proyectos diferentes que usan un generador de código personalizado que maneja todo, desde la generación de la estructura de la base de datos, las entidades comerciales, DAL y BLL. Tengo curiosidad acerca de las experiencias de otras personas con este tipo de herramientas.
- Usamos generadores de código para excepciones
- Generando DAO para operaciones CRUD
- use JAXB para generar código
- Utilice XDoclet para generar interfaces locales / domésticas EJB
- Use plantillas Velocity para generar documentación para modelos comerciales
- Usa Apache Axis para generar stubs WSDL
Acabamos de empezar a usar Grails aquí en la oficina. Anteriormente, teníamos un conjunto de scripts de generación JSF / Hibernate CRUD internos.
... Grails gana. La generación de código de Grails es muy buena y puede proporcionarle una aplicación CRUD en aproximadamente 15 minutos, ¡sin tener que poner el código en los archivos de código!
Por supuesto, PUEDE generar el código real en los archivos de código, cuando quiera modificarlo. La mayoría de las veces, para CRUD regular, puede salirse con la suya simplemente cambiando las vistas.
Al igual que algunos otros aquí, también hemos creado nuestro propio generador de código (Inon Datamanager / Viewmanager) para el acceso a datos, el manejo de formularios HTML y ciertas operaciones de lógica de negocios. Una clave para tener este trabajo bien es diseñarlo para que nunca tenga que tocar o mirar el código generado.
De esta manera, casi se convierte en parte del lenguaje; el idioma (Java en nuestro caso) se amplía para incluir una especificación de modelo de dominio y un modelo de vista, y luego simplemente completa la lógica de negocios personalizada con código Java real.
Esto nos brinda las herramientas adecuadas para comunicarse con los analistas y los usuarios comerciales, y al mismo tiempo tener la capacidad de Java para configurar los detalles del comportamiento subyacente.
Conocí ActiveWriter hace un par de meses y me ayudó mucho, lo que me gusta es la flexibilidad de este enfoque, genera clases parciales que manejan los problemas de acceso a los datos y me permite codificar la parte comercial de las clases. Me siento muy satisfecho porque me ahorra mucho trabajo, es muy bueno cambiar el esquema, volver a generar y seguir.
Creo mis propias herramientas para algunas tareas. Es divertido de hacer e incluso ahorra tiempo a largo plazo. Para tareas muy aburridas, incluso salva su cordura.
Dado que el lenguaje interno de Fog Creek Software, Wasabi, tiene incorporados generadores de código de tiempo de compilación, los usamos para crear automáticamente la carne de nuestras clases de entidades que se asignan a las tablas de la base de datos. Entonces, en lugar de escribir una clase con una docena de propiedades y métodos diferentes, podemos simplemente escribir:
<ActiveRecord("Kiwi")> _
Class CKiwi
End Class
y CKiwi tendrá Load (ix As Int32), Commit () y campos / propiedades para cada columna definida en su esquema subyacente para la tabla Kiwi. Nos impide tener que tener enormes bibliotecas O / RM, pero aún así nos permite agregar rápidamente una tabla a nuestros productos.
Empecé a rodar mis propios generadores (acceso a datos, sprocs, etc.) cuando estaba haciendo el clásico trabajo asp (circa 2001). Poco a poco me mudé a CodeSmith, ya que era mucho más fácil tratar con él. Todavía estaba principalmente generando todo el material de tipo de capa de acceso a datos (incluidos sprocs) para mi código .NET.
Hace un par de años, pasé de Macro Code Generation (es decir, CodeSmith) a Micro Code Generation.
La diferencia es que con CodeSmith I estaba generando enormes franjas de código para mi aplicación, todas genéricas, y todas a la vez. Esto se volvió problemático para los casos extremos y se regeneraba al cambiar la fuente de la plantilla (es decir, la estructura de la tabla). También me encontré con casos en los que había un alto inventario de código de transporte que no estaba usando, pero que se generó a partir de mi plantilla. ¿Funcionaron todos esos métodos? Tal vez tal vez no. Entrar y limpiar el código generado habría sido una gran cantidad de trabajo (es decir, después de más de un año en la misma base de código).
Micro Code Generation, por el contrario, me permite generar exactamente las clases que necesito, exactamente en el escenario correcto que quiero. La herramienta principal que uso para hacer esto es ReSharper. La forma en que hago esto es escribiendo mis pruebas unitarias antes de escribir mi código de producción. En ese escenario, ReSharper usa mi prueba de unidad como plantilla para generar automáticamente el esqueleto para el código de producción. Entonces solo se trata de llenar los espacios en blanco.
Para el acceso a datos, ya no estoy generando nada. Descubrí que un buen O / RM reemplaza todo lo que solía poner en mi capa de acceso a datos (es decir, NHibernate). Dado eso, nunca escribiré o generaré otra capa de acceso a datos en mi vida (me niego).
Además, obtengo los beneficios de tener un conjunto de pruebas de unidades grandes, entre otras cosas
En un empleador anterior, teníamos una aplicación VB.NET de cosecha propia que convertiría un archivo de definición de esquema XML (XSD) en una biblioteca estática de C ++. Esto hizo que fuera mucho más fácil trabajar con tipos de datos C ++ (bool, std :: string, etc.), y todo el código XML interesante estaba oculto dentro de estas clases generadas.
Escribí una herramienta encantadora en la que los expertos en el formato de datos para el que había escrito un analizador, podían enviar sus propias muestras a través de un formulario web, mirar el resultado y decirme si era correcto.
A partir de eso, se generaría una prueba jUnit. Encantador.
Excepto que ni una sola persona se molestó en usarlo, y no reuní ningún caso de prueba.
Estoy en el campo filosófico que considera que los generadores de códigos son "incorrectos", porque indican algo que debería formar parte del lenguaje.
Pero ha sido una gran parte de la ética del programador pragmático escribir código que escribe código, y en la práctica la generación de código funciona bien si el código generado está oculto por defecto. No importa cuán filosóficamente puro quieras ser, el lenguaje nunca evolucionará tan rápido como los problemas que deseas resolver.
Se me viene a la mente el código que se genera cuando construyes un Windows Form en Visual Studio. Puede mirar el código generado si lo desea, pero es una mejor idea no hacerlo. Sin embargo, pasar a un lenguaje declarativo con WPF fue superior, ya que es más limpio y más confiable manipular el código declarativo mediante programación que el código imperativo.
Deberían haber hecho lo mismo con las clases LINQ-To-SQL. Necesitan un lenguaje declarativo para las clases que solo tienen propiedades y no tienen un comportamiento personalizado. Probablemente sea más fácil hacer que esas clases de entidad sean dinámicas, cambiando automáticamente cuando cambie el esquema de la base de datos subyacente.
Intentamos usar CodeSmith para generar clases .NetTiers para todas las tablas de nuestra base de datos, pero nos encontramos con dos problemas:
.NetTiers estaba hinchado y el código generado fue enorme. Creo que las herramientas de generación de código hacen que sea muy fácil para feep criatura.
Debido a que el esquema se estaba desarrollando y revisando activamente, tuvimos que regenerar mucho también, y eso terminó haciendo muy difícil mantener todo en control de fuente porque todos los archivos se estaban regenerando y reemplazando. Terminé sin estar seguro si el código generado debería estar en control de fuente.
El mejor lugar para la generación de código debe ser en el compilador o en la fase de compilación, no en la fase de diseño. Cuando utiliza un tipo o método anónimo en C #, el compilador genera código al vuelo. Si genera código durante la fase de diseño, obtendrá una gran cantidad de cosas que deben regenerarse cada vez que cambien los parámetros subyacentes.
He usado uno para generar objetos de datos serializables que podrían reformarse en diferentes plataformas (windows, linux, solaris, mac, bsd, etc.). Fue una solución interna.
La generación de código en el espíritu de los compiladores puede ser genial. La generación de código en el espíritu de "magos" ha resultado ser una mala idea.
Los generadores de código hechos en casa funcionan muy bien para crear casos de prueba unitaria a partir de hojas de cálculo de usuario final que contienen ejemplos de cómo debería funcionar.
Ver Herramientas para construir casos de prueba para un ejemplo.
No es que trabajemos en el dominio .net / web, pero las herramientas de generación de código caseras de varios lenguajes diseñados para el hogar son una parte crucial de nuestra cadena de herramientas de desarrollo. Tenemos dos de estas herramientas principales (con gramáticas y analizadores sintácticos y definiciones formales), y un host de menor construido en macros como m4 y perl. Todos ellos generan C simple al final, que se compila de forma nativa.
Los lenguajes específicos del dominio son una de las herramientas clave para la productividad del programador para cualquier esfuerzo de software a gran escala en mi experiencia. Si está compilando cosas como compiladores, simuladores u otro software muy complicado con muchos patrones recurrentes que no tienen soporte alguno en los lenguajes básicos (que normalmente significa C portátil y algunas veces C ++), las herramientas de generación de código es el camino a seguir. Veo los lenguajes específicos del dominio como el siguiente paso en la generalización: primero divide los cálculos comunes en funciones (o subrutinas para que sean históricos), luego divide las funciones comunes en plantillas o genéricos si tal recurso está disponible, y luego se rompe sacar aún más en común y repetir el código en un lenguaje personalizado en toda regla.
Se trata de reducir el volumen de código que realmente escribe y eliminar cualquier forma de repetición tediosa y código sin valor agregado del proceso de programación. Tan pronto como se repitan los patrones, ¡aplique un idioma específico de dominio!
Sí, pero nos referimos a ellos como internos.
Solíamos usar CodeSmith para generar nuestros NHibernate hbms, nuestras entidades y algunas otras cosas. Después de un tiempo nos cansamos de este flujo, así que lo abandonamos.
El generador T4 es gratuito y vale la pena buscarlo en la generación.
Todavía usamos Castle CodeGenerator para la generación de enlaces MonoRail.
Tenemos un generador de código interno que se encarga del acceso a la base de datos. Uno escribe procedimientos almacenados y obtiene los métodos correspondientes resumidos en una clase de puerta de enlace.
También generamos servicios web para interactuar adecuadamente con Flash, es decir, manejando la excepción de una manera sensata.
Finalmente tenemos un generador de excepciones que elimina el trabajo pesado de las mejores prácticas excepcionales (toneladas de constructores, etc.)
Usamos LLBLGen para producir nuestra capa de acceso a datos. Apuntas el generador a la base de datos que usas, seleccionas las tablas que quieres usar y genera las clases necesarias. Todo es muy rápido y fácil.
Escribí y uso una herramienta de generación de código basada en Xslt. http://perfectstorm.codeplex.com/
Esto usa un único modelo de raíz xml para generar dal, procs, tablas.
He creado un marco de generación de código personalizado que genera clases proxy para servicios web en varios lenguajes como Java Script, Action Script, Java, C # y Objective C, no uso plantillas o herramientas simplemente código C # que genera código con algunas clases de ayuda La generación de código realmente puede ahorrar mucho tiempo, pero creo que el código generado debe ser lo más simple posible y no debe usarse en exceso.
Si está interesado en LLBLGEN, que es excelente, también puede evaluar subsónico. Quizás incluso vea lo que Rob Conery tiene que decir sobre cualquier superposición o interacción entre subsónico y t4.