在C#3中编写stream畅接口的技巧

我在C#中使用stream畅接口的一些好的技巧。 我只是自己学习,而是热衷于听到别人在我读的文章之外的想法。 特别是我之后:

  1. 什么时候stream利太多?
  2. 有什么stream利的模式?
  3. C#中的stream畅接口(例如扩展方法)
  4. 是一个复杂stream畅的界面还是一个stream利的界面?
  5. 重构到达stream畅的接口或重构现有的stream畅接口
  6. 在那里你曾经或可以推荐的任何好例子?

如果你可以张贴一个小费或思想,或任何每个职位。 我也想看看他们是如何投票的。

先谢谢你。

在你的第四点上;

是的,我认为复杂stream畅的界面仍然stream畅。

我认为stream畅的界面有点妥协。 (虽然是好的!)对于使用自然语言进行编程已有很多研究,一般自然语言不足以expression程序。

stream畅的接口被构造成使得它们像编程语言一样被编写,只允许你用自然语言expression的一小部分,但是它们被看作是一种自然语言。

如果你看犀牛嘲笑,例如写作部分比正常的图书馆复杂。 由于stream畅的界面,我花了我更多的时间学习,但它使代码更容易阅读。 因为程序通常只写一次,阅读次数多,这是一个很好的折衷。

所以要说明我的观点。 stream畅的界面写起来很复杂,但易于阅读,仍然stream畅。

我作为一个stream畅接口的消费者所经历的最大挑战就是它们中的大多数并不是stream畅的接口,而是我倾向于称之为“易读接口”的实例。

一个stream畅的界面意味着它的主要目标是使它容易说话,而一个清晰的界面意味着它的主要目标是易于阅读它。 大部分stream畅的界面往往难以用代码编写,但是相反,其他人很容易阅读。

Assert().That().This(actual).Is().Equal().To(expected). Except().If(x => x.GreaterThan(10)); 

…比实际编写代码更容易阅读。

在使用inheritance和stream畅的接口的时候,你会碰到一块砖头,因为使用多态的方法会破坏你的调用链,并且你绝对不希望在不需要的地方使用丑陋的铸造和palentization来使你的接口不stream利。 我写了一篇关于模式的文章,它提供了一个使用generics构造器和通用约束的generics扩展方法的解决方法: http : //liviutrifoi.wordpress.com/2009/02/16/fluent-interfaces-constraints-at-编译时/

Moq隐藏了诸如equals, ToString类的未经处理的方法,使stream畅的界面更易于使用。

隐藏系统对象是一个文章,解释这样做的好处。

并在你的第二和第三个问题;

我注意到了三种stream利的模式

第一个使用using语句(C#2.0)在特定的上下文中运行代码,例如:

 using(var transaction = new Transaction()) { // .. // .. } 

这使用Transaction的构造函数和处理器来build立一个事务,然后在这个上下文中运行代码。

第二个和lambda几乎一样,但是在Rhino Mocks中这个用法很多。

 (new Transaction()).Run( () => mycode(); ); 

最熟知的stream畅接口是使用返回types来链式方法调用。 大多数方法返回这个,所以你可以链接调用相同的对象。 但是,您也可以根据所调用的方法返回不同的对象来更改上下文。 如果你有一个只能在一个事务中运行的对象(抱歉不能想到一个不同的例子),你可以给它一个StartTransaction方法,返回一个初始化的事务,你可以用伪代码运行call run和stoptransaction:

 class Runner { Transaction StartTransaction() { return new Transaction(this); } } class Transaction { Transaction Run() Transaction StopTransaction() } 

电话看起来像

 var runner = new Runner(); runner .StartTransaction() .Run() .StopTransaction(); 

当然你需要添加各种error handling等

我也只是在学习如何为工作中的小应用程序写一个stream畅的界面。 我问了一下,研究了一下,发现写一个stream畅的界面的好方法是使用“构build器模式”,在这里阅读更多关于它的链接文本

在本质上,这是我如何开始我的:

 public class Coffee { private bool _cream; public Coffee Make { get new Coffee(); } public Coffee WithCream() { _cream = true; return this; } public Coffee WithOuncesToServe(int ounces) { _ounces = ounces; return this; } 

}

这里是一个交叉post,我有一个类似的问题,用stream畅的界面实现闭包。 链接文本

有一件事是,你必须说明英语语法的形态,并确保你没有在下面引入无证顺序耦合。

 // Snarky employees get a raise. employees.WhereSnarky().GiveRaise(); 

 // Depending on implementation, everyone may get a raise. employees.GiveRaise().WhereSnarky(); 

前段时间我也有同样的怀疑,你现在有。 我已经做了一些研究,现在我正在写一些文章来帮助解决这些问题。

在我的博客上查看:

C#中stream畅的界面devise指南

在接下来的文章中,我将介绍你提到的每一点。

最好的问候安德烈Vianna