【问题标题】:What's a fluent interface?什么是流畅的界面?
【发布时间】:2010-01-18 07:34:21
【问题描述】:

我最近遇到了这个表达 - 但阅读 on Wikipedia 并没有让我很清楚 - 我仍然不明白:

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

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

【问题讨论】:

    标签: c++ coding-style fluent-interface


    【解决方案1】:

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

    要使用 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();
     }
    

    【讨论】:

    • 你能提供一个简洁的例子吗?维基百科文章 C++ 示例过长,流畅接口讨论的重点在 Glut 应用程序的华夫饼中丢失了。
    • 这与方法链接有何不同? (这是另一种情况,有人创造了一个新的短语来描述已经用另一个名字知道的东西吗?)
    • @Stick it to THE MAN:维基百科文章链接到 Martin Fowler 的原始文章(他创造了这个短语)。在那篇文章的最后,他给出了一些说明,说明为什么流畅的接口不仅仅是方法链接。 martinfowler.com/bliki/FluentInterface.html
    • 总而言之:流畅的界面利用方法链接,以及其他工具,以使与该界面的交互更自然地被类用户阅读。结果是看起来非常像特定领域语言的代码。
    • 要了解是什么让 Thilo 的第二个示例更“流畅”,请尝试大声朗读。它读起来,至少在我的耳朵里,很像有人在向同事描述这个 GLUT 应用程序时会写的一句话:“所以,我用双缓冲区制作了这个应用程序。它有 RGBA、alpha 和深度。我做了从 (200, 200) 到 (500, 500) 的窗口,我将其命名为 'My OpenGL/GLUT App'"
    【解决方案2】:

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

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

    Named Parameter Idiom 是另一个很好的流畅界面示例:

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

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

    【讨论】:

      【解决方案3】:

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

      没有:

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

      流畅的界面:

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

      【讨论】:

        【解决方案4】:

        CallStream aka “为什么是点?” :)

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

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-09-19
          • 1970-01-01
          • 2013-07-30
          • 1970-01-01
          • 2010-09-29
          • 2022-08-19
          • 2014-09-21
          相关资源
          最近更新 更多