Gur*_*epS 13 oop fluent-interface leaky-abstraction
什么是流畅的界面?我找不到一个好的定义,但我得到的只是我不熟悉的语言中的长代码示例(例如C++).
另外,什么是漏洞抽象?
谢谢
Ras*_*ber 26
流畅的界面是一种API,允许您编写与普通英语一样或多或少的代码.例如:
Find.All.Questions(Where.IsAnswered == true);
Run Code Online (Sandbox Code Playgroud)
方法链通常用作实现的一部分,但除此之外还有更多内容.引用福勒:
我也注意到了一个常见的误解 - 很多人似乎将流畅的界面与Method Chaining等同起来.当然链接是一种常用的技术,可以使用流畅的界面,但真正的流畅性远不止于此.
它通常也称为内部DSL,因为语法类似于DSL,但它是在宿主语言中实现的,而不是由解析器处理.
一个流畅的界面,埃里克埃文斯创造的术语,它只是方法链的另一个名称.Martin Fowler的写了一对夫妇的文章就这个问题,但它大致是这样的:
m_Window = window::with()
.width(l_Width)
.height(l_Height)
.title("default window")
.left(200)
.top(200)
.create();
Run Code Online (Sandbox Code Playgroud)
Fluent接口通常用于以不支持它们的语言(例如C++中的命名参数惯例)或域特定语言创建命名参数,以使代码读取更流畅.
我已经看到它们被用于从图像处理库到正则表达式库,3D库的所有东西.其他示例包括树结构,列表或其他数据结构的构造.需要构造复杂对象(参数加载)的所有内容都可以使用Fluent接口使其更具可读性.例如,将前面的示例与CreateWindow函数调用进行比较:
::CreateWindow(
"Window class",
"Window title",
dwStyle, X, Y,
nWidth, nHeight,
hWndPant, hMenu,
hInstance, NULL
);
Run Code Online (Sandbox Code Playgroud)
小智 5
这是一个常规的每日界面:
public interface NotFluent
{
void DoA();
void DoB();
void DoC();
}
Run Code Online (Sandbox Code Playgroud)
这里有一个流畅的界面:
public interface Fluent
{
Fluent DoA();
Fluent DoB();
Fluent DoC();
}
Run Code Online (Sandbox Code Playgroud)
最明显的区别是,当我们返回一个void时,我们返回一个接口类型的实例.可以理解的是,返回的接口是CURRENT INSTANCE,而不是相同类型的新实例.当然,这是不可执行的,并且在不可变对象(如字符串)的情况下,它是一个不同的实例,但可以被认为是仅更新的同一实例.
以下是它们的使用示例:
NotFluent foo = new NotFluentImpl();
foo.DoA();
foo.DoB();
foo.DoC();
Fluent bar = new FluentImpl();
bar.DoA().DoB().DoC();
Run Code Online (Sandbox Code Playgroud)
请注意,链接不同的调用时,更容易使用流畅的界面.IRL,查看Linq扩展方法以及每个调用如何设计为流入另一个.即使它是有效的结果,这些方法都不会返回void.