为什么要使用流畅接口?

4

与传统属性相比,使用它的最大优势是什么?

我知道实例名称的重复已经消失了,但这就是全部吗?

public class PropClass
{
  public Object1 object1 { get; set; }
  public Object2 object2 { get; set; }
}

PropClass propClass = new PropClass();
propClass.object1 = o1;
propClass.object2 = o2;

public class FluentClass
{
    public Object1 object1 { get; private set; }
    public Object2 object2 { get; private set; }

    public FluentClass SetObject1(Object1 o1)
    {
        object1 = o1;
        return this;
    }

    public FluentClass SetObject2(Object1 o2)
    {
        object1 = o2;
        return this;
    }
}

FluentClass fluentClass = new FluentClass().SetObject1(o1).SetObject1(o2);

当处理“规范模式”时,“流畅接口”非常有用。它将n个规范链接为一个,如如何动态组合条件?中所示。 - LCJ
4个回答

6

在我看来,使用流畅接口设置属性并没有太大的优势,特别是在使用C#3.0类初始化程序时。当您开始链接方法和操作时,流畅接口变得更加有趣。


2
不一定用于设置属性,但可以用于链式操作,例如乘以5,加上3,除以7等等... - Aviad P.
当处理“规范模式”时,“流畅接口”非常有用。它将n个规范链接为一个,如如何动态组合条件?中所示。 - LCJ

2

如果你想减少代码重复并减少每个类之间的依赖关系,流畅模式(建造者)将是最好的选择。对于C#3.5+,你可以通过创建方法扩展(如LINQ或以下代码)来创建流畅模式。

public BaseControl
{
    public void RenderControl(HTMLWriter writer) {}
}

public TextBox : BaseControl
{
    public string Text { get;set; }
}

public static T TabIndex<T>(this T control, int index) where T : BaseControl {}

在你拥有了上面的代码之后,你可以使用 TabIndex 来设置你想要的选项卡控件的索引,就像这样。
BaseControl control1 = new BaseControl();
control1.TabIndex(1);

// Moreover, you can use this for any devired controls like this
TextBox control2 = new TextBox()
{
    Text = "test"
};

// The following method still return TextBox control.
control2.TabIndex(2);

如你所见,你可以减少BaseControl类中不必要的代码。但你可以像我展示的那样随时插入它。这个概念适用于很多紧密耦合的类。

顺便说一下,我喜欢这种设计模式,因为它使我的代码易于阅读,就像以下代码一样。

var pmLogOnName = Html.CreatePopUpMenu("pmLogOnName")
                      .AddMenuItem("mLogOnName-RememberMe", "Remember UserName", isCheckBox: true, isSelected: true);

Html.CreateTextBox("txtLogOnName", 1)
    .BindData(Model, x => x.LogOnName, "showError")
    .WaterMark(LogOnView.LogOnName)
    .BindMenu(pmLogOnName)

听起来你想要一个VB.Net的With块。 - MarkJ

2
这取决于它的使用方式。在你的例子中,使用流畅接口没有太多意义。
另一方面,流畅接口在构建器等方面非常有效,特别是当您将多个流畅构建器链接在一起时(例如汽车构建器/引擎构建器)。我已经广泛使用测试数据构建器,它们非常有效。您可以不使用流畅接口做同样的事情,但使用起来不那么方便。
此外,Martin Fowler在这里解释了领域特定语言的角度。
唯一的问题是人们有时会过度使用流畅接口并创建过于冗长的API,但在我看来,这不是流畅接口的问题,而是应用程序/实现问题。

0

在我看来,像您上面所述的简单类(具有少量属性的类)并没有什么特别大的优势。这是一种不同的语义,有些开发人员可能会感到舒适。另一方面,在某些领域,比如ASP.NET MVC,我认为它非常有优势......我使用Telerik MVC控件,它使用流畅的接口进行设置非常好用;而MS的方式需要使用集合和匿名类,使用起来不太方便。

希望对你有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接