Programación automática: escriba el código que escribe el código [cerrado]

104

Después de leer el libro El Programador Pragmático , uno de los argumentos que encontré más interesantes fue "escribir código que escribe código ".

Intenté buscar en la red más explicaciones o artículos al respecto, y aunque encontré algunos buenos artículos sobre el tema, todavía no he encontrado ninguna implementación de código específica ni buenos ejemplos.

Siento que todavía no es un argumento tan común, algo que carece de documentación o que no lo ha aceptado tanta gente, y me gustaría saber más sobre él.

¿Qué opinas sobre el tema? ¿Es algo que realmente aumentará tu productividad? ¿Cuáles son algunos buenos recursos sobre el tema, entre libros, blogs, presentaciones de diapositivas, etc.?

Algunos ejemplos de código serían muy apreciados para que me permita comprender mejor su implementación.

Aquí está la página wiki sobre el tema con varias técnicas de programación relevantes, como la Programación Meta, la Programación Generativa y la Generación de Código.

    
pregunta Jose Faeti 13.01.2012 - 03:42
fuente

22 respuestas

47

En el mundo Lisp, es bastante común ver el código que escribe el código que escribe el código (y así sucesivamente). Por lo tanto, cualquier proyecto Lisp o Esquema de tamaño decente servirá como un buen ejemplo de código. Recomiendo consultar el compilador y el tiempo de ejecución de Racket , así como Bigloo , sus bibliotecas son simplemente brillantes.

En cuanto a la productividad: estoy usando la metaprogramación como una técnica dominante en casi todo mi trabajo de desarrollo, y claramente ayuda mucho, ya que reduce el tamaño del código y aumenta su legibilidad. La clave está en utilizar Idiomas específicos del dominio , y la metaprogramación es una de las formas más eficientes de implementarlos.

    
respondido por el SK-logic 26.08.2011 - 11:39
fuente
67

Prefiero ir un poco más lejos y, en lugar de escribir código que escribe , escribir código que genere objetos, métodos, funciones. Esto se puede lograr con macros de Lisp o capacidades de modificación dinámica de programas de Ruby, por ejemplo.

La pequeña diferencia es que no terminas con los archivos de origen que se generaron automáticamente. Por lo general, estos archivos no son legibles y no pueden modificarse, así que, ¿por qué molestarse con ellos? No me gusta la idea de aumentar mi base de código con algo que no puedo controlar.

Un libro que disfruté leyendo sobre el tema fue Metaprogramming Ruby (si conoce el idioma de Ruby)

Editar después de la siguiente pregunta en el comentario:

  

¿Por qué debería ser útil si todavía tengo que codificar el código de generación? ¿Debo escribir un código capaz de generar cosas diferentes según la entrada del usuario, para poder reutilizarlo una y otra vez?

Primero, la metaprogramación no es un objetivo, sino una herramienta. No use metaprogramación porque "es genial" o "X dijo que todos los desarrolladores deberían usarlo".

Creo que una buena razón para usar la metaprogramación es generalizar algún patrón común (patrón como algo que se repite) que ha encontrado en su código y que ninguna otra técnica de programación habitual (herencia, patrones de diseño, etc.) puede lograr.

Como dicho por Jordan , Un caso de uso típico es el manejo de bases de datos y ORM (Mapeo de relación de objetos). Una vez más, en Ruby, deberías ver ActiveRecord que es un gran ejemplo de metaprogramación aplicada a ORM.

Como nota final:

No piense "Quiero aplicar metaprogramación, ¿dónde podría aplicarlo en mi código?".

Piensa "Veo este patrón que se repite en todo mi código, no puedo encontrar una manera de refactorizar el código en algo más pequeño y más reutilizable. Tal vez metaprogramación me puede ayudar? "

    
respondido por el David 12.04.2017 - 09:31
fuente
19

Aún mejor, use el código que alguien más escribió y que escriba su código por usted.

