0

ASP.NET コントロールをインスタンス化するために、この Fluent API に取り組んできました ( http://tinyurl.com/m4hzjb )。私はいくつかのフィードバックと意見を探しています...良い、悪い、または無関心。これは役に立ちますか?予想される技術的な問題はありますか? 改善の余地?

標準の TextBox コントロールを作成するための非常に基本的な使用例を次に示します。2 つのプロパティ/メソッドのみが実装されていますが、API を簡単に拡張して、コントロールの完全なプロパティ機能セットをサポートできます。

利用方法

Factory.TextBox()
        .ID("TextBox1")
        .Text("testing")
        .RenderTo(this.form1);

// The above TextBox Builder is functionally same as:

TextBox textbox = new TextBox();
textbox.ID = "TextBox1";
textbox.Text = "testing";

this.form1.Controls.Add(textbox);

// Or: 

this.form1.Controls.Add(new TextBox {
    ID = "TextBox1",
    Text = "testing"
});

完全な ControlBuilder クラスを次に示します。

ビルダー

public partial class Factory
{
    public static TextBoxBuilder TextBox()
    {
        return new TextBoxBuilder(new TextBox());
    }
}

public abstract class ControlBuilder<TControl, TBuilder> 
    where TControl : Control
    where TBuilder : ControlBuilder<TControl, TBuilder>
{
    public ControlBuilder(TControl control)
    {
        this.control = control;
    }

    private TControl control;

    public virtual TControl Control
    {
        get
        {
            return this.control;
        }
    }

    public virtual void RenderTo(Control control)
    {
        control.Controls.Add(this.Control);
    }

    public TBuilder ID(string id)
    {
        this.Control.ID = id;
        return this as TBuilder;
    }
}

public abstract class TextBoxBuilder<TTextBox, TBuilder> : ControlBuilder<TTextBox, TBuilder>
    where TTextBox : TextBox
    where TBuilder : TextBoxBuilder<TTextBox, TBuilder>
{
    public TextBoxBuilder(TTextBox control) : base(control) { }

    public TBuilder Text(string text)
    {
        this.Control.Text = text;
        return this as TBuilder;
    }
}

public class TextBoxBuilder : TextBoxBuilder<TextBox, TextBoxBuilder>
{
    public TextBoxBuilder(TextBox control) : base (control) { }
}
4

2 に答える 2

3

ここでの必要性に疑問を呈します。私には、これ:

Factory.TextBox()
    .ID("TextBox1")
    .Text("testing")
    .RenderTo(this.form1);

次のものよりもはるかに明確ではありません。

this.form1.Controls.Add(new TextBox {
        ID = "TextBox1",
        Text = "testing"
    });

工場とは?「RenderTo」行を忘れるとどうなりますか?

最初のものは私にはほとんど明らかではなく、これをカスタム コントロール (事前にプロパティがわからない場合) に拡張することは非常に難しいため、保守性が低くなります。

于 2009-09-01T18:07:10.657 に答える
0

Fluent API の仕組みが気に入っています。これは、動的コントロールを構成するための良い方法かもしれません。

次の点があります。

  • Fluent API スタイルはまさにスタイルです。従来の関数型プログラミング スタイルと同じことを、異なる美学で実現します。
  • 多くのユーザーは、フォーム デザイナを使用してコントロールを設計するだけで十分です。実行時にコントロールを作成しない限り、あまり使用されません。
  • 上記に加えて、私が作成したほとんどのランタイム コントロールには、何らかの if-then-else ロジックが含まれている傾向があります。Fluent スタイルは単純な構成に適していますが、構築プロセスに多くのロジックがあると扱いにくくなる傾向があります。
  • 私自身やチームの他のアーキテクトに、これが従来のアプローチよりも読みやすさや文体以外の利点があることを納得させるのは難しいでしょう。
  • 最後に、私の製品コードは別のライブラリに依存する必要があり、バグを導入した可能性は常にわずかにあります。

最後に、あなたがこれを引き受けてくれて良かったと言わなければなりません。これは素晴らしい演習であり、誰かが使用する可能性があります。オープンソースにすれば、数年後には標準になるかもしれません。

于 2009-09-01T18:42:56.153 に答える