开发Fluent风格API及其优势

时间:2012-12-05 08:28:06

标签: c# fluent

我看到很多Fluent风格api开发的例子,但有一段时间我看到人们实现流畅的界面,有些时候人们不使用任何界面只是使用直接课程。我认为人们使用流畅的风格api只是因为使用链....意味着容易访问。所以我想知道流利的api或实习生的任何其他好处。

这里是小代码。

public class Coffee
{
    private bool _cream;

    public Coffee Make { get new Coffee(); }

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

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

var myMorningCoffee = Coffee.Make.WithCream().WithOuncesToServe(16);

1 个答案:

答案 0 :(得分:1)

在您的示例中,我认为语法(即“易用性”)是唯一的优势。但是,例如LINQ方法的工作方式不同 - 方法不返回this,它们返回一个新实例。这显然是一个性能损失,但它使类成为不可变的,这在你推理代码时非常有用,它可以促进与这些类的并行计算。

编辑(示例): 在这种情况下,你的Coffee看起来像这样(虽然它可能不是一个很好的例子,因为无论如何我在这里使用流畅的语法并没有多大意义,更不用说新实例了)

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

    // I really don't like this kind of instantiation,
    // but I kept it there and made static to make it work.
    public static Coffee Make { get new Coffee(); }

    public Coffee WithCream()
    {
        return new Coffee
        {
            _cream = true,
            _ounces = this._ounces
        }
    }

    public Coffee WithOuncesToServe(int ounces)
    {
        return new Coffee
        {
            _cream = this._cream,
            _ounces = ounces
        };
    }

但是当然在这种简单类的情况下,使用带参数的构造函数总是更好,例如

public Coffee(int ounces, bool cream)

作为一个相反的例子,我记得一组方便的Dictionary扩展,用于流畅地添加项目,但不创建新实例。类似的东西:

public static IDictionary<K, V> AddConditionally(
    this IDictionary<K, V> source,
    K key, V value)
{
    // Real-life implementation would contain more checks etc.
    if(!source.ContainsKey(key))
        source.Add(key, value);

    return source;
}

您可以使用某些初始数据填充字典,例如

var dict = new Dictionary<int, int>()
    .AddConditionally(0,1)
    .AddConditionally(1,1)
    .AddConditionally(2,1)
    .AddConditionally(3,1);