我最近接触到这个词汇 - 但是在维基百科上阅读并没有让我更加明白它的含义 - 我仍然不理解:
- 它的意义是什么
- 在实践中如何使用(即它如何有助于程序员日常工作/构建系统)?
[编辑] 维基百科文章的C++示例过于冗长,并将流利接口的讨论与一个简单的Glut应用程序示例混淆了。有人能够提供一个简明的C++类示例,说明流畅接口(这种接口与普通的C++接口有何不同)吗?
我最近接触到这个词汇 - 但是在维基百科上阅读并没有让我更加明白它的含义 - 我仍然不理解:
[编辑] 维基百科文章的C++示例过于冗长,并将流利接口的讨论与一个简单的Glut应用程序示例混淆了。有人能够提供一个简明的C++类示例,说明流畅接口(这种接口与普通的C++接口有何不同)吗?
这有助于程序员减少输入(和阅读)的数量。
使用维基百科上的C++示例:
之前:
int main(int argc, char **argv) {
GlutApp app(argc, argv);
app.setDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_ALPHA|GLUT_DEPTH); // Set framebuffer params
app.setWindowSize(500, 500); // Set window params
app.setWindowPosition(200, 200);
app.setTitle("My OpenGL/GLUT App");
app.create();
}
之后:
int main(int argc, char **argv) {
FluentGlutApp app(argc, argv);
app.withDoubleBuffer().withRGBA().withAlpha().withDepth()
.at(200, 200).across(500, 500)
.named("My OpenGL/GLUT App");
app.create();
}
“流畅接口”这个术语有不同的解释。在C++中,创建一种常见的方法是使用方法链接,例如iostream库中经常使用:
Object.MethodA().MethodB();
cout << "a = " << a;
命名参数惯用法是流畅接口的另一个很好的例子:(Named Parameter Idiom)
Window w = CreateWindow()
.Width(400)
.Height(300)
.OnTop();
好处是什么?更易读和更灵活的代码,尽管这当然还取决于实现。
流畅接口的一个重要区别和优势在于,当您想创建一个对象并将其用作参数时,无需实例变量来更改某些属性:
没有:
Object object;
object.setcolor("red");
object.setstyle("solid");
object.setname("test");
world.CreateNode(object);
使用流畅的接口:
world.CreateNode(Object()
.setcolor("red")
.setstyle("solid")
.setname("test")
);
使用(非常简单的)JavaScript 来描述新的和重要的概念并没有问题。在 C++ 中也完全可行。
关键概念:使用函数式编程习语来描述接口。不使用字符串作为消息参数进行解析,这是一个概念。
我认为它大多与“Facade”模式有关,但是它确实与“Builder”模式有关。而且它似乎也经受住了“Monads”的考验。
顺便说一句:以上所有倡导者都提出了非常好的用例。