回答
说一口流利的界面术语埃里克埃文斯创造的,它是方法链的另一个名称。 Martin Fowler的关于这个主题写的articles一个couple,但它大致是这样的:
m_Window = window::with()
.width(l_Width)
.height(l_Height)
.title("default window")
.left(200)
.top(200)
.create();
流利的接口通常用于在不支持他们(命名参数成语在C语言创建命名参数++例如)或域特定语言中,以使代码更流利。
我已经看到它们用于从图像处理库到正则表达式库,3D库的所有内容。其他示例包括树结构,列表或其他数据结构的构建。所有需要构建复杂对象(参数负载)的应用程序都可以使用Fluent接口来提高可读性。例如,在前面的例子比较的CreateWindow函数调用:
::CreateWindow(
"Window class",
"Window title",
dwStyle, X, Y,
nWidth, nHeight,
hWndPant, hMenu,
hInstance, NULL
);
像jQuery的链接? – 2009-01-11 19:25:15
我从事过任何与网络相关的开发已经有一段时间了,但从jQuery文档来看,它似乎是这样。 – 2009-01-11 19:33:58
这是方法链接,而不是流畅的接口。请参阅上面Rasmus的回答*“当然,链接是流畅界面使用的常用技术,但真正的流畅度远不止于此......”* – Pacerier 2015-08-13 11:22:47
这是一个普通的每一天接口:
public interface NotFluent
{
void DoA();
void DoB();
void DoC();
}
而且这里有一个流畅的接口:
public interface Fluent
{
Fluent DoA();
Fluent DoB();
Fluent DoC();
}
最明显的区别在于,当我们返回一个void时,我们返回一个接口类型的实例。所理解的是返回的接口是CURRENT INSTANCE,而不是同一类型的新实例。当然,这是不可强制执行的,而且在不可变对象(如字符串)的情况下,它是不同的实例,但可以被认为是仅更新的相同实例。
这里是他们使用的例子:
NotFluent foo = new NotFluentImpl();
foo.DoA();
foo.DoB();
foo.DoC();
Fluent bar = new FluentImpl();
bar.DoA().DoB().DoC();
注意,流畅的接口更容易链接不同的呼叫时使用。 IRL,检查Linq扩展方法以及每个调用如何设计流入另一个。没有任何方法返回void,即使它是有效的结果。
这个示例不是简单的方法链吗?福勒指出[*“许多人似乎将流畅的界面等同于方法链接”(http://www.martinfowler.com/bliki/FluentInterface.html)。上面的代码具有哪些属性,使其成为流畅的界面而不仅仅是方法链接? – Pacerier 2015-08-13 11:28:49
在流畅的界面中,对象的方法将返回对该对象的引用,以便您可以将方法调用链接在一起。
例如,在NValidate,我这样做是为了简化参数验证:
public City GetCity(string zipCode)
{
zipCode.Assert("zipCode").IsNotNullOrEmpty().HasLength(5,10).Matches("\\d[5]-\\d[4]");
// Continue processing
}
我不能说对泄漏的抽象,虽然。
面向对象的接口是流利如果了为副作用返回self
执行的方法,从而使这种方法可以链接在一起。
1990年,我第一次遇到流畅的接口,当Modula-3接口警察(我没有做这件事)需要所有的初始化方法返回初始化的对象。我相信这个用法早于术语“流畅界面”的造币。
漏泄抽象是一种抽象,其中底层现实的细节经常“泄漏”。
All abstractions lie或多或少的,但有时抽象是不适合潜在的现实,这是造成更多的伤害,而不是帮助。
抽象中“泄漏”的一个简单示例可能是通常的浮点类型。它似乎代表一般的实数,你可以用它来执行基本的计算。但是在某个时候,您会遇到1/3 * 3!= 1或1 + 10^-20 = 1的情况。这是实际实现细节泄露并且抽象中断的时候。
谢谢你们。
很好的描述。
我对流畅接口的想法是为了便于阅读。我总是可以阅读一连串的方法,以及如何与上一个/下一个方法相关。
E.g.像发布验证示例的海报(我已经编写了类似于之前的代码)。
Neal Ford在他的书'Productive Programmer'中做了一个很好的解释和给出Fluent接口示例的工作。
传统的对象或“豆”的getter/setter方法:
Car car = new CarImpl();
MarketingDescription des = new MarketingDescriptionImpl();
desc.setType("Box");
desc.setSubtype("Insulated");
desc.setAttribute("length", "50.5");
desc.setAttribute("ladder", "yes");
desc.setAttribute("lining type", "cork");
car.setDescription(desc);
满足同样需要有一个流畅的接口:
Car car = Car.describedAs()
.box()
.length(50.5)
.type(Type.INSULATED)
.includes(Equipment.LADDER)
.lining(Lining.CORK);
- 1. 泄漏抽象的含义?
- 2. 泄漏抽象律例外
- 3. EBNF流畅接口
- 4. 在一个类中混合流畅和非流畅的接口
- 5. C#中的流畅接口
- 6. 接口和抽象
- 7. IDisposable接口:内存泄漏
- 8. 如何防止泄漏抽象?
- 9. 与接口和抽象类
- 10. PHP抽象类和接口
- 11. Java抽象和接口
- 12. C#接口和抽象类
- 13. Java抽象和接口
- 14. 抽象类和接口
- 15. PHP,OOP接口和抽象
- 16. 纯抽象类和接口
- 17. 使用抽象和接口
- 18. 抽象接口
- 19. 泄漏对象:ALasset和ALAssetPrivate
- 20. Python-C++接口中的内存泄漏?
- 21. 方法链接和流畅接口之间的区别
- 22. WebView - 窗口泄漏
- 23. 如何为接口对象注册预期的内存泄漏
- 24. 连接泄漏
- 25. Java:接口和抽象类的实现
- 26. Java接口和抽象类的问题
- 27. 在接口和抽象类的Java
- 28. 抽象类和接口的Java
- 29. 抽象和接口的解释
- 30. 接口和抽象方法的区别
这应该作为两个单独的问题发布。 – 2013-07-09 14:40:11