【问题标题】:Is chaining c# to look like jQuery a good idea?链接 c# 看起来像 jQuery 是个好主意吗?
【发布时间】:2011-03-29 18:23:25
【问题描述】:

我正在考虑使用扩展方法将 c# 语句链接成如下所示的 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
}

更新:更多解释我正在考虑的“为什么”。 我有两件事:

  1. 我正在从一个对象获取数据并且 使用它来设置属性 其他。
  2. 我需要执行一些操作 对这些属性执行操作。

所以我的初始代码看起来更像

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

相反,我认为写起来可能更具描述性:

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

初始化器很棒,但它们也将所有属性捆绑在一起,我希望属性集接近我将对它们执行的操作。

【问题讨论】:

  • 我认为在使用调试器单步执行你想要的方法调用时会有点麻烦。

标签: c# extension-methods method-chaining


【解决方案1】:

使用对象初始化器有什么问题吗?

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

一般来说,链接很好(查看 LINQ),但对象初始化器意味着您不需要添加看起来像属性的方法。

【讨论】:

  • 这仍然留下了一个问题,即像这样链接函数调用还是以可链接的方式编写它们是否是一个“好主意”(无论这可能意味着什么)。
  • 如果你使用的是 3.5+(不是每个人都是),但不管怎样,有点离题了,嗯?
  • @harpo:您不必使用 .NET 3.5 - 只需 C# 3 或更高版本。对象初始化器不依赖任何框架支持。
  • 酷...所以您是说 C# 3 可以编译为 CLR 2?我不知道。 (仍然与 OP 无关。)
  • @harpo:当然。请参阅csharpindepth.com/Articles/Chapter1/Versions.aspx - .NET 4 急需更新...
【解决方案2】:

我个人喜欢这种“流利”的编程风格。正确命名的方法看起来像句子。我会稍微改变你的:

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

【讨论】:

  • 流畅接口的关键是每个额外的调用都必须以某种有用的方式建立在先前的结果之上。简单地将调用链接到同一个对象只会使您免于每次编写“foo2”,同时使代码库复杂化。
  • @Chris:这不是唯一的效果。它允许从多个调用计算单个表达式。有几个地方差异很大。
  • @Jon:这就是我所说的“从以前的结果构建”的意思。相比之下,仅从每个方法中返回“this”(如示例所示)只是一种快捷方式。
  • @Chris:不,你误解了我的意思。即使它只返回this,你仍然可以使用静态变量初始化器等不能使用额外变量的东西(你必须使用静态构造函数,或者调用一个辅助方法来完成所有操作初始化)。这也是对象初始化器的好处之一。
【解决方案3】:

我认为这在可读性方面是个坏主意,但这完全是个人问题。

【讨论】:

    【解决方案4】:

    你的意思是Fluent interface?在某些情况下,相同的方式用于 .NET Framework 中的类(即 StringBuilder 或 LINQ 扩展方法)。但是,必须显式创建流利的界面,并且它需要大量的工作,并且使用 C# 之外的另一种语言可能不是那么漂亮。我不认为为每个班级创建流畅的界面是在短时间内交付优质软件的好方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-14
      • 2015-02-14
      • 2010-11-05
      • 1970-01-01
      • 2019-02-19
      相关资源
      最近更新 更多