La automatización de código es generalmente buena para ORM y otro código de interacción de base de datos, y por supuesto para la creación de código repetitivo pero similar.

Por supuesto, si está construyendo muchas clases de aspecto similar, quizás podría haber logrado lo mismo en un lenguaje dinámico mucho antes, pero estoy divagando.

Muchas personas lo adoptan, aunque a menudo encontrará el software etiquetado como generador de código.

Vea compañías y productos como CodeSmith y MyGeneration, o eche un vistazo a este artículo de Wikipedia: enlace

    
respondido por el Jordan 26.08.2011 - 09:52
fuente
16

Uno de los ejemplos clásicos es lex y yacc. Su principal objetivo es evitar la pesadez de escribir cualquier tipo de analizador. A lo largo del camino, hacen que sea mucho más rápido construir analizadores complejos con muchas reglas y estados, y también evitan todos los errores sorpresa cometidos por personas que hacen rodar las suyas.

Esta es también la idea detrás de c, que es una herramienta para escribir ensamblador. Lo mismo ocurre con cualquier lenguaje de alto nivel que quieras nombrar. Para las herramientas que escriben código para usted, hay algunos paradigmas simples.

Un IDE adecuado ayuda al proporcionar documentación al alcance de su mano, la finalización automática inteligente y los fragmentos de código. Los IDE también incluyen varias plantillas, por lo que no tiene que iniciar un programa desde cero. Hay programas para tomar un diagrama uml y clases en un lenguaje de alto nivel.

Finalmente, puede escribir sus propias herramientas para la generación de código dentro de su conjunto de problemas. Así es como se iniciaron Lex y Yacc por primera vez. Cualquier tipo de lenguaje específico del dominio existe precisamente por esta razón. Usted crea algunos bloques de construcción que describen su solución en un código más fácil de entender, envolviendo actividades comunes o secciones complicadas con comandos simples. No está buscando una solución para cada problema, solo una definición más sencilla del problema específico con el que está tratando.

En cierto sentido, todo lo que haces sobre la capa binaria es la automatización de código.

    
respondido por el Spencer Rathbun 26.08.2011 - 14:50
fuente
13

Metaprogramming

La metaprogramación es una técnica controvertida en muchas tiendas. La razón es que, como cualquier herramienta poderosa, la magnitud de la ayuda o el daño es grande.

Pros

  • Más expresivo, menos código para escribir y mantener (a menudo en un orden de magnitud o más)
  • Consistencia, comportamiento más consistente en la clase de problemas que resuelve con el código
  • Productividad, menos código para una solución a un espacio de problemas más grande

Cons

  • La complejidad, puede ser muy complicada aunque haya menos código
  • Se sacrificarán la seguridad, a veces se sacrificarán la seguridad de tipo y el análisis estático en general
  • Los errores afectan más, los errores pequeños tendrán un impacto mayor

Soy un gran fanático de la metaprogramación, pero lo he estado haciendo durante mucho tiempo. Para mí, el compromiso de reducir el tamaño del código y el comportamiento consistente más que compensar los riesgos. Menos código significa menos errores, menos código que mantener, y generalmente puedo agregar grandes piezas de funcionalidad muy rápidamente.

Sin embargo, esto no significa que todos los programadores deberían participar en él. He visto y tuve que solucionar grandes problemas creados por la metaprogramación. Por lo general, a partir de cuando las personas que no entienden el concepto y han intentado ampliar la funcionalidad, o simplemente corregir un error. Se necesita una mentalidad particular que esté orientada, al menos, a los detalles. La pregunta para usar técnicas de metaprogramación debe ser una decisión del equipo . Si tiene miembros del equipo que no entienden, no tienen el temperamento para hacerlo, o simplemente están en contra, ningún miembro del equipo debería usar la metaprogramación.

    
respondido por el dietbuddha 06.09.2011 - 07:04
fuente
9

