views:

262

answers:

4

I recently came across this expression - but reading up on Wikipedia did not clarify it much for me - I still don't get it:

  1. What's the point of it
  2. How is it used in practice (i.e. how does it benefit a coder in their day to day work/building systems)?

[Edit] The Wikipedia article C++ example is overly long, and conflates the discussion of a fluent interface with an example of a simple Glut app. Can someone provide a SUCCINCT C++ example of a class that illustrates a fluent interface (how does such an influence differ from an ordinary C++ interface for example)?

+5  A: 

It benefits the coder by reducing the amount he has to type (and read).

To use the C++ example on Wikipedia:

Before:

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

After:

 int main(int argc, char **argv) {
     FluentGlutApp app(argc, argv)
         .withDoubleBuffer().withRGBA().withAlpha().withDepth()
         .at(200, 200).across(500, 500)
         .named("My OpenGL/GLUT App");
     app.create();
 }
Thilo
Could you provide a succinct example of this?. The wikipedia article C++ example is overly long, and the point of the fluent interface discussion is lost in the waffle of a Glut application.
Stick it to THE MAN
How does this differ from method chaining? (is this another case of someone coining a new phrase to describe something that is already known by another name?)
Stick it to THE MAN
@Stick it to THE MAN: The wikipedia article links to Martin Fowler's original article (where he coined the phrase). At the very end of that article, he gives some indication of why fluent interfaces are more than just method chaining. http://martinfowler.com/bliki/FluentInterface.html
e.James
To sum it up: a fluent interface *makes use of* method chaining, among other tools, in order to make interaction with that interface read more naturally to the class user. The result is code that looks very much like a domain-specific language.
e.James
To see what makes Thilo's second example more "fluent", try reading it out loud. It reads, at least to my ears, a lot like a sentence that someone would write when describing this GLUT App to a colleague: "So, I made this app with a double buffer. It had RGBA, alpha, and depth. I made the window from (200, 200) across (500, 500) and I named it 'My OpenGL/GLUT App'"
e.James
Anyway, that's my understanding of it. I hope it helps!
e.James
Re: method chaining: Note that in addition to using method chaining, the names of the methods have also changed, and the bitmask parameters have been replaced by individual setters, which makes the code read more "fluently".
Thilo
Thanks guys - Fowler's doc really helped drive the point home.
Stick it to THE MAN
+1  A: 

One big difference and advantage of the fluent interface is that you don't need an instance variable to change some properties when you want to create an object and use it as an argument:

without:

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

with fluent interface:

world.CreateNode(Object()
                                           .setcolor("red")
                                           .setstyle("solid")
                                           .setname("test")
                             );
Ozan
+4  A: 

There are different interpretations of the term "fluent interface". A common way to create one in C++ is method chaining, which is commonly used in for example the iostream library:

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

The Named Parameter Idiom is another nice example of a fluent interface:

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

The benefits? Code that's better readable and more flexible, although that still depends on the implementation of course.

jbvo
+1  A: 

You can find a good definitition and the basic concepts of the fluent interface this this post:

Guidelines to Fluent Interface design in C# part 1

I hope that helps.

Sir Gallahad