2015-04-17 57 views
0

昨天我发现我可以模拟一口流利的接口,如果我这样从每个方法返回的类的实例...让我的班“流利”

public class IsThisFluent 
{ 
    public IsThisFluent Stuff() 
    { 
     //... 
     return this; 
    } 

    public IsThisFluent OtherStuff() 
    { 
     // ... 
     return this; 
    } 
} 

这是所有有给它?

我承认,我是一只非常小的大脑,我想继续这个,但我认为这可能是最好的检查与长大。

我错过了什么吗?

有没有发现这种模式的'gotcha'?

+0

这就是我一直这样做的方式......看看这个:http://www.codeproject.com/Articles/640997/Fluent-interfaces-and-Method-Chaining-in-Csharp – stefankmitph

+3

它是当你使用不可变类时,这很常见。 Jon Skeet有一个很好的视频,用这种模式编写一个Tetris控制台应用程序。编辑:这里是...... https://vimeo.com/68331762 – DavidG

+0

它种取决于你打算如何使用它,有没有东西真的需要返回任何东西或做任何事后的对象?我不确定这会带来多大的性能回报,仅仅是为了它的效果。 – Sayse

回答

2

return this不是全部有流畅的接口。链接方法是一种构建流畅API的简单形式,但流畅的API通常看起来像DSL(领域特定语言),并且很难设计更多的很多

以起订量作为一个例子:

new Mock<IInterface>() 
    .Setup(x => x.Method()) 
    .CallBack<IInterface>(Console.WriteLine) 
    .Returns(someValue); 
  • Setup方法,上式Mock<T>定义,返回ISetup<T, TResult>一个实例。

  • Callback方法,定义为ICallback<TMock, TResult>返回IReturnsThrows<TMock,TResult>的一个实例。请注意0​​延伸IReturnsThrows<TMock,TResult>

  • 最后,Returns定义在IReturns<TMock,TResult>并返回IReturnsResult<TMock>。还请注意IReturnsThrows<TMock,TResult>延伸IReturnsResult<TMock>

所有这些细微差别在那里迫使你调用一个特定的顺序这些方法,并从连续通话Setup两次,例如不许你。或者在致电Setup之前致电Returns

这些细节对确保良好的用户体验非常重要。

想了解更多关于设计流畅界面,看看Martin Fowler的上FluentInterface文章。 FluentAssertions是设计可能复杂程度的另一个主要例子 - 也是结果可读性更高的另一个例子。

0

不,就是这么多。

背后的想法是,您可以将方法调用链接在一起,随时操纵内部状态。最终,Fluent interface的主要目标是可读性,LINQ就是一个很好的例子。

3

这就是它。

这里就可以了真正的好文章: http://rrpblog.azurewebsites.net/?p=33

我也很喜欢从这个回答这个例子: https://stackoverflow.com/a/1795027/131809

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; 
    } 
} 

var myMorningCoffee = Coffee.Make.WithCream().WithOuncesToServe(16); 

这倒提醒了我,我现在需要一个咖啡。

+0

谢谢你。虽然我明白为什么'Set'属性存在(来自代码pov),但我并不真正了解_why_它在那里。 –