Muchas veces programamos varios elementos, ya sean clases, funciones, paquetes,... uno a uno, y aunque tengan muchas cosas en común, a lo más que recurrimos es al copy-paste. Siendo un poco más puristas, llegamos a recurrir a una buena organización de jerarquía de herencia e interfaces que nos permite no repetir mucho código.
Pero, ¿que pasa con esas cosas que no se pueden heredar pero que son muy similares? por ejemplo uno tiene 50 clases, cada una con sus variables de instancia, y para cada una implementa las funciones de acceso (get set), claramente ese comportamiento no puede reaprovecharse de una variable a otra y mucho menpos de una clase a otra, por tanto la idea es la misma, pero tenemos que implementarla 300 veces, ahí no nos queda otra que ir al copy-paste y echarle unas cuantas horas. Otra cosa similar es por ejemplo rellenar un objeto con cosas que están en BD, eso de forma muy sencilla puede ser ejecutar una select o un procedimiento que devuelva una tupla, y variable a variable, asignar el valor correspondiente. A lo largo de las 50 clases necesitamos los mismos métodos de lectura, escritura, actualización y borrado, y es otra cosa que no puede reaprovecharse más allá del copy-paste, repitiendo de nuevo 50 veces lo mismo pero cambiando algunas cosas.
Esto tiene solución, yo lo llamo metaprogramación (no sé si ya tiene otro nombre el concepto que explico, pero yo lo llamaré así). Esto consiste en no implementar cada clase o cada método, sino programar más abstracto, haciendo una especie de plantillas que cambiando la definición de la clase nos genere la propia clase, lós métodos de acceso, los métodos de accedo a datos (select, deletes,...), incluso formularios para interaccionar con el usuario.
Metaprogramar es más complejo que programar, ya que estás escribiendo en un lenguaje, algo que generará código dependiendo de la definición de una clase y además posiblemente en otro lenguaje.
Por ilustar esto con un ejemplo, estoy metaprogramando una aplicación. Parto de la definición de tablas en BD, por lo que ahí tengo la información de las clases que debe haber, como se relacionan entre sí, que variables utiliza cada clase y el tipo de cada una.
En base a eso he metaprogramado en script de base de datos (PL/SQL o como queráis verlo), lo necesario para a partir de esa definición de tablas, generar clases que representen esas tablas, con sus métodos para acceder a las variables, navegación entre los objetos teniendo en cuenta las claves externas, métodos de acceso a datos, con el que cada objeto puede crearse en BD, eliminarse, actualizarse o leerse. Se crean controles de usuario para dar una interfaz de cada objeto y formularios que controlen la lista de objetos de un tipo dado. Estos formularios también tienen en cuenta las claves externas para montar combobox si hay que seleccionar una clave externa,... y muchas otras características que resuleven gran número de problemás y dan gran potencia al código generado.
Si todo esto se contruye con una buena arquitectura software, puede mezclarse la parte de generación de código automática gracias a la metaprogramación, con la programación directa para implementar los aspectos que no sean generales a todos los objetos o formularios.
Haciendo esto, y viendo lo que genera mi metaprogramación, estimo que en este proyecto en el que se manejan unas 30 clases, generaré 50.000 líneas de código a partir de 2.000 líneas de metaprograma, con la ventaja añadida de que en cualquier momento puedo añadir una pequeña funcionalidad y ésta se verá en todos los objetos y a todos los niveles, y por otra parte con la convicción de que si un objeto funciona, todos los demás también lo harán, ya que se generan de la misma forma.
Es bueno ser un buen programador, pero es mucho mejor programar de forma inteligente
José Carlos Calvo Tudela
Pero, ¿que pasa con esas cosas que no se pueden heredar pero que son muy similares? por ejemplo uno tiene 50 clases, cada una con sus variables de instancia, y para cada una implementa las funciones de acceso (get set), claramente ese comportamiento no puede reaprovecharse de una variable a otra y mucho menpos de una clase a otra, por tanto la idea es la misma, pero tenemos que implementarla 300 veces, ahí no nos queda otra que ir al copy-paste y echarle unas cuantas horas. Otra cosa similar es por ejemplo rellenar un objeto con cosas que están en BD, eso de forma muy sencilla puede ser ejecutar una select o un procedimiento que devuelva una tupla, y variable a variable, asignar el valor correspondiente. A lo largo de las 50 clases necesitamos los mismos métodos de lectura, escritura, actualización y borrado, y es otra cosa que no puede reaprovecharse más allá del copy-paste, repitiendo de nuevo 50 veces lo mismo pero cambiando algunas cosas.
Esto tiene solución, yo lo llamo metaprogramación (no sé si ya tiene otro nombre el concepto que explico, pero yo lo llamaré así). Esto consiste en no implementar cada clase o cada método, sino programar más abstracto, haciendo una especie de plantillas que cambiando la definición de la clase nos genere la propia clase, lós métodos de acceso, los métodos de accedo a datos (select, deletes,...), incluso formularios para interaccionar con el usuario.
Metaprogramar es más complejo que programar, ya que estás escribiendo en un lenguaje, algo que generará código dependiendo de la definición de una clase y además posiblemente en otro lenguaje.
Por ilustar esto con un ejemplo, estoy metaprogramando una aplicación. Parto de la definición de tablas en BD, por lo que ahí tengo la información de las clases que debe haber, como se relacionan entre sí, que variables utiliza cada clase y el tipo de cada una.
En base a eso he metaprogramado en script de base de datos (PL/SQL o como queráis verlo), lo necesario para a partir de esa definición de tablas, generar clases que representen esas tablas, con sus métodos para acceder a las variables, navegación entre los objetos teniendo en cuenta las claves externas, métodos de acceso a datos, con el que cada objeto puede crearse en BD, eliminarse, actualizarse o leerse. Se crean controles de usuario para dar una interfaz de cada objeto y formularios que controlen la lista de objetos de un tipo dado. Estos formularios también tienen en cuenta las claves externas para montar combobox si hay que seleccionar una clave externa,... y muchas otras características que resuleven gran número de problemás y dan gran potencia al código generado.
Si todo esto se contruye con una buena arquitectura software, puede mezclarse la parte de generación de código automática gracias a la metaprogramación, con la programación directa para implementar los aspectos que no sean generales a todos los objetos o formularios.
Haciendo esto, y viendo lo que genera mi metaprogramación, estimo que en este proyecto en el que se manejan unas 30 clases, generaré 50.000 líneas de código a partir de 2.000 líneas de metaprograma, con la ventaja añadida de que en cualquier momento puedo añadir una pequeña funcionalidad y ésta se verá en todos los objetos y a todos los niveles, y por otra parte con la convicción de que si un objeto funciona, todos los demás también lo harán, ya que se generan de la misma forma.
Es bueno ser un buen programador, pero es mucho mejor programar de forma inteligente
José Carlos Calvo Tudela
Me parece que no deberías confundir tus métodos de programación con conceptos mas complejos. Metaprogramación se refiere a los programas que crean programas o modifican su propio código en tiempo de ejecución. Es un concepto. Lo que nos presentas aquí a mi me suena un poco mas a programación paramétrica o a lo mejor objetos paramétricos o algo asi. de todas formas en hora buena por tus ideas. saludos
ResponderEliminar