La mayoría del código escribe código. Por ejemplo, el código php ayuda a escribir html. La librería php pdo ayuda a escribir llamadas SQL. Las funciones de E / S del archivo escriben código para comunicarse con el sistema operativo. Incluso una llamada de función regular es una referencia a otro bloque de código que se ejecuta. Así que tus funciones de llamadas están escribiendo código.

En términos generales, podemos pensar en la computación como códigos de escritura que escriben códigos recursivamente formando una pila que termina cuando se enfrenta a la realidad física de los códigos conectados al hardware.

    
respondido por el Ben Haley 26.08.2011 - 19:26
fuente
5

La forma en que lo haces varía según tus requisitos. Suponiendo que está utilizando la generación de código estático, puede escribir toda la infraestructura usted mismo, o podría usar un generador existente como CodeSmith o MyGeneration. Usando estos solo necesitas escribir las plantillas requeridas.

Mi último proyecto relacionado con esto fueron algunas pantallas básicas de ASP.NET CRUD (la generación de código es buena para esto). El proceso fue definir entidades como metadatos en archivos xml. Escriba plantillas para cubrir los diversos artefactos requeridos (clases de entidad, repositorios, clases de servicio, controles asp.net, páginas asp.net, etc.). Ejecute el proceso de generación y diseñe el resultado.

Hay algo de sobrecarga en la escritura de las plantillas, pero se pueden reutilizar para proyectos similares posteriores. Los cambios similares a los datos subyacentes se manejan cambiando los metadatos y volviendo a ejecutar la generación haciendo que los cambios sean más sencillos y rápidos de implementar.

En cuanto a las pruebas. Dado que este es un sistema con plantilla, deberá dedicar algún tiempo a validar inicialmente la salida del proceso. Si la plantilla es incorrecta, toda la salida de esa plantilla será igualmente incorrecta. Una vez que esté satisfecho con esto, también puede usar los generadores de código para crear pruebas básicas a partir de los metadatos xml que luego puede ampliar para cubrir casos especiales. Sin embargo, recuerde que es posible que aún tenga que realizar pruebas de código para atender cosas específicas, la generación de código reduce su trabajo, no lo elimina por completo.

    
respondido por el CdMnky 26.08.2011 - 11:36
fuente
5

En nuestra empresa utilizamos algunas herramientas que generan clases de C ++ o C # con datos descargados de Internet. Estas clases son contenedores de datos y contienen una gran cantidad de objetos en listas.

    
respondido por el Holli 26.08.2011 - 16:48
fuente
5

La metaprogramación ha sido parte de la programación durante mucho tiempo. Considere no solo las herramientas como SWIG o WYSIWYG, que crean código, sino también las herramientas en el lenguaje como el preprocesador de C, o incluso las plantillas de C ++ y los genéricos de C # / Java, por no mencionar Reflexión.

De hecho, se podría argumentar que cada compilador es solo otro metaprograma: toman el texto del programa y la máquina de salida o el código de la máquina virtual. ¿Y la vida sin compiladores? Owch.

    
respondido por el DeadMG 28.08.2011 - 12:10
fuente
5

Aquí hay un ejemplo concreto de mi pasado.

Estaba trabajando en un sitio que tenía alrededor de 50 MB de código fuente de Delphi usando el BDE para el acceso a datos. Querían pasar a usar Direct Oracle Access para permitir una actualización de Oracle más allá de la versión más alta compatible con el BDE (8i si recuerdo bien).

Entonces, en lugar de hacer que un equipo de programadores trabaje en cada formulario y módulo de datos cambiando cada componente manualmente, escribí un script PERL que: -

  1. Analizó el DFM (archivo de formulario) e identificó todos los TQuery, TTable, TStoredProcedure & Objetos de la base de datos: almacenamiento de los elementos en una lista.

  2. Analizó el PAS (código) e identificó el uso de los objetos. ¿Las TQueries estaban haciendo actualizaciones o seleccionaron? Además, identificó cualquier objeto creado en el código en lugar de colocarlo en un formulario en el IDE.

  3. Reescribió el DFM & PAS cambia los tipos de objetos de manera adecuada (por ejemplo, TTable - > TOracleDataSet con la propiedad SQL establecida en "seleccionar * de", etc.) y el método llama. Además, se agregaron llamadas de método adicionales, si corresponde, para cerrar, abrir & establecer parámetros.

