2009-12-30 34 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