2

拡張メソッドを使用して ac# ステートメントをチェーンし、次のように jQuery のようにすることを考えています。

foo foo2 = 
  new foo().Title(foo1.Title)
  .Name(foo1.Name)
  .DoSomeStuff()
  .DoSomeMoreStuff();

これは良い/悪い考えですか?

public class foo
{
  public string Title {get;set;}
  public string Name {get;set;}
  public int Age {get;set;}

  public foo(){} 
}

public static class fooExtension
{
  public static foo Title(this foo source, string title)
  {
    source.Title = title;
    return source;
  }

 //and other extensions
}

Upadate: 私がこれを検討している「理由」としての詳細な説明。 私は2つのことをしています:

  1. あるオブジェクトからデータを取得し、それを使用して別のオブジェクトのプロパティを設定しています。
  2. これらのプロパティに対して何らかのアクションを実行する必要があります。

だから私の最初のコードはもっと似ていた

foo2.bars = foo1.bars;
foo2.RemoveUnderage();
foo2.NotifyPatronsBarsAreFull();

代わりに、次のように記述した方がわかりやすいかもしれないと考えました。

foo2.bars(foo1.bars).RemoveUnderage().NotifyPatrons();

イニシャライザは優れていますが、プロパティもすべてまとめてバンドルしているため、プロパティ セットを、実行するアクションに近づけたいと考えました。

4

4 に答える 4

5

代わりにオブジェクト初期化子を使用することに何か問題がありますか?

new Foo { Title = foo1.Title, Name = foo1.Name }
   .DoSomeStuff()
   .DoSomeMoreStuff();

一般に連鎖は問題ありませんが(LINQを参照)、オブジェクト初期化子は、プロパティのように見えるメソッドを追加する必要がないことを意味します。

于 2011-03-29T18:25:35.543 に答える
0

私は個人的にこの「流暢な」スタイルのプログラミングが好きです。適切な名前のメソッドは、文のように見える場合があります。私はあなたを少し変えるでしょう:

foo foo2 = new foo()
{
    Title = foo1.Title,
    Name = foo1.Name
}
.DoSomeStuff()
.DoSomeMoreStuff(); 
于 2011-03-29T18:26:52.753 に答える
0

読みやすさの観点からは悪い考えだと思いますが、それは厳密に個人的なことです。

于 2011-03-29T18:29:51.113 に答える
0

流暢なインターフェースのことですか?場合によっては、同じ方法が .NET Framework のクラス (つまり、StringBuilder または LINQ 拡張メソッド) で使用されます。ただし、流暢なインターフェイスは明示的に作成する必要があり、C# よりも多くの作業と別の言語からの使用が必要です。すべてのクラスに流暢なインターフェイスを作成することは、優れたソフトウェアを短期間で提供するための良い方法だとは思いません。

于 2011-03-29T18:37:48.193 に答える