En pocas palabras, 3 semanas de trabajo ajustando el script para trabajar en diferentes aplicaciones escritas por diferentes equipos con diferentes estilos de codificación en lugar de la estimación original de 5+ desarrolladores trabajando durante 6 meses.

Y la razón por la que incluso pensé en utilizar ese enfoque fue a través de la lectura de El Programador Pragmático

    
respondido por el mcottle 06.09.2011 - 07:33
fuente
4

Pides ejemplos ....

Al trabajar con SQL, no debería cambiar la base de datos directamente, sino que se supone que está ejecutando scripts que realizan los cambios que desee, incluidos los cambios estructurales en la base de datos (agregando tablas, columnas, claves principales, restricciones y así sucesivamente). Con bastante frecuencia, deberá realizar la misma acción contra muchas tablas o columnas al mismo tiempo, y hacerlas una por una sería tedioso, un script corto que genera un script más grande que hace lo que usted quiere puede ser una verdadera ahorrador de tiempo.

Por ejemplo, antes de que se introdujera el tipo de datos DATE en el servidor MS SQl, la única opción para una columna de fecha era DATETIME, que tiene una parte de tiempo, una parte de tiempo que dificulta un poco más el manejo de los datos. Al actualizar a una versión con el tipo de datos Fecha, es posible que desee actualizar las columnas en las que la hora siempre es 00:00. En una base de datos con docenas o incluso cientos de columnas de DateTime, esto llevaría bastante tiempo. Pero es fácil escribir una secuencia de comandos que consulta todas las tablas, verificando cada columna con un tipo de datos de DATETIME para ver si la hora es alguna vez menos 00:00 y si no crear una declaración ALTER para que la tabla / columna cambie el tipo de datos a la fecha. Presto, código que escribe código.

    
respondido por el jmoreno 10.08.2012 - 20:32
fuente
3

Echa un vistazo a las macros CL (Labios comunes). En mi opinión, eso es exactamente lo que quieres. Los labios son perfectos en metaprogramación.

También sugiero Nemerle si quieres tener poderes de .NET con un soporte perfecto de Metaprogramming (incluyendo macros)

Pero si desea un verdadero motor de generación de código, eche un vistazo a Apache thrift

    
respondido por el Cynede 29.08.2011 - 10:27
fuente
3

Estoy trabajando en una herramienta de este tipo. En nuestro caso particular, generamos el código VB.NET basado en la capa de datos en las firmas de las funciones en la base de datos.

Comenzar a trabajar en y con la generación de código es difícil al principio ya que no tienes idea de cómo se debe generar el código, pero una vez que tienes un conjunto establecido de reglas, y el código que debe Se puede generar siempre de acuerdo con esas reglas, trabajar con ese código no es tan difícil. Por supuesto, dependiendo de la complejidad de la generación de código y del número de reglas, la tarea puede ser más difícil. Pero en esencia, la generación de códigos automáticos se usa para tareas de codificación repetitivas y no para códigos avanzados que varían mucho.

Pruebas la salida es doble. Primero tienes que asegurarte de que el código se compile, y eso es fácil. Luego, debe asegurarse de que la salida haga lo que usted quiso que hiciera en función de los parámetros en los que se generó ... y la dificultad varía según la complejidad del código que genere.

Mi recomendación sincera es que si sientes que escribes código de manera repetitiva , y puedas permitirte el tiempo. Trata de pensar si lo que estás haciendo no se puede hacer. código. Y si es así (si es un código repetitivo, casi siempre es el caso) piensa cuántas veces tendrás que extender, modifica ligeramente ese código y también cuántas veces tienes que escribir ese tipo exacto de código. Si la respuesta a cualquiera de estas preguntas es "muchas", entonces debería considerar seriamente crear un generador para ese código .

