Что такое свободный интерфейс?
Я недавно сталкивался с этим выражением - но чтение в Википедии не прояснило его для меня - я все еще не понимаю:
- Какой смысл в этом
- Как это используется на практике (то есть, как это приносит пользу программисту в их повседневной работе / строительных системах)?
[Править] Пример статьи 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++
Ключевая концепция: используя идиому функционального программирования, опишите интерфейс. Без использования: аргумент сообщения в виде строки, подлежащей анализу, концепция.
Я думаю, что это в основном связано с шаблоном "Фасад", но да, это связано с "шаблоном Строителя". И, похоже, это пережило и "Монады".
Кстати: все адвокаты выше представили очень хорошие примеры использования.