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

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

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

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

3 ответа

Решение

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

Чтобы использовать пример 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)
         .withDoubleBuffer().withRGBA().withAlpha().withDepth()
         .at(200, 200).across(500, 500)
         .named("My OpenGL/GLUT App");
     app.create();
 }

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

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

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

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

Выгоды? Код, который лучше читается и более гибок, хотя, конечно, зависит от реализации.

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

без:

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

с свободным интерфейсом:

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

CallStream aka "Почему точка?":)

Ничего плохого в небольшом (очень простом) JavaScript для описания новых и важных концепций. Идеально подходит для C++

Ключевая концепция: используя идиому функционального программирования, опишите интерфейс. Без использования: аргумент сообщения в виде строки, подлежащей анализу, концепция.

Я думаю, что это в основном связано с шаблоном "Фасад", но да, это связано с "шаблоном Строителя". И, похоже, это пережило и "Монады".

Кстати: все адвокаты выше представили очень хорошие примеры использования.

Другие вопросы по тегам