2009-12-30 86 views
3

与传统属性相比,使用它的最大好处是什么?为什么使用Fluent界面?

我知道实例名称的重复消失了,但是这些都是?

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); 
+0

'Fluent Interfaces'在处理'Specification Pattern'时很有用。它将n个规范链接为[如何动态组合条件]中给出的规范(http://stackoverflow.com/questions/21406492/how-to-combine-conditions-dynamically) – Lijo 2014-01-29 09:56:25

回答

6

恕我直言,流畅的界面设置属性没有什么大的好处,尤其是使用C#3.0类初始值设定项。当你开始链接方法和操作时,流畅的界面变得更有趣。

+2

不用于设置属性也许,但对于链接操作,例如,乘以5,加3,除以7等... – 2009-12-30 10:44:43

+0

@Aviad,同意你的看法。 – 2009-12-30 10:45:53

+0

'Fluent Interfaces'在处理'Specification Pattern'时非常有用。它将n个规范链接为[如何动态组合条件](http:// stackoverflow。com/questions/21406492/how-to-combine-conditions-dynamic) – Lijo 2014-01-29 09:57:00

0

在我看来,并不一定有很大的优势,或者像你这样的简单课程(具有一些属性的课程)。这与一些开发人员一方面感到舒适的语义不同。另一方面,我认为它在ASP.NET MVC等特定领域是非常有利的......我使用Telerik MVC控件,它使用流畅的界面,并且非常好地设置控件; MS方式需要使用集合和匿名类,并且使用起来不太方便。

HTH。

2

这取决于它的使用方式。在你的例子中,使用流畅的界面没有多少意义。另一方面,流畅的界面非常适合建筑工人的工作,特别是当你将多个流利的建造者连接在一起(例如汽车制造商/发动机制造商)时。我已经非常广泛地使用了Test Data Builders,他们的工作非常好。您可以在没有流畅界面的情况下做同样的事情,但使用起来不太好。

此外,还有Martin Fowler explains here的域特定语言角度。

唯一的问题是人们有时会用流畅的界面去疯狂地创建过于冗长的API,但我认为这不是流畅的界面问题和更多的应用程序/实现问题。

2

当您想要减少代码重复并减少每个类之间的依赖关系时,流利模式(Builder)将会是最有利的。对于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) 
+0

听起来像你想要一个VB.Net'With'块。 – MarkJ 2009-12-30 13:24:02