30-12-2008 Luis Artola
Lo ví el otro día en la blogosfera americana, y hoy lo leo en la hispana. Como sabemos, Zend Framework adopta un estilo de programación que fomenta que se escriba código como:
$objeto = new Clase(); $objeto->metodo1()->metodo2();
A eso ahora le llaman “Method Chaining” o “Métodos encadenados”. Pero, para la gente que siga un poco la evolución de la orientación a objetos, lleva mucho tiempo siendo Fluent Interfaces (o Interfaces fluidas), y forman parte de la técnica para construir DSL´s – Domain Specific Languages, y son una evolución de las API´s u otra forma de escribirlas. Las Fluent Interfaces forman parte de las buenas costumbres para escribir código orientado a objetos moderno.
No me importaría tanto que se les llamara “Métodos encadenados” si no fuera porque llevamos mucho tiempo intentando introducir los términos DSL y Fluent Interfaces…
1. Enrique Place | diciembre 30th, 2008 at 2:03 pm
La primera vez que lo vi fue leyendo código de Zend Framework, pero no tenía claro el término “Fluent Interfaces”, hasta que luego lo asocié con un artículo de Martín Fowler.
Es interesante la idea, pero como todo, no hay que abusar de ella, ya que no se puede pensar en desarrollar todos los métodos como “interfaces fluidas”, tampoco aporta claridad hacer cadenas extensas de llamadas de métodos, uno detrás de otro.
Claramente está lejos de ser una “bala de plata”.
2. Luis Artola | diciembre 30th, 2008 at 4:20 pm
Hola Enrique,
efectivamente ésta forma de escribir código no es una revolución, sino una mera evolución. Ayuda además a hacer el código más legible y reduce la curva de aprendizaje de un API al tener un lenguaje más natural…
3. Rubén Moraleda | enero 13th, 2009 at 3:07 am
¿Cuantos casos habeis tenido en los que necesiteis anidar varios métodos de un objeto (que no sean setters)?. Yo ahora mismo que recuerde, muy pocos.
Personalmente, yo no le veo ninguna utilidad a los fluent interfaces salvo para los setters y para casos muy muy concretos, para lo demás, intento evitarlos en la medida de lo posible. Creo que es lo mejor.
4. Luis Artola | enero 13th, 2009 at 12:40 pm
Hola Rubén,
yo creo que os equivocáis a la hora de valorar el uso de Fluent Interfaces. No se trata de “necesitar anidar varios métodos”. Primero que no se anidan, se encadenan. y segundo que no es una cuestión de “necesidad”. Se trata de facilidad leer el código generado.
Y la clave está en cuando eres tú el que crea la API (o DSL, como se le quiera llamar) no cuando eres el consumidor de esa API.
El caso de los setters es un caso clave. Pero también podrías crear tú una API que necesitara algo tipo:
$factoria->crear(‘cliente’)->devolviendo(‘XML’).
Se trata de una forma de escribir código que se acerca más al lenguaje natural y, por lo tanto, es más fácil de mantener y menos necesario documentar…
En el caso de jquery (que veo en tu blog que lo usas), se usan constantemente para ejemplos como:
$(”)
.html(“Blah, blah, blah”)
.addClass(“foobar”)
.appendTo(“body”);
Es cómodo y más semántico. Pero repito que no es la panacea, ni la revolución, ni un cambio de paradigma… sólo una mera evolución en la manera de escribir API´s…
Un saludo!
5. Luis Artola | enero 13th, 2009 at 12:41 pm
vaya, en el ejemplo que te acabo de poner de jquery, wordpress se acaba de trabajar en html del primoer $(”) que era de párrafo… así el ejemplo tiene menos sentido… :-S
6. Rubén Moraleda | enero 13th, 2009 at 2:57 pm
Hola Luís:
Gracias por la corrección, fué un lapsus pasajero
.
Quiero aclarar que yo si uso ampliamente los fluent interfaces, pero por regla general intento evitarlos en la medida de lo posible y no abusar de ellos porque puede llevarnos a determinados errores.
Por ejemplo, viendo tu código y sin conocer la aplicación:
$factoria->crear(’cliente’)->devolviendo(’XML’)
Yo no sé si el método ‘devolviendo’ es de un nuevo objeto que se crea en el método ‘crear’ de factoria, o si ‘devolviendo’ es un método de factoria. ¿Entiendes a que me refiero?. Por eso comento que salvo para setters, procuro no abusar de ellos.
En cambio, si ésto fuese:
$cliente=$factoria->crear(’cliente’);
$xml=$cliente->xml();
Yo personalmente lo entenderia mejor.
En cuanto a lo que comentas de jquery, no te preocupes, he entendido perfectamente el ejemplo porque estoy acostumbrado a usarlo, pero ten en cuenta que muchos metodos de jquery son justo eso, setters.
Saludos.
7. Luis Artola | enero 13th, 2009 at 5:01 pm
tamos de acuerdo, entonces…
8. karina Jimenez | marzo 23rd, 2009 at 5:34 pm
Hola Luis , lei tu presentacion y me he dado cuenta que tienes una amplia experiencia me parece muy interesante poder aprender de todo lo que sabes, en realidad ahora te escribo por que necesito realizar un articulo sobre la aplicacion del framework hibernate para la persistencia de los datos en un proyecto en el cual trabajo y que se refiere al uso de las TICS en los actores del sistema general de seguridad social en salud, de antemano te agradeceria cualquier informacion que me puedas sumistrar para el desarrollo de mi articulo. gracias
9. Luis Artola | marzo 24th, 2009 at 10:18 am
Hola Karina,
el que más sabe aquí de Java es indudablemente Raul. Si quieres ve a su página y escríbele un correillo a ver qué te comenta.
Sé que ahora anda ocupado pero quizá pueda ayudarte…
Un saludo!