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);
4

4 に答える 4

6

私見では、特にC#3.0クラスの初期化子を使用して、流暢なインターフェイスでプロパティを設定することに大きなメリットはありません。メソッドと操作のチェーンを開始すると、流暢なインターフェイスがより興味深いものになります。

于 2009-12-30T10:43:41.440 に答える
2

それはそれがどのように使われるかに依存します。あなたの例では、流暢なインターフェースを使用することにあまり意味がありません。

一方、流暢なインターフェースは、ビルダーのようなもの、特に複数の流暢なビルダーを一緒にチェーンする場合(たとえば、自動車ビルダー/エンジンビルダー)に非常にうまく機能します。私はテストデータビルダーを非常に広範囲に使用してきましたが、それらは非常にうまく機能します。流暢なインターフェースがなくても同じことができますが、使い勝手は良くありません。

さらに、MartinFowlerがここで説明しているドメイン固有言語の角度があります。

唯一の問題は、人々が流暢なインターフェースに夢中になり、過度に冗長なAPIを作成することがあるということですが、私の意見では、流暢なインターフェースの問題ではなく、アプリケーション/実装の問題です。

于 2009-12-30T10:51:54.460 に答える
2

Fluent pattern (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)
于 2009-12-30T10:59:11.397 に答える
0

私の意見では、必ずしも大きな利点があるわけではなく、上記のような単純なクラス(いくつかのプロパティを持つクラス)もありません。これは、一部の開発者が一方で快適に使用できる別のセマンティクスです。一方、ASP.NETMVCのような特定の分野では非常に有利だと思います...私は流暢なインターフェイスを使用するTelerikMVCコントロールを使用しており、コントロールをセットアップするのは非常に便利です。MSの方法では、コレクションと匿名クラスを使用する必要があり、使用するのはそれほど便利ではありません。

HTH。

于 2009-12-30T10:44:59.847 に答える