Какой свободный интерфейс?

Недавно я натолкнулся на это выражение, но чтение в Википедии не прояснило это для меня - я до сих пор этого не понимаю:

  • Какая точка зрения
  • Как это используется на практике (например, как это выгодно кодеру в повседневной работе/зданиях)?

[изменить] Пример статьи С++ в Википедии слишком длинный и объединяет обсуждение свободного интерфейса с примером простого приложения Glut. Может ли кто-нибудь предоставить пример CUCCINCT С++ для класса, который иллюстрирует свободный интерфейс (как это влияние отличается от обычного интерфейса С++, например)?

Ответы

Ответ 1

Это помогает кодеру, уменьшая количество, которое он должен набирать (и читать).

Чтобы использовать пример С++ в Википедии:

До:

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)
         .withDoubleBuffer().withRGBA().withAlpha().withDepth()
         .at(200, 200).across(500, 500)
         .named("My OpenGL/GLUT App");
     app.create();
 }

Ответ 2

Существуют разные интерпретации термина "свободный интерфейс". Общим способом создания в С++ является цепочка методов, которая обычно используется, например, в библиотеке iostream:

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

Именованный идентификатор параметров - еще один приятный пример свободного интерфейса:

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

Преимущества? Код, который является более читаемым и более гибким, хотя это все еще зависит от реализации курса.

Ответ 3

Одна большая разница и преимущество свободного интерфейса в том, что вам не нужна переменная экземпляра для изменения некоторых свойств, когда вы хотите создать объект и использовать его в качестве аргумента:

без

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

с плавным интерфейсом:

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