Interfaz fluida

Interfaz fluida

En ingeniería de software, una interfaz fluida (término acuñado por primera vez por Eric Evans y Martin Fowler) es una construcción orientada a objeto que define un comportamiento capaz de retransmitir el contexto de la instrucción de una llamada subsecuente. Generalmente, el contexto es

  • definido a través del valor de retorno de un método llamado
  • autoreferencial, donde el nuevo contexto es equivalente al contexto anterior
  • terminado por medio del retorno de un contexto vacío (void context).

Este estilo es beneficioso debido a su capacidad de proporcionar una sensación más fluida al código, aunque algunos ingenieros encuentran el estilo difícil de leer. Una segunda crítica es que generalmente, las necesidades de programación son demasiado dinámicas para confiar en la definición estática de contacto ofrecida por una interfaz fluida.

Ejemplos

El siguiente ejemplo muestra una clase implementando una interfaz no fluida, y otra implementando una contraparte fluida, junto con las diferencias en el uso. El ejemplo se escribe en C #:

 namespace Example.FluentInterfaces
 {
    using System;
    public interface IConfiguration
    {
        void SetColor(string color);
        void SetHeight(int height);
        void SetLength(int length);
        void SetDepth(int depth);
    }
 
    public interface IConfigurationFluent
    {
        IConfigurationFluent SetColor(string color);
        IConfigurationFluent SetHeight(int height);
        IConfigurationFluent SetLength(int length);
        IConfigurationFluent SetDepth(int depth);
    }
 
    public class Configuration : IConfiguration
    {
        string color;
        int height;
        int length;
        int width;
        void SetColor(string color)
        {
           this.color = color;
        }
        void SetHeight(int height)
        {
           this.height = height;
        }
        void SetLength(int length)
        {
           this.length = length;
        }
        void SetDepth(int depth)
        {
           this.depth = depth;
        }
    }
 
    public class ConfigurationFluent : IConfigurationFluent
    {
        string color;
        int height;
        int length;
        int width;
        IConfigurationFluent SetColor(string color)
        {
           this.color = color;
           return this;
        }
        IConfigurationFluent SetHeight(int height)
        {
           this.height = height;
           return this;
        }
        IConfigurationFluent SetLength(int length)
        {
           this.length = length;
           return this;
        }
        IConfigurationFluent SetDepth(int depth)
        {
           this.depth = depth;
           return this;
        }
    }
 
    public class ExampleProgram
    {
        [STAThread]
        public static void Main(string[] args)
        {
            //Ejemplo estándar
            IConfiguration config = new Configuration();
            config.SetColor("blue");
            config.SetHeight(1);
            config.SetLength(2);
            config.SetDepth(3);
            //Ejemplo fluido
            IConfigurationFluent config = 
                  new ConfigurationFluent().SetColor("blue")
                                           .SetHeight(1)
                                           .SetLength(2)
                                           .SetDepth(3);
        }
    }
 }

