16

我最近遇到了这个表达 - 但在维基百科上阅读并没有对我来说很清楚 - 我仍然不明白:

  1. 它有什么意义
  2. 它在实践中是如何使用的(即它如何使编码人员在他们的日常工作/构建系统中受益)?

[编辑] Wikipedia 文章 C++ 示例过长,将流畅界面的讨论与简单的 Glut 应用程序示例混为一谈。有人可以提供一个说明流畅接口的类的 SUCCINCT C++ 示例(例如,这种影响与普通 C++ 接口有何不同)?

4

4 回答 4

14

它通过减少他必须输入(和阅读)的数量来使编码人员受益。

要使用 Wikipedia 上的 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();
 }
于 2010-01-18T07:37:34.130 回答
9

术语“流利的界面”有不同的解释。在 C++ 中创建一个的常用方法是方法链接,例如 iostream 库中常用的方法:

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

Named Parameter Idiom是另一个很好的流畅接口示例:

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

好处?更易读、更灵活的代码,当然这仍然取决于实现。

于 2010-01-18T08:13:33.997 回答
2

fluent 接口的一大区别和优势是,当您想要创建对象并将其用作参数时,您不需要实例变量来更改某些属性:

没有:

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

流畅的界面:

world.CreateNode(Object()
                                           .setcolor("red")
                                           .setstyle("solid")
                                           .setname("test")
                             );
于 2010-01-18T08:09:55.610 回答
0

CallStream又名“为什么是点?” :)

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

关键概念:使用函数式编程习语,描述接口。不使用:消息参数作为字符串,被解析,概念。

我认为它主要与“Facade”模式有关,但是是的,它与“Builder 模式”有关。它似乎也从“Monads”中幸存下来。

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

于 2019-04-11T07:32:30.040 回答