viernes, 25 de junio de 2010

La insoportable levedad del método ausente

Una de las cosas que más me gusta hacer cuando programo en lenguajes interpretados es el hecho de generar métodos nuevos al vuelo; en concreto y gracias al missing_method de Ruby o al AUTOLOAD de Perl, es posible construir de forma dinámica los métodos que necesitamos a medida en que los invocamos sin tener que preocuparnos de su implementación explícita.

Un ejemplo ilustrativo podría basarse en una interfaz con una BBDD SQL, dónde a partir de un convenio de nomenclatura de métodos ... tabla_campo_where_campo(condiciones) obtenemos y ejecutamos la consulta deseada.

De ese modo, a medida en que vamos ejecutando consultas se van generando los nuevos métodos de forma automática, tras una primera llamada, el método deja de ser missing_method y pasa a formar parte de la instancia de la interfaz. El código de la interfaz a continuación:



La gracia reside en el hecho de  que si utilizamos el método ausente missing_method atrápalo todo de Ruby ... de este modo:




Obtenemos al siguiente respuesta:




Es decir, en la primera llamada parsea el nombre del método invocado inexistente user_passwords_where_id ... a continuación empieza a construir la consulta SQL, finaliza generando el método que falta ... precisamente el invocado haciendo eval method_d pues method_d ya contiene toda la magia negra del truco por muy feo que parezca y a partir de ahí deja de ser un missing_method como se puede comprobar en la siguiente llamada ... :)

Dedicado a Paul Graham del que no entendí nada de lo que decía cuando leía sus libros.

5 comentarios:

  1. Yo no entiendo nada de lo que dices tú, pero bueno.

    ResponderEliminar
  2. Pensad sobre eso del unless ( 1 != 0 ) ... es precioso xD !

    ResponderEliminar
  3. Es una clausura creo de esas ...

    ResponderEliminar
  4. Nost, me pasaba lo mismo que a ti con P. Graham ... hasta que dejas de leer y te pones a pensar en desvaríos xD

    ResponderEliminar
  5. ¿ Y si en lugar de confiar en missing_method ... atacas la estructura de tablas de la BBDD y generas de forma dinámica todos los métodos asociados ?

    http://blog.jayfields.com/2008/02/ruby-dynamically-define-method.html

    ResponderEliminar