Fluent interface (біжучий чи текучий інтерфейс) в програмуванні — спосіб конструювання об'єктно-орієнтованого API, в якому читабельність коду є близькою до звичайного прозового тексту. Термін вперше був застосований Еріком Евансом та Мартіном Фаулером. Нижче подано приклад для фреймворку тестування JMock: .
mock.expects(once()).method("m").with( or(stringContains("hello"), stringContains("howdy")) );
Історія
Термін "fluent interface" з'явився в кінці 2005, хоча подібний підхід використовувався в Smalltalk ще в 1970-х, та в інших в 1980-их. Типовим прикладом є бібліотека iostream в мові , де використовуються оператори <<
та >>
для передачі повідомлень, багатократної пересилки даних до одного і того самого об'єкта.
Приклади
C++
Нижче наведено приклад, де fluent interface обгортка застосована поверх більш традиційного інтерфейсу C++:
// Звичайне визначення class GlutApp { private: int w_, h_, x_, y_, argc_, display_mode_; char **argv_; char *title_; public: GlutApp(int argc, char** argv) { argc_ = argc; argv_ = argv; } void setDisplayMode(int mode) { display_mode_ = mode; } int getDisplayMode() { return display_mode_; } void setWindowSize(int w, int h) { w_ = w; h_ = h; } void setWindowPosition(int x, int y) { x_ = x; y_ = y; } void setTitle(const char *title) { title_ = title; } void create(){;} }; // Базове використання int main(int argc, char **argv) { GlutApp app(argc, argv); app.setDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_ALPHA|GLUT_DEPTH); app.setWindowSize(500, 500); app.setWindowPosition(200, 200); app.setTitle("My OpenGL/GLUT App"); app.create(); } // "fluent interface" обгортка class FluentGlutApp : private GlutApp { public: FluentGlutApp(int argc, char **argv) : GlutApp(argc, argv) {} FluentGlutApp &withDoubleBuffer() { setDisplayMode(getDisplayMode() | GLUT_DOUBLE); return *this; } FluentGlutApp &withRGBA() { setDisplayMode(getDisplayMode() | GLUT_RGBA); return *this; } FluentGlutApp &withAlpha() { setDisplayMode(getDisplayMode() | GLUT_ALPHA); return *this; } FluentGlutApp &withDepth() { setDisplayMode(getDisplayMode() | GLUT_DEPTH); return *this; } FluentGlutApp &across(int w, int h) { setWindowSize(w, h); return *this; } FluentGlutApp &at(int x, int y) { setWindowPosition(x, y); return *this; } FluentGlutApp &named(const char *title) { setTitle(title); return *this; } // Ланцюжок після create() немає змісту, тому не повертаємо *this void create() { GlutApp::create(); } }; // Використання "fluent interface" int main(int argc, char **argv) { FluentGlutApp(argc, argv) .withDoubleBuffer().withRGBA().withAlpha().withDepth() .at(200, 200).across(500, 500) .named("My OpenGL/GLUT App") .create(); }
Python
В мові Python використовують повернення `self` в методі.
class Poem(object): def __init__(self, content): self.content = content def indent(self, spaces): self.content = " " * spaces + self.content return self def suffix(self, content): self.content = self.content + " - " + content return self
>>> Poem("Road Not Travelled").indent(4).suffix("Robert Frost").content ' Road Not Travelled - Robert Frost'
Примітки
- FluentInterface [ 8 березня 2021 у Wayback Machine.], Martin Fowler, 20-12-2005
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Fluent interface bizhuchij chi tekuchij interfejs v programuvanni sposib konstruyuvannya ob yektno oriyentovanogo API v yakomu chitabelnist kodu ye blizkoyu do zvichajnogo prozovogo tekstu Termin vpershe buv zastosovanij Erikom Evansom ta Martinom Faulerom Nizhche podano priklad dlya frejmvorku testuvannya JMock mock expects once method m with or stringContains hello stringContains howdy IstoriyaTermin fluent interface z yavivsya v kinci 2005 hocha podibnij pidhid vikoristovuvavsya v Smalltalk she v 1970 h ta v inshih v 1980 ih Tipovim prikladom ye biblioteka iostream v movi C de vikoristovuyutsya operatori lt lt ta gt gt dlya peredachi povidomlen bagatokratnoyi peresilki danih do odnogo i togo samogo ob yekta PrikladiC Nizhche navedeno priklad de fluent interface obgortka zastosovana poverh bilsh tradicijnogo interfejsu C Priklad na movi S Zvichajne viznachennya class GlutApp private int w h x y argc display mode char argv char title public GlutApp int argc char argv argc argc argv argv void setDisplayMode int mode display mode mode int getDisplayMode return display mode void setWindowSize int w int h w w h h void setWindowPosition int x int y x x y y void setTitle const char title title title void create Bazove vikoristannya int main int argc char argv GlutApp app argc argv app setDisplayMode GLUT DOUBLE GLUT RGBA GLUT ALPHA GLUT DEPTH app setWindowSize 500 500 app setWindowPosition 200 200 app setTitle My OpenGL GLUT App app create fluent interface obgortka class FluentGlutApp private GlutApp public FluentGlutApp int argc char argv GlutApp argc argv FluentGlutApp amp withDoubleBuffer setDisplayMode getDisplayMode GLUT DOUBLE return this FluentGlutApp amp withRGBA setDisplayMode getDisplayMode GLUT RGBA return this FluentGlutApp amp withAlpha setDisplayMode getDisplayMode GLUT ALPHA return this FluentGlutApp amp withDepth setDisplayMode getDisplayMode GLUT DEPTH return this FluentGlutApp amp across int w int h setWindowSize w h return this FluentGlutApp amp at int x int y setWindowPosition x y return this FluentGlutApp amp named const char title setTitle title return this Lancyuzhok pislya create nemaye zmistu tomu ne povertayemo this void create GlutApp create Vikoristannya fluent interface int main int argc char argv FluentGlutApp argc argv withDoubleBuffer withRGBA withAlpha withDepth at 200 200 across 500 500 named My OpenGL GLUT App create Python V movi Python vikoristovuyut povernennya self v metodi Priklad na movi Python class Poem object def init self content self content content def indent self spaces self content spaces self content return self def suffix self content self content self content content return self gt gt gt Poem Road Not Travelled indent 4 suffix Robert Frost content Road Not Travelled Robert Frost PrimitkiFluentInterface 8 bereznya 2021 u Wayback Machine Martin Fowler 20 12 2005