Espero que ayude,
IPP

    
respondido por el Ioan Paul Pirau 29.08.2011 - 12:27
fuente
3

Tengo un módulo PHP que genera una página web que contiene código JavaScript que genera HTML. Eso es tres capas allí mismo. Chico fue tan difícil de leer!

En una clase de programación, tuvimos que escribir un programa que tomaría una cadena de fórmula del usuario y analizarla y mostrar el valor. El solucionador más impresionante simplemente tomó la entrada del usuario, la envolvió en main () {printf ("% d", ...);} y ejecutó un script para compilarlo, vincularlo y ejecutarlo. ¡No escribió un analizador! Hoy puedes hacer eso en una declaración SQL SELECT.

Es una herramienta con la que debes jugar, luego guardarla para algún día en el futuro cuando sea útil.

    
respondido por el Andy Canfield 06.09.2011 - 11:07
fuente
3

He desarrollado soluciones de meta-programación con Prolog . Donde la aplicación principal (en C ++, por ejemplo) traduce una definición abstracta de un problema en una aplicación Prolog en tiempo de ejecución, que luego se delega. A menudo, escribir funcionalidades equivalentes en C ++ llevaría una eternidad.

Creo que este escenario es un caso excelente a favor del código de escritura de código

    
respondido por el 2 revsuser16410 06.09.2011 - 14:35
fuente
3

¿Qué piensas sobre el tema?

La metaprogramación es más comúnmente asociada con lenguajes no dinámicos, ya que es más difícil lograr ciertos comportamientos (como implementar un ORM) sin muchas líneas de código no productivas y no inteligentes.

Pero incluso en lenguajes más dinámicos como PHP, la generación de código puede salvar la vida y aumentar la productividad en gran cantidad. En los marcos modernos, es muy común tener andamios que generan la mayor parte del modelo, la forma, la prueba y las acciones comunes para un determinado objeto comercial que declara. Es una de las razones por las que los marcos como Symfony o RoR tienen tanto éxito, esas herramientas de generación de código hacen que el código sea muy rápido y aumenten la productividad de los programadores.

En los sitios web, la mayor parte de la interacción gira en torno a cuatro acciones principales:

  • Crear un elemento
  • Recupere un conjunto de elementos (con posible filtrado)
  • Actualizar un elemento con nuevos atributos
  • Eliminar un conjunto de elementos

Al menos, todo lo que gira en torno a estas 4 acciones principales se podría lograr, y EN IMHO, DEBE CONVERTIRSE utilizando herramientas de generación de códigos para lograr la máxima productividad.

En mi empresa, usamos Symfony, y su administrador-generador es una herramienta excepcional, que incluso genera código en tiempo de ejecución (y lo almacena en caché), lo que significa que ni siquiera necesitamos utilizar ningún tipo de tarea o Herramienta externa para generar nuevo código, solo necesitamos limpiar nuestra caché. YO SÓLO aconsejo utilizar este tipo de herramienta para las operaciones de CRUD.

Pero, hacer lo que hicieron los impresionantes contribuidores de Symfony, no es una tarea fácil. Yo mismo he implementado algunas tareas de generación de código y no es fácil hacer algo que sea realmente consistente y con una implementación amplia para cubrir la mayoría de los casos de esquina.

¿Es algo que realmente aumentará tu productividad?

Creo que la metaprogramación es muy importante en los niveles inferiores de trabajo (marcos, almacenamiento en caché, compiladores, etc.) pero es algo que debemos abordar con extrema precaución si estamos haciendo cosas en la capa empresarial.

El uso de la generación de código es, sin lugar a dudas, un importante impulsor de la productividad. Implemente sus propias herramientas de generación de código, no tanto a menos que usted mismo esté creando un marco.

¿Cuáles son algunos buenos recursos sobre el tema, entre libros, blogs, presentaciones de diapositivas, etc.?

