什么是流畅接口?

16

我最近接触到这个词汇 - 但是在维基百科上阅读并没有让我更加明白它的含义 - 我仍然不理解:

  1. 它的意义是什么
  2. 在实践中如何使用(即它如何有助于程序员日常工作/构建系统)?

[编辑] 维基百科文章的C++示例过于冗长,并将流利接口的讨论与一个简单的Glut应用程序示例混淆了。有人能够提供一个简明的C++类示例,说明流畅接口(这种接口与普通的C++接口有何不同)吗?

4个回答

14

这有助于程序员减少输入(和阅读)的数量。

使用维基百科上的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();
 }

1
这与方法链有何不同?(这是另一种情况,有人创造了一个新的短语来描述已经有其他名称的东西吗?) - Stick it to THE MAN
4
“Stick it to THE MAN”:维基百科文章链接到马丁·福勒(Martin Fowler)最初提出“Fluent Interface”这个词语的原始文章。在该文章的末尾,他明确说明了流畅接口为什么不仅仅是方法链式调用。原文链接:http://martinfowler.com/bliki/FluentInterface.html - e.James
1
总之,流畅的接口利用方法链接等工具,使与该接口的交互对类用户更加自然。结果是代码看起来非常像特定于领域的语言。 - e.James
1
要了解Thilo的第二个示例更加“流畅”的原因,请尝试大声朗读它。至少在我听来,它很像某人向同事描述这个GLUT应用程序时会写下的句子:“所以,我用双缓冲区制作了这个应用程序。它有RGBA、alpha和深度。我将窗口从(200,200)到(500,500)制作,并将其命名为“我的OpenGL/GLUT应用程序”。 - e.James
无论如何,那是我的理解。我希望它有所帮助! - e.James
显示剩余3条评论

9

“流畅接口”这个术语有不同的解释。在C++中,创建一种常见的方法是使用方法链接,例如iostream库中经常使用:

Object.MethodA().MethodB();
cout << "a = " << a;

命名参数惯用法是流畅接口的另一个很好的例子:(Named Parameter Idiom)

Window w = CreateWindow()
               .Width(400)
               .Height(300)
               .OnTop();

好处是什么?更易读和更灵活的代码,尽管这当然还取决于实现。


2

流畅接口的一个重要区别和优势在于,当您想创建一个对象并将其用作参数时,无需实例变量来更改某些属性:

没有:

Object object;
object.setcolor("red"); 
object.setstyle("solid");
object.setname("test");
world.CreateNode(object);

使用流畅的接口:

world.CreateNode(Object()
                                           .setcolor("red")
                                           .setstyle("solid")
                                           .setname("test")
                             );

0

CallStream 即“为什么要用点号?”

使用(非常简单的)JavaScript 来描述新的和重要的概念并没有问题。在 C++ 中也完全可行。

关键概念:使用函数式编程习语来描述接口。不使用字符串作为消息参数进行解析,这是一个概念。

我认为它大多与“Facade”模式有关,但是它确实与“Builder”模式有关。而且它似乎也经受住了“Monads”的考验。

顺便说一句:以上所有倡导者都提出了非常好的用例。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接