2010-08-05 19 views
5

Programación de metadatos: la idea de que puede modificar clases/objetos en tiempo de ejecución, inyectando nuevos métodos y propiedades. Sé que es bueno para el desarrollo del marco; estado trabajando con Grails, y ese framework agrega un montón de métodos a tus clases en tiempo de ejecución. Tiene una propiedad de nombre en un objeto Usuario, y bamm, obtiene un método findByName inyectado en tiempo de ejecución.Meta Programación, ¿para qué sirve?

  1. ¿Mi descripción describió por completo el concepto?
  2. ¿Para qué más sirve (ejemplos específicos) aparte del desarrollo de marcos?
+2

¿Para qué sirve? Absolutamente nada. – Radu

+1

posible duplicado de http://en.wikipedia.org/wiki/War_(Edwin_Starr_song) – Tom

+0

Como han señalado algunas respuestas, su descripción no es correcta. Su descripción parece referirse a la reflexión y la programación orientada a aspectos (AOP). Estos dos amplían la capacidad del lenguaje en tiempo de ejecución. La metaprogramación amplía la capacidad del lenguaje en tiempo de compilación, y en particular la capacidad de operar en tipos (en un sistema de tipo).La reflexión, por otro lado, agrega la capacidad de operar en tipos en tiempo de ejecución. – rwong

Respuesta

3

Para mí, la meta-programación es "un programa que escribe programas".

Meta-programación es especialmente bueno para su reutilización, ya que apoya la generalización: puede definir una familia de los conceptos que pertenecen a un patrón particular . Luego, a través de la variabilidad puede aplicar ese concepto en escenarios similares, pero diferentes.

El ejemplo más simple es captadores y definidores de Java como se ha mencionado por @Sjoerd:

Tanto getter y setter seguir un patrón bien definido : Un getter devuelve un miembro de la clase, y un setter define el valor de un miembro de la clase . Por lo general, crea lo que se llama una plantilla para permitir la aplicación y la reutilización de ese patrón en particular. El funcionamiento de una plantilla depende del enfoque de metaprogramación/generación de código que se utilice.

Si desea que un captador o colocador se comporte de una manera ligeramente diferente, puede agregar algunos parámetros a su plantilla. Esta es variabilidad. Por ejemplo, si desea agregar un código de procesamiento adicional al obtener/configurar, puede agregar un bloque de código como parámetro de variabilidad. Mezclar código personalizado y código generado puede ser complicado. ABSE es actualmente el único enfoque MDSD que sé que admite de forma nativa código personalizado directamente como un parámetro de plantilla.

1

La metaprogramación no solo agrega métodos en el tiempo de ejecución, sino que también puede crear códigos automáticamente en tiempo de compilación. Es decir. código de generación de código.

  • servicios Web (es decir, los métodos se definen en el WSDL, y que desea utilizarlos como si fueran métodos reales sobre un objeto)
  • Evitar código repetitivo. Por ejemplo, en Java debe usar getters y setters, pero estos pueden crearse automáticamente para la mayoría de las propiedades.
+0

pensé que la metaprogramación era específicamente algo de tiempo de ejecución. Interesante. Buen punto sobre el código de la placa de la caldera (Grails lo hace también). ¿Algo más? – hvgotcodes

+0

@hvgotcodes: la metaprogramación se trata principalmente de tiempo de compilación; los usos del tiempo de ejecución son bastante raros en comparación con los usos en tiempo de ejecución. Ver f.e. Plantillas C++ (que es una especie de metaprogramación, aunque a mucha gente no le gusta admitirlo): todos los programas que usan STL ... hay muchos de ellos. – liori

0

La programación Meta no solo se usa para agregar cosas a su código base. También se puede usar para describir el código actual con el que está tratando, sin acoplar sus bases de código. Puede ser bastante útil en aplicaciones de "relaciones de muchos a muchos", como el mediator pattern.