miércoles, 20 de mayo de 2009

¿Cómo hacemos una interface fluyente o fluent interface?

Cómo crear una fluent interface? o métodos que fluyen

Este pequeño post viene a colación sobre una pregunta acerca de un estilo interesante de diseño de fremwork las Fluent interface, están por todos lados jQuery, Moq, Rhino Mocks, por nombrar herramientas que nombré en este blog

Qué es una Fluent Interface, o interface fluyente?

Sencillo, es cuando podemos hacer llamadas a un metodo e ir encadenando llamadas sucesivas, por ejemplo en jQuery

$("div").draggable().resizable()

Es decir, llamamos a un método y el mismo nos permite hacer llamadas sucesivas a otros métodos. Interesante, pero cómo se hace? bien vamos directamente al código autodescriptivo

class Program
{
    static void Main(string[] args)
    {
        var fluent = new Fluent();

        //Lamamos a la clase "fluyente" repetidamente para ir agregando mensajes
        //por defector Console.WriteLine llama al método ToString que sobre-escrimos
        Console.WriteLine(
            fluent.AddMessage("hola ").AddMessage(" mundo").AddMessage("que tal?"));

        Console.ReadLine();
    }
}

/// <summary>
/// Esta clase tiene algunos método "fluet" o sea, "flueyente", todo el truco
/// está en que dicos métodos devuelvan una referencia el mismo objeto
/// o sea this
/// </summary>
public class Fluent
{
    StringBuilder _messageList = new StringBuilder();

    /// <summary>
    /// Los métdos "fluyentes" devuelven un objeto del mismo tipo
    /// que la clase que los contiene, en definitiva, devuelven
    /// el mismo objeto con this
    /// </summary>
    /// <returns>El mismo objeto que contiene el método</returns>
    public Fluent AddMessage(string message)
    {
        _messageList.AppendLine(message);
        return this;        
    }

    /// <summary>
    /// Sobre-escribimos el ToString para ver el resultado
    /// </summary>
    /// <returns></returns>
    public override string ToString()
    {
        return _messageList.ToString();
    }
}

Lo ejecutamos y mágia! Hasta la próxima

4 comentarios:

gerardocontijoch dijo...

Hace un tiempo escribí un post sobre el tema con algunos ejemplos de la utilidad de aplicar este tipo de diseño. Se los dejo por si les interesa...

http://gerardocontijoch.wordpress.com/2008/12/03/creacin-de-interfaces-fluidas/

Leonardo Micheloni dijo...

Gracias Gerardo, muy bueno tu blog.

Jose Selesan dijo...

Me parece a mí o ultimamente se puso de moda esto de las interfases fluyentes?. Se lo ve por todos lados, aunque no me molesta para nada, al contrario, en muchas ocaciones es muy útil y cómodo para escribir.

Leonardo Micheloni dijo...

Gracias por tu comentario José, y sí, últimamtente están por todos lados, aunque no hay que abusar, fiajte Rhino, querés armar una exéctation medio compleja y es bastante críptico el código.