El siguiente es un ejemplo en C++ de cómo proveer una envoltura de una interfaz fluida arriba de una interfaz más tradicional:

 // definición básica
 class GlutApp {
 private:
     int w_, h_, x_, y_, argc_, display_mode_;
     char **argv_;
     char *title_;
 public:
     GlutApp(int argc, char** argv) {
         argc_ = argc;
         argv_ = argv;
     }
     void setDisplayMode(int mode) {
         display_mode_ = mode;
     }
     void getDisplayMode() {
         return display_mode_;
     }
     void setWindowSize(int w, int h) {
         w_ = w;
         h_ = h;
     }
     void setWindowPosition(int x, int y) {
         x_ = x;
         y_ = y;
     }
     void setTitle(const char *title) {
         title_ = title;
     }
     void create();
 };
 // uso básico
 int main(int argc, char **argv) {
     GlutApp app(argc, argv);
     app.setDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_ALPHA|GLUT_DEPTH); // Ajusta los parámetros del framebuffer
     app.setWindowSize(500, 500); // Ajusta los parámetros de la ventana
     app.setWindowPosition(200, 200);
     app.setTitle("My OpenGL/GLUT App");
     app.create();
 }
 
 // Envoltorio fluido
 class FluentGlutApp : private GlutApp {
 public:
     FluentGlutApp(int argc, char **argv) : GlutApp(argc, argv) {} // hereda el constructor del pariente
     FluentGlutApp &withDoubleBuffer() {
         setDisplayMode(getDisplayMode() | GLUT_DOUBLE);
         return *this;
     }
     FluentGlutApp &withRGBA() {
         setDisplayMode(getDisplayMode() | GLUT_RGBA);
         return *this;
     }
     FluentGlutApp &withAlpha() {
         setDisplayMode(getDisplayMode() | GLUT_ALPHA);
         return *this;
     }
     FluentGlutApp &withDepth() {
         setDisplayMode(getDisplayMode() | GLUT_DEPTH);
         return *this;
     }
     FluentGlutApp &across(int w, int h) {
         setWindowSize(int w, int h) {
         return *this;
     }
     FluentGlutApp &at(int x, int y) {
         setWindowPosition(x, y);
         return *this;
     }
     FluentGlutApp &named(const char *title) {
         setTitle(title);
         return *this;
     }
     // no tiene sentido encadenar después de create(), así que se retorna *this
     void create() {
         GlutApp::create();
     }
 };
 // uso básico
 int main(int argc, char **argv) {
     FluentGlutApp app(argc, argv)
         .withDouble().withRGBA().withAlpha().withDepth()
         .at(200, 200).across(500, 500)
         .named("My OpenGL/GLUT App");
     app.create();
 }

Enlaces externos


Wikimedia foundation. 2010.

Игры ⚽ Поможем решить контрольную работу

Mira otros diccionarios:

  • iOS (sistema operativo) — iOS Parte de la familia Mac OS X Desarrollador Apple Inc …   Wikipedia Español

  • OGNL — Archivo:OGNL logo.png Desarrollador OGNL Technology http://www.opensymphony.com/ognl Información general Úl …   Wikipedia Español

  • Windows Mobile — Saltar a navegación, búsqueda Windows Phone Desarrollador Microsoft Windows Phone Información general …   Wikipedia Español

  • Microsoft Windows — En este artículo sobre informática se detectaron los siguientes problemas: No tiene una redacción neutral. Necesita ser wikificado conforme a las convenciones de estilo de Wikipedia. Por favor …   Wikipedia Español

  • Windows Phone — Parte de la familia Windows CE Desarrollador Microsoft Windows Phone Información general …   Wikipedia Español

  • 98Lite — es una utilidad para Windows 98 y Windows Me escrita por Shane Brooks. La cual remueve los componentes de Internet Explorer de Windows junto con otros componentes del sistema operativo que requieren que IE esté presente. 98lite fue uno de los… …   Wikipedia Español

  • Historia de Internet — La historia de Internet se remonta al temprano desarrollo de las redes de comunicación. La idea de una red de computadoras diseñada para permitir la comunicación general entre usuarios de varias computadoras sea tanto desarrollos tecnológicos… …   Wikipedia Español

  • LG Arena KM 900 — El terminal Arena KM900 es un teléfono móvil multimedia de LG Electronics puesto a la venta en marzo de 2009. Fue desvelado el 9 de febrero de 2009 y presentado en el MWC09 (Congreso Mundial del Móvil, en sus siglas en inglés) el día 16 del mismo …   Wikipedia Español

  • Dashboard (software) — Saltar a navegación, búsqueda El DashBoard es una Interfaz gráfica de usuario que yace tanto en consolas de videojuegos como en algunos sistemas operativos. Es una interfaz donde el usuario puede administrar el equipo y/o software. A continuación …   Wikipedia Español

  • Amstrad PCW — Saltar a navegación, búsqueda Amstrad PCW 8512 La gama Amstrad PCW (Personal Computer Word processor) de ordenadores fue creada por la compañía británica Amstrad, que la lanzó en 1985 …   Wikipedia Español

Compartir el artículo y extractos

Link directo
Do a right-click on the link above
and select “Copy Link”