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:
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.