Consejos para escribir interfaces fluidas en C # 3


Busco algunos buenos consejos para interfaces fluidas en C#. Estoy aprendiendo acerca de mí mismo, pero con ganas de escuchar lo que otros piensan fuera de los artículos que estoy leyendo. En particular, estoy después de:

  1. ¿cuándo es demasiado fluido?
  2. ¿hay algún patrón fluido?
  3. qué hay en C# que hace que las interfaces fluentes sean más fluidas (por ejemplo, métodos de extensión)
  4. ¿una interfaz compleja sigue siendo fluida?
  5. refactorización para llegar a una interfaz fluida o refactorización una interfaz fluida existente
  6. ¿algún buen ejemplo por ahí que hayas trabajado o que puedas recomendar?

Si pudieras publicar un consejo o pensamiento, o lo que sea por publicación. También quiero ver cómo se votan.

Gracias de antemano.

Author: dreftymac, 2008-10-22

8 answers

En su 4to punto;

Sí Creo que una interfaz fluida compleja todavía puede ser fluida.

Creo que las interfaces fluidas son algo así como un compromiso. (aunque una buena!) Ha habido mucha investigación sobre el uso del lenguaje natural para la programación y generalmente el lenguaje natural no es lo suficientemente preciso para expresar programas.

Las interfaces fluidas se construyen para que escriban como un lenguaje de programación, solo un pequeño subconjunto de lo que se puede expresar en un lenguaje natural está permitido, pero leen como un lenguaje natural.

Si nos fijamos en rhino se burla, por ejemplo, la parte de escritura ha sido complicada en comparación con una biblioteca normal. Me llevó más tiempo aprender principalmente debido a la interfaz fluida, pero hace que el código sea mucho más fácil de leer. Debido a que los programas generalmente se escriben una vez y se leen mucho más de una vez, esto es una buena compensación.

Así que para calificar mi punto un poco. Una interfaz fluida que es compleja de escribir pero fácil de leer puede seguir siendo fluida.

 18
Author: Mendelt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-22 07:51:18

El mayor desafío que he experimentado como consumidor de interfaces fluidas es que la mayoría de ellas no son realmente intefaces fluidas instead en cambio, son realmente instancias de lo que tiendo a llamar 'interfaces legibles'.

Una interfaz fluida implica que su objetivo principal es hacer que sea fácil de HABLAR, mientras que una interfaz legible implica que su objetivo principal es ser fácil de LEER. Las interfaces más fluidas solo tienden a ser ridículamente difíciles de codificar, pero a la inversa increíblemente fácil de leer más tarde por otros.

Assert().That().This(actual).Is().Equal().To(expected).
    Except().If(x => x.GreaterThan(10));

Is es mucho más fácil de leer más tarde de lo que es realmente componer en código!

 27
Author: sbohlen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-02-16 17:55:13

Te toparás con un ladrillo cuando uses herencia junto con interfaces fluidas porque el uso de métodos polimórficos rompe tus cadenas de llamadas y definitivamente no quieres hacer que tus interfaces no sean fluidas usando ugly casting y parantesis donde no son necesarias. He escrito un artículo sobre un patrón que le proporciona una solución utilizando constructores genéricos y métodos de extensión genéricos con genéricos limitación: http://liviutrifoi.wordpress.com/2009/02/16/fluent-interfaces-constraints-at-compile-time/

 11
Author: Csaba Toth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-08 22:25:55

Moq oculta métodos no leated como equals, ToString y así sucesivamente para hacer su interfaz fluida aún más fácil de usar.

Ocultar Objeto del sistema es un artículo que explica el beneficio de hacer esto.

 8
Author: Finglas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-04 08:42:10

Y sobre su segunda y tercera pregunta;

Tres patrones fluidos que he notado

La primera usa la instrucción using (C # 2.0) para ejecutar código en un contexto determinado, por ejemplo:

using(var transaction = new Transaction())
{
  // ..
  // ..
}

Esto usa el constructor y el eliminador de Transaction para configurar una transacción y luego ejecuta el código en este contexto.

El segundo hace casi lo mismo, pero con lambda, esto se usa mucho en Rhino Mock, por ejemplo.

(new Transaction()).Run( () => mycode(); );

La interfaz fluida más conocida es utilizar devuelve tipos a llamadas a métodos de cadena. La mayoría de los métodos devuelven esto para que pueda encadenar llamadas en el mismo objeto. Pero también puede devolver diferentes objetos para cambiar el contexto dependiendo del método llamado. Si tiene un objeto que solo puede ejecutarse en una transacción (lo siento, no se le ocurre un ejemplo diferente), puede darle un método StartTransaction que devuelve una transacción inicializada donde puede ejecutar call run y stoptransaction, en pseudocódigo:

class Runner
{
  Transaction StartTransaction()
  {
    return new Transaction(this);
  }
}

class Transaction
{
  Transaction Run()
  Transaction StopTransaction()
}

Dónde se ve la llamada como

var runner = new Runner();
runner
  .StartTransaction()
  .Run()
  .StopTransaction();

Por supuesto, debe agregar todo tipo de manejo de errores, etc.

 7
Author: Mendelt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-22 07:57:24

Yo también estoy aprendiendo a escribir una interfaz fluida para una pequeña aplicación en el trabajo. He preguntado e investigado un poco y encontré que un buen enfoque para escribir una interfaz fluida es usar el "patrón de constructor", lea más sobre él aquí.

En esencia, así es como empecé la mía:

public class Coffee
{
    private bool _cream;
    private int _ounces;

    public Coffee Make { get new Coffee(); }

    public Coffee WithCream()
    {
        _cream = true;
        return this;
    }

    public Coffee WithOuncesToServe(int ounces)
    {
        _ounces = ounces;
        return this;
    }
}

Aquí hay un mensaje cruzado a una pregunta similar Que tengo para implementar un cierre en una interfaz fluida.

 7
Author: sam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-23 10:18:42

Una cosa es que tiene que tener en cuenta la morfología de la sintaxis inglesa y asegurarse de que no ha introducido el acoplamiento secuencial indocumentado debajo.

// Snarky employees get a raise.
employees.WhereSnarky().GiveRaise();

Vs.

// Depending on implementation, everyone may get a raise.
employees.GiveRaise().WhereSnarky();
 4
Author: An00bus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-20 14:51:59

Hace algún tiempo tuve las mismas dudas que tú tienes ahora. He hecho algunas investigaciones y ahora estoy escribiendo algunas publicaciones para ayudar en esos temas.

Compruébalo en mi blog:

Directrices para el diseño fluido de la interfaz en C # parte 1

Y en los siguientes posts cubriré cada uno de los puntos que mencionaste.

Saludos cordiales André Vianna

 2
Author: Andre Vianna,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-24 22:43:00