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