El mejor recurso para comprender la programación es siempre un código fuente bueno y bien comentado. Yo diría que mirando RubyOnRails y Symfony generadores de administración es una buena idea.

    
respondido por el luisfaceira 12.05.2012 - 13:13
fuente
3

Si bien muchas respuestas aquí se refieren a lo que comúnmente se conoce como meta programación, en realidad hubo un campo asociado a AI conocido como programación automática que trataba sobre los programas que comprenden o sintetizando programas [1].

Cualquier compilador (o meta-programa, generador de código, traductor, sistema macro, ...) trabaja con transformaciones, generando una salida desde una entrada al llevar a cabo su algoritmo fijo de transformación. Pero un compilador o meta-programa tradicional no lo hace, dada una definición, descripción o ejemplo de lo que es clasificar una lista (por ejemplo, [5, 3, 9] = > [3,5,9]), crea un algoritmo de clasificación . Dichos problemas son de interés para este campo de "programación automática".

[1] - Informe de progreso sobre sistemas de comprensión de programas ftp://db.stanford.edu/pub/ cstr / reports / cs /.../ CS-TR-74-444.pdfShare

    
respondido por el Thiago Silva 18.02.2013 - 04:35
fuente
2

La programación meta puede ser muy difícil de mantener. Al principio parece elegante, pero cuando empiezas a encontrarte en los casos de esquina, los errores se detectan tarde (en el código que se ha generado), y todo se convierte en una pesadilla para usar / depurar.

Principalmente escribí el código de Python, y en mi experiencia, la programación meta siempre es una mala elección con este lenguaje. Siempre puede refactorizar cosas para hacerlo con aburridas funciones de lenguaje normal. El resultado es menos original, pero más fácil de vivir.

    
respondido por el Simon 28.08.2011 - 12:50
fuente
2

OP pide recursos.

Es posible que nuestro Kit de herramientas de reingeniería de software DMS sea interesante. Es una herramienta de metaprogramación pura, diseñada para permitir que se creen herramientas personalizadas de análisis y transformación de programas.

[Para seguir un comentario a la pregunta de OP, cuando se usa para construir una herramienta de transformación específica, DMS es una línea de producto que escribe código, que escribe código:]

DMS logra esto al ser agnóstico (pero no independiente) de los lenguajes de programación de destino. DMS proporciona los servicios estándar necesarios para una amplia variedad de tareas de metaprogramación, así como un sistema operativo que proporciona una amplia variedad de servicios para tareas de programación estándar. Estos servicios incluyen análisis sólidos, construcción automática de árboles de sintaxis abstracta, coincidencia de patrones y reescritura en árboles, bibliotecas de tablas de símbolos que administran fácilmente idiomas con reglas de alcance desagradables como herencia múltiple, flujo de control, flujo de datos, punto a y llamada Análisis gráfico. Nada de esto es significativo en la ausencia de lenguajes específicos para procesar, por lo que DMS acepta definiciones de lenguaje que están vinculadas a estas piezas generales de maquinaria, produciendo análisis específicos del idioma, construcción AST, coincidencia / reescritura de patrones específicos del idioma objetivo utilizando el objetivo sintaxis del lenguaje, analizadores específicos del lenguaje objetivo, etc.

Y como un sistema operativo, DMS está diseñado para tener muy pocas opiniones o restricciones sobre qué (meta) programas desea escribir, lo que significa que se puede usar para una amplia variedad de propósitos: extraer métricas, encontrar códigos muertos, implementar aspectos Tejedores, traduciendo idiomas, generando códigos desde DSLs, rearchitecting grandes aplicaciones. (DMS ya se ha utilizado para todas estas tareas).

Uno necesita definiciones de lenguaje sólidas si no desea dedicar su tiempo a codificar todo en el manual de referencia del lenguaje (piense en lo que esto significa para Java y C ++). DMS resuelve este problema al tener una biblioteca de definiciones completas de idiomas disponibles. El análogo aquí es algo así como tener una base de datos disponible para su sistema operativo; no tiene que implementar uno de ellos para escribir su aplicación centrada en la base de datos.

    
respondido por el Ira Baxter 05.12.2011 - 03:13
fuente
2

Consulte el conjunto de problemas 4 de Philip Greenspun en el curso 6.916 del MIT: Ingeniería de software de servicios web innovadores ( enlace ).

Su objetivo dice: "Enseñar a los estudiantes las virtudes de los metadatos. Más específicamente, aprenden a representar formalmente los requisitos de un servicio web y luego crean un programa de computadora para generar los programas de computadora que implementan ese servicio".

Este es uno de los conjuntos de problemas que los reclutas potenciales de ArsDigita ( enlace ) debieron resolver durante la primera burbuja.

El libro de "SQL for Web Nerds" que hizo referencia a Philip en el pset ( enlace ).

    
respondido por el espeed 12.05.2012 - 11:44
fuente
2

En o alrededor de 2001 comencé a trabajar en un proyecto que estaba haciendo un uso extensivo de objetos de negocios y objetos de datos. Iba a construir el sitio web de front-end, pero estaba colgado entrelazando mis pulgares porque la capa empresarial y la capa de acceso a datos no estaban completamente desarrolladas. Después de un par de semanas de eso, comencé a analizar detenidamente qué estaban haciendo esas capas. Básicamente, estaban exponiendo los datos devueltos de los procedimientos almacenados como colecciones de objetos con propiedades correspondientes a los campos en los datos, o tomaban los parámetros de entrada y los enviaban a los procedimientos almacenados para guardarlos en las tablas de la base de datos. Hubo una gran cantidad de serialización / deserialización entre las dos capas, hubo Microsoft Transaction Server involucrado, una biblioteca de tipo IDL / ODL ... pero todo encaja en un patrón.

2 semanas después, hice funcionar un generador de código que eliminaría IDL / ODL, y también eliminaría el negocio y los objetos de datos. Le había tomado al sujeto que construía los objetos de negocio y de capa de datos 2 años para llegar al punto de depurar y probar estos objetos. En 2 semanas, con la generación de código, obtuvimos el mismo resultado, pero como se generó todo estaba bastante bien libre de errores.

Ese generador de código (herramienta CASE de nivel inferior) me siguió a través de muchas iteraciones diferentes, durante unos 8 a 10 años, porque el principio era muy simple: estás haciendo algo que hay que hacer al hablar con bases de datos , es una codificación bastante repetitiva, y una vez que lo haces bien, ya no tienes que preocuparte más.

Entonces, sí: use un generador de código, especialmente cuando la codificación es repetitiva y se ajusta a un patrón bien definido.

He conocido a personas que usan macros RegX para hacer cosas similares, o que usan fórmulas de Excel para hacer cosas similares (yo también hago esto).

    
respondido por el David T. Macknet 12.05.2012 - 21:58
fuente
2

Un ejemplo de metaprogramación

Tengo una biblioteca de autorizaciones de Ruby llamada Authority . Permite a los desarrolladores hacer preguntas en su aplicación con métodos como current_user.can_read?(@post) y @post.readable_by?(current_user) . Estas preguntas son respondidas por clases autorizadas centralizadas.

Esta es la parte crucial: La autoridad no sabe qué métodos definir hasta que vea la configuración del usuario . La configuración del usuario puede contener:

config.abilities =  {
  ...
  :read      => 'readable',
  :microwave => 'microwavable',  # user-defined
  ...
}

En ese caso, debe haber un método como current_user.can_microwave?(@post) .

La metaprogramación hace esto posible: después de leer la configuración, sé que :

Authority.verbs.each do |verb|
  class_eval <<-RUBY, __FILE__, __LINE__ + 1 # allows for a nice bracktrace
    def can_#{verb}?(resource)
      resource.#{Authority.abilities[verb]}_by?(self)
    end
  RUBY
end
    
respondido por el Nathan Long 12.05.2012 - 22:02
fuente