SlideShare a Scribd company logo
ČTVRTKON
FLUENT INTERFACES
PROBLÉM SKLÁDÁNÍ FUNKCÍ A OBJEKTŮ - POSTFIX NOTACE
$json = new ParseJson(

new AssertResponseStatus(

new RequestWithHeader(

new AuthHeader('basic', $username, $password),

new RequestWithMethod(

'GET',

new Request('example.com')

)

),

200

)

).toString();
TEXT
FLUENT INTEFACE
class Request {

// ...

function withMethod($method) {

$this->method = $method;

return $this;

}

// ...

}

TEXT
FLUENT INTEFACE
$json = new Request('example.com')

->withMethod('GET')

->withHeader(new AuthHeader('basic', $username, $password))

->assertResponseStatus(200)

->parseJson()

->toString();

THE API IS PRIMARILY DESIGNED TO BE
READABLE AND TO FLOW. THE PRICE OF THIS
FLUENCY IS MORE EFFORT, BOTH IN THINKING
AND IN THE API CONSTRUCTION ITSELF.
Martin Fowler
TEXT
TEXT
NEVÝHODY FLUENT INTERFACE
‣Špatná rozšiřitelnost
‣Nemožnost spojit do "fluentu" více rozhraní
‣Proxy / dekorátory a "unwrapnutí" $this!
TEXT
UNWRAP
class FluentCounter {

$i = 0;

function inc() {

$this->i++;

return $this;

}

}



class LoggerCounter {

$this->counter = new FluentCounter();

function inc() {

echo "calling incn";

return $this->counter->inc();

}

}



new LoggerCounter(new FluentCounter())->inc()->inc()->inc(); // "calling inc" (jednou)
TEXT
UNWRAP
class FluentCounter {

$i = 0;

function inc() {

$this->i++;

return $this;

}

}



class LoggerCounter {

$this->counter = new FluentCounter();

function inc() {

echo "calling incn";

$this->counter = $this->counter->inc();

return $this;

}

}



new LoggerCounter(new FluentCounter())->inc()->inc()->inc(); // "calling inc" (třikrát)
TEXT
NEŠLO BY PROSTĚ OTOČIT POŘADÍ?
function revert2($fn1, $fn2) {

return function (...$args) use ($fn1, $fn2) {

return $fn2($fn1(...$args));

};

}
function fn1($x) {

return 'fn1(' . $x . ')';

}



function fn2($x) {

return 'fn2(' . $x . ')';

}



echo revert2('fn1', 'fn2')('x'); // 'fn2(fn1(x))'
TEXT
JAK TO UDĚLAT PRO N FUNKCÍ?
TEXT
JAK TO UDĚLAT PRO N FUNKCÍ?
function revert2($fn1, $fn2) {

return function (...$args) use ($fn1, $fn2) {

return $fn2($fn1(...$args));

};

}
function revert($f1, ...$fns) {

return array_reduce($fns, 'revert2', $f1);

}
// final version:
function revert($f1, ...$fns) {

return array_reduce($fns, function ($fn1, $fn2) {

return function (...$args) use ($fn1, $fn2) { return $fn2($fn1(...$args)); };

}, $f1);

}
REVERT = PIPE OPERÁTOR
TEXT
POUŽITÍ
$json = pipe(

new Request('example.com'),

new WithMethod('GET'),

new WithHeader(new AuthHeader('basic', $username, $password),

new AssertResponseStatus(200),

new ParseJson(),

)->toString();
// s pipe operátorem:
$json = new Request('example.com')

|> new WithMethod($$, 'GET'),

|> new WithHeader(new AuthHeader('basic', $username, $password), $$),

|> new AssertResponseStatus($$, 200),

|> new ParseJson(),

|> toString();
TEXT
PIPE OPERÁTOR V OSTATNÍCH JAZYCÍCH
▸ PHP: https://wiki.php.net/rfc/pipe-operator
▸ javascript: https://github.com/tc39/proposal-pipeline-
operator
▸ C#: https://github.com/dotnet/csharplang/issues/96
▸ ...
DÍKY ZA POZORNOST

More Related Content

What's hot

Bag of tricks
Bag of tricksBag of tricks
Bag of tricks
brian d foy
 
PHP for Adults: Clean Code and Object Calisthenics
PHP for Adults: Clean Code and Object CalisthenicsPHP for Adults: Clean Code and Object Calisthenics
PHP for Adults: Clean Code and Object Calisthenics
Guilherme Blanco
 
Perl Bag of Tricks - Baltimore Perl mongers
Perl Bag of Tricks  -  Baltimore Perl mongersPerl Bag of Tricks  -  Baltimore Perl mongers
Perl Bag of Tricks - Baltimore Perl mongers
brian d foy
 
Oops in php
Oops in phpOops in php
Storytelling By Numbers
Storytelling By NumbersStorytelling By Numbers
Storytelling By Numbers
Michael King
 
Table through php
Table through phpTable through php
Table through php
syeda zoya mehdi
 
C A S Sample Php
C A S Sample PhpC A S Sample Php
C A S Sample PhpJH Lee
 
Parsing JSON with a single regex
Parsing JSON with a single regexParsing JSON with a single regex
Parsing JSON with a single regex
brian d foy
 
Melhorando sua API com DSLs
Melhorando sua API com DSLsMelhorando sua API com DSLs
Melhorando sua API com DSLs
Augusto Pascutti
 
The Magic Of Tie
The Magic Of TieThe Magic Of Tie
The Magic Of Tie
brian d foy
 
introduction to Django in five slides
introduction to Django in five slides introduction to Django in five slides
introduction to Django in five slides
Dan Chudnov
 
You code sucks, let's fix it
You code sucks, let's fix itYou code sucks, let's fix it
You code sucks, let's fix it
Rafael Dohms
 
Learning Perl 6 (NPW 2007)
Learning Perl 6 (NPW 2007)Learning Perl 6 (NPW 2007)
Learning Perl 6 (NPW 2007)
brian d foy
 
Functional programming with php7
Functional programming with php7Functional programming with php7
Functional programming with php7
Sérgio Rafael Siqueira
 
Learning Perl 6
Learning Perl 6 Learning Perl 6
Learning Perl 6
brian d foy
 
Refactoring using Codeception
Refactoring using CodeceptionRefactoring using Codeception
Refactoring using Codeception
Jeroen van Dijk
 
Perl6 operators and metaoperators
Perl6   operators and metaoperatorsPerl6   operators and metaoperators
Perl6 operators and metaoperators
Simon Proctor
 

What's hot (20)

Bag of tricks
Bag of tricksBag of tricks
Bag of tricks
 
PHP for Adults: Clean Code and Object Calisthenics
PHP for Adults: Clean Code and Object CalisthenicsPHP for Adults: Clean Code and Object Calisthenics
PHP for Adults: Clean Code and Object Calisthenics
 
Perl Bag of Tricks - Baltimore Perl mongers
Perl Bag of Tricks  -  Baltimore Perl mongersPerl Bag of Tricks  -  Baltimore Perl mongers
Perl Bag of Tricks - Baltimore Perl mongers
 
Feed
FeedFeed
Feed
 
Oops in php
Oops in phpOops in php
Oops in php
 
Storytelling By Numbers
Storytelling By NumbersStorytelling By Numbers
Storytelling By Numbers
 
Table through php
Table through phpTable through php
Table through php
 
C A S Sample Php
C A S Sample PhpC A S Sample Php
C A S Sample Php
 
Parsing JSON with a single regex
Parsing JSON with a single regexParsing JSON with a single regex
Parsing JSON with a single regex
 
Melhorando sua API com DSLs
Melhorando sua API com DSLsMelhorando sua API com DSLs
Melhorando sua API com DSLs
 
Session8
Session8Session8
Session8
 
The Magic Of Tie
The Magic Of TieThe Magic Of Tie
The Magic Of Tie
 
introduction to Django in five slides
introduction to Django in five slides introduction to Django in five slides
introduction to Django in five slides
 
You code sucks, let's fix it
You code sucks, let's fix itYou code sucks, let's fix it
You code sucks, let's fix it
 
Learning Perl 6 (NPW 2007)
Learning Perl 6 (NPW 2007)Learning Perl 6 (NPW 2007)
Learning Perl 6 (NPW 2007)
 
Functional programming with php7
Functional programming with php7Functional programming with php7
Functional programming with php7
 
Learning Perl 6
Learning Perl 6 Learning Perl 6
Learning Perl 6
 
Perl6 grammars
Perl6 grammarsPerl6 grammars
Perl6 grammars
 
Refactoring using Codeception
Refactoring using CodeceptionRefactoring using Codeception
Refactoring using Codeception
 
Perl6 operators and metaoperators
Perl6   operators and metaoperatorsPerl6   operators and metaoperators
Perl6 operators and metaoperators
 

Similar to DEV Čtvrtkon #76 - Fluent Interface

Workshop unittesting
Workshop unittestingWorkshop unittesting
Workshop unittesting
Joshua Thijssen
 
Unit testing with zend framework tek11
Unit testing with zend framework tek11Unit testing with zend framework tek11
Unit testing with zend framework tek11
Michelangelo van Dam
 
Unit testing with zend framework PHPBenelux
Unit testing with zend framework PHPBeneluxUnit testing with zend framework PHPBenelux
Unit testing with zend framework PHPBenelux
Michelangelo van Dam
 
Min-Maxing Software Costs
Min-Maxing Software CostsMin-Maxing Software Costs
Min-Maxing Software Costs
Konstantin Kudryashov
 
Silex meets SOAP & REST
Silex meets SOAP & RESTSilex meets SOAP & REST
Silex meets SOAP & REST
Hugo Hamon
 
Advanced php testing in action
Advanced php testing in actionAdvanced php testing in action
Advanced php testing in action
Jace Ju
 
Unit testing zend framework apps
Unit testing zend framework appsUnit testing zend framework apps
Unit testing zend framework apps
Michelangelo van Dam
 
WordPress REST API hacking
WordPress REST API hackingWordPress REST API hacking
WordPress REST API hacking
Jeroen van Dijk
 
Object Calisthenics Applied to PHP
Object Calisthenics Applied to PHPObject Calisthenics Applied to PHP
Object Calisthenics Applied to PHP
Guilherme Blanco
 
Simplify AJAX using jQuery
Simplify AJAX using jQuerySimplify AJAX using jQuery
Simplify AJAX using jQuerySiva Arunachalam
 
Presentation1
Presentation1Presentation1
Presentation1
Rahadyan Gusti
 
PHP Conference Asia 2016
PHP Conference Asia 2016PHP Conference Asia 2016
PHP Conference Asia 2016
Britta Alex
 
PHPUnit elevato alla Symfony2
PHPUnit elevato alla Symfony2PHPUnit elevato alla Symfony2
PHPUnit elevato alla Symfony2
eugenio pombi
 
WordPress REST API hacking
WordPress REST API hackingWordPress REST API hacking
WordPress REST API hacking
Jeroen van Dijk
 
PhpUnit - The most unknown Parts
PhpUnit - The most unknown PartsPhpUnit - The most unknown Parts
PhpUnit - The most unknown Parts
Bastian Feder
 
Leveraging Symfony2 Forms
Leveraging Symfony2 FormsLeveraging Symfony2 Forms
Leveraging Symfony2 Forms
Bernhard Schussek
 
Make WordPress realtime.
Make WordPress realtime.Make WordPress realtime.
Make WordPress realtime.
Josh Hillier
 
Crafting beautiful software
Crafting beautiful softwareCrafting beautiful software
Crafting beautiful software
Jorn Oomen
 

Similar to DEV Čtvrtkon #76 - Fluent Interface (20)

Jquery ajax & form
Jquery ajax & formJquery ajax & form
Jquery ajax & form
 
Intoduction to php restful web service
Intoduction to php  restful web serviceIntoduction to php  restful web service
Intoduction to php restful web service
 
Workshop unittesting
Workshop unittestingWorkshop unittesting
Workshop unittesting
 
Unit testing with zend framework tek11
Unit testing with zend framework tek11Unit testing with zend framework tek11
Unit testing with zend framework tek11
 
Unit testing with zend framework PHPBenelux
Unit testing with zend framework PHPBeneluxUnit testing with zend framework PHPBenelux
Unit testing with zend framework PHPBenelux
 
Min-Maxing Software Costs
Min-Maxing Software CostsMin-Maxing Software Costs
Min-Maxing Software Costs
 
Silex meets SOAP & REST
Silex meets SOAP & RESTSilex meets SOAP & REST
Silex meets SOAP & REST
 
Advanced php testing in action
Advanced php testing in actionAdvanced php testing in action
Advanced php testing in action
 
Unit testing zend framework apps
Unit testing zend framework appsUnit testing zend framework apps
Unit testing zend framework apps
 
WordPress REST API hacking
WordPress REST API hackingWordPress REST API hacking
WordPress REST API hacking
 
Object Calisthenics Applied to PHP
Object Calisthenics Applied to PHPObject Calisthenics Applied to PHP
Object Calisthenics Applied to PHP
 
Simplify AJAX using jQuery
Simplify AJAX using jQuerySimplify AJAX using jQuery
Simplify AJAX using jQuery
 
Presentation1
Presentation1Presentation1
Presentation1
 
PHP Conference Asia 2016
PHP Conference Asia 2016PHP Conference Asia 2016
PHP Conference Asia 2016
 
PHPUnit elevato alla Symfony2
PHPUnit elevato alla Symfony2PHPUnit elevato alla Symfony2
PHPUnit elevato alla Symfony2
 
WordPress REST API hacking
WordPress REST API hackingWordPress REST API hacking
WordPress REST API hacking
 
PhpUnit - The most unknown Parts
PhpUnit - The most unknown PartsPhpUnit - The most unknown Parts
PhpUnit - The most unknown Parts
 
Leveraging Symfony2 Forms
Leveraging Symfony2 FormsLeveraging Symfony2 Forms
Leveraging Symfony2 Forms
 
Make WordPress realtime.
Make WordPress realtime.Make WordPress realtime.
Make WordPress realtime.
 
Crafting beautiful software
Crafting beautiful softwareCrafting beautiful software
Crafting beautiful software
 

More from Ctvrtkoncz

DEV Čtvrtkon #107 - Štefan Földesi
DEV Čtvrtkon #107 - Štefan FöldesiDEV Čtvrtkon #107 - Štefan Földesi
DEV Čtvrtkon #107 - Štefan Földesi
Ctvrtkoncz
 
#85 Čtvrtkon - Obsahové UX - Milan Pichlík
#85 Čtvrtkon - Obsahové UX - Milan Pichlík#85 Čtvrtkon - Obsahové UX - Milan Pichlík
#85 Čtvrtkon - Obsahové UX - Milan Pichlík
Ctvrtkoncz
 
DEV Čtvrtkon #76 - Open API
DEV Čtvrtkon #76 - Open APIDEV Čtvrtkon #76 - Open API
DEV Čtvrtkon #76 - Open API
Ctvrtkoncz
 
DEV Čtvrtkon #76 - Makefile
DEV Čtvrtkon #76 - MakefileDEV Čtvrtkon #76 - Makefile
DEV Čtvrtkon #76 - Makefile
Ctvrtkoncz
 
DEV Čtvrtkon #76 - nopCommerce
DEV Čtvrtkon #76 - nopCommerceDEV Čtvrtkon #76 - nopCommerce
DEV Čtvrtkon #76 - nopCommerce
Ctvrtkoncz
 
DEV Čtvrtkon #76 - Nachytřená domácnost
DEV Čtvrtkon #76 - Nachytřená domácnostDEV Čtvrtkon #76 - Nachytřená domácnost
DEV Čtvrtkon #76 - Nachytřená domácnost
Ctvrtkoncz
 
DEV Čtvrtkon #76 - How to build an evil-free social network: Behind the wheels
DEV Čtvrtkon #76 - How to build an evil-free social network: Behind the wheelsDEV Čtvrtkon #76 - How to build an evil-free social network: Behind the wheels
DEV Čtvrtkon #76 - How to build an evil-free social network: Behind the wheels
Ctvrtkoncz
 
Čtvrtkon: Podle jakých kritérií vybrat e-shopové řešení
Čtvrtkon: Podle jakých kritérií vybrat e-shopové řešeníČtvrtkon: Podle jakých kritérií vybrat e-shopové řešení
Čtvrtkon: Podle jakých kritérií vybrat e-shopové řešení
Ctvrtkoncz
 
Čtvrtkon #71 - Jan Kaštánek - Java & Docker & Microsevices
Čtvrtkon #71 - Jan Kaštánek - Java & Docker & MicrosevicesČtvrtkon #71 - Jan Kaštánek - Java & Docker & Microsevices
Čtvrtkon #71 - Jan Kaštánek - Java & Docker & Microsevices
Ctvrtkoncz
 
Čtvrtkon #71 - Marian Benčat - Angular a NativeScript
Čtvrtkon #71 - Marian Benčat - Angular a NativeScriptČtvrtkon #71 - Marian Benčat - Angular a NativeScript
Čtvrtkon #71 - Marian Benčat - Angular a NativeScript
Ctvrtkoncz
 
Čtvrtkon #64 - AWS Serverless - Michal Haták
Čtvrtkon #64 - AWS Serverless - Michal HatákČtvrtkon #64 - AWS Serverless - Michal Haták
Čtvrtkon #64 - AWS Serverless - Michal Haták
Ctvrtkoncz
 
Jak nakrmit Facebook firemní stránku a Instagram obsahem, co její fanoušci do...
Jak nakrmit Facebook firemní stránku a Instagram obsahem, co její fanoušci do...Jak nakrmit Facebook firemní stránku a Instagram obsahem, co její fanoušci do...
Jak nakrmit Facebook firemní stránku a Instagram obsahem, co její fanoušci do...
Ctvrtkoncz
 
Pravdy a lži o reklamě na Facebooku - Lukáš Chládek
Pravdy a lži o reklamě na Facebooku - Lukáš ChládekPravdy a lži o reklamě na Facebooku - Lukáš Chládek
Pravdy a lži o reklamě na Facebooku - Lukáš Chládek
Ctvrtkoncz
 
Vilibald Wanča - Api design-lifecycle
Vilibald Wanča - Api design-lifecycleVilibald Wanča - Api design-lifecycle
Vilibald Wanča - Api design-lifecycle
Ctvrtkoncz
 
Jan Kaštánek - Od webových aplikací k Androidu
Jan Kaštánek - Od webových aplikací k AndroiduJan Kaštánek - Od webových aplikací k Androidu
Jan Kaštánek - Od webových aplikací k Androidu
Ctvrtkoncz
 
Propagace eshopu v praxi - Čtvrtkon
Propagace eshopu v praxi - ČtvrtkonPropagace eshopu v praxi - Čtvrtkon
Propagace eshopu v praxi - Čtvrtkon
Ctvrtkoncz
 

More from Ctvrtkoncz (16)

DEV Čtvrtkon #107 - Štefan Földesi
DEV Čtvrtkon #107 - Štefan FöldesiDEV Čtvrtkon #107 - Štefan Földesi
DEV Čtvrtkon #107 - Štefan Földesi
 
#85 Čtvrtkon - Obsahové UX - Milan Pichlík
#85 Čtvrtkon - Obsahové UX - Milan Pichlík#85 Čtvrtkon - Obsahové UX - Milan Pichlík
#85 Čtvrtkon - Obsahové UX - Milan Pichlík
 
DEV Čtvrtkon #76 - Open API
DEV Čtvrtkon #76 - Open APIDEV Čtvrtkon #76 - Open API
DEV Čtvrtkon #76 - Open API
 
DEV Čtvrtkon #76 - Makefile
DEV Čtvrtkon #76 - MakefileDEV Čtvrtkon #76 - Makefile
DEV Čtvrtkon #76 - Makefile
 
DEV Čtvrtkon #76 - nopCommerce
DEV Čtvrtkon #76 - nopCommerceDEV Čtvrtkon #76 - nopCommerce
DEV Čtvrtkon #76 - nopCommerce
 
DEV Čtvrtkon #76 - Nachytřená domácnost
DEV Čtvrtkon #76 - Nachytřená domácnostDEV Čtvrtkon #76 - Nachytřená domácnost
DEV Čtvrtkon #76 - Nachytřená domácnost
 
DEV Čtvrtkon #76 - How to build an evil-free social network: Behind the wheels
DEV Čtvrtkon #76 - How to build an evil-free social network: Behind the wheelsDEV Čtvrtkon #76 - How to build an evil-free social network: Behind the wheels
DEV Čtvrtkon #76 - How to build an evil-free social network: Behind the wheels
 
Čtvrtkon: Podle jakých kritérií vybrat e-shopové řešení
Čtvrtkon: Podle jakých kritérií vybrat e-shopové řešeníČtvrtkon: Podle jakých kritérií vybrat e-shopové řešení
Čtvrtkon: Podle jakých kritérií vybrat e-shopové řešení
 
Čtvrtkon #71 - Jan Kaštánek - Java & Docker & Microsevices
Čtvrtkon #71 - Jan Kaštánek - Java & Docker & MicrosevicesČtvrtkon #71 - Jan Kaštánek - Java & Docker & Microsevices
Čtvrtkon #71 - Jan Kaštánek - Java & Docker & Microsevices
 
Čtvrtkon #71 - Marian Benčat - Angular a NativeScript
Čtvrtkon #71 - Marian Benčat - Angular a NativeScriptČtvrtkon #71 - Marian Benčat - Angular a NativeScript
Čtvrtkon #71 - Marian Benčat - Angular a NativeScript
 
Čtvrtkon #64 - AWS Serverless - Michal Haták
Čtvrtkon #64 - AWS Serverless - Michal HatákČtvrtkon #64 - AWS Serverless - Michal Haták
Čtvrtkon #64 - AWS Serverless - Michal Haták
 
Jak nakrmit Facebook firemní stránku a Instagram obsahem, co její fanoušci do...
Jak nakrmit Facebook firemní stránku a Instagram obsahem, co její fanoušci do...Jak nakrmit Facebook firemní stránku a Instagram obsahem, co její fanoušci do...
Jak nakrmit Facebook firemní stránku a Instagram obsahem, co její fanoušci do...
 
Pravdy a lži o reklamě na Facebooku - Lukáš Chládek
Pravdy a lži o reklamě na Facebooku - Lukáš ChládekPravdy a lži o reklamě na Facebooku - Lukáš Chládek
Pravdy a lži o reklamě na Facebooku - Lukáš Chládek
 
Vilibald Wanča - Api design-lifecycle
Vilibald Wanča - Api design-lifecycleVilibald Wanča - Api design-lifecycle
Vilibald Wanča - Api design-lifecycle
 
Jan Kaštánek - Od webových aplikací k Androidu
Jan Kaštánek - Od webových aplikací k AndroiduJan Kaštánek - Od webových aplikací k Androidu
Jan Kaštánek - Od webových aplikací k Androidu
 
Propagace eshopu v praxi - Čtvrtkon
Propagace eshopu v praxi - ČtvrtkonPropagace eshopu v praxi - Čtvrtkon
Propagace eshopu v praxi - Čtvrtkon
 

Recently uploaded

Internet of Things in Manufacturing: Revolutionizing Efficiency & Quality | C...
Internet of Things in Manufacturing: Revolutionizing Efficiency & Quality | C...Internet of Things in Manufacturing: Revolutionizing Efficiency & Quality | C...
Internet of Things in Manufacturing: Revolutionizing Efficiency & Quality | C...
CIOWomenMagazine
 
test test test test testtest test testtest test testtest test testtest test ...
test test  test test testtest test testtest test testtest test testtest test ...test test  test test testtest test testtest test testtest test testtest test ...
test test test test testtest test testtest test testtest test testtest test ...
Arif0071
 
Gen Z and the marketplaces - let's translate their needs
Gen Z and the marketplaces - let's translate their needsGen Z and the marketplaces - let's translate their needs
Gen Z and the marketplaces - let's translate their needs
Laura Szabó
 
APNIC Foundation, presented by Ellisha Heppner at the PNG DNS Forum 2024
APNIC Foundation, presented by Ellisha Heppner at the PNG DNS Forum 2024APNIC Foundation, presented by Ellisha Heppner at the PNG DNS Forum 2024
APNIC Foundation, presented by Ellisha Heppner at the PNG DNS Forum 2024
APNIC
 
假文凭国外(Adelaide毕业证)澳大利亚国立大学毕业证成绩单办理
假文凭国外(Adelaide毕业证)澳大利亚国立大学毕业证成绩单办理假文凭国外(Adelaide毕业证)澳大利亚国立大学毕业证成绩单办理
假文凭国外(Adelaide毕业证)澳大利亚国立大学毕业证成绩单办理
cuobya
 
1比1复刻(bath毕业证书)英国巴斯大学毕业证学位证原版一模一样
1比1复刻(bath毕业证书)英国巴斯大学毕业证学位证原版一模一样1比1复刻(bath毕业证书)英国巴斯大学毕业证学位证原版一模一样
1比1复刻(bath毕业证书)英国巴斯大学毕业证学位证原版一模一样
3ipehhoa
 
存档可查的(USC毕业证)南加利福尼亚大学毕业证成绩单制做办理
存档可查的(USC毕业证)南加利福尼亚大学毕业证成绩单制做办理存档可查的(USC毕业证)南加利福尼亚大学毕业证成绩单制做办理
存档可查的(USC毕业证)南加利福尼亚大学毕业证成绩单制做办理
fovkoyb
 
一比一原版(SLU毕业证)圣路易斯大学毕业证成绩单专业办理
一比一原版(SLU毕业证)圣路易斯大学毕业证成绩单专业办理一比一原版(SLU毕业证)圣路易斯大学毕业证成绩单专业办理
一比一原版(SLU毕业证)圣路易斯大学毕业证成绩单专业办理
keoku
 
一比一原版(LBS毕业证)伦敦商学院毕业证成绩单专业办理
一比一原版(LBS毕业证)伦敦商学院毕业证成绩单专业办理一比一原版(LBS毕业证)伦敦商学院毕业证成绩单专业办理
一比一原版(LBS毕业证)伦敦商学院毕业证成绩单专业办理
eutxy
 
可查真实(Monash毕业证)西澳大学毕业证成绩单退学买
可查真实(Monash毕业证)西澳大学毕业证成绩单退学买可查真实(Monash毕业证)西澳大学毕业证成绩单退学买
可查真实(Monash毕业证)西澳大学毕业证成绩单退学买
cuobya
 
国外证书(Lincoln毕业证)新西兰林肯大学毕业证成绩单不能毕业办理
国外证书(Lincoln毕业证)新西兰林肯大学毕业证成绩单不能毕业办理国外证书(Lincoln毕业证)新西兰林肯大学毕业证成绩单不能毕业办理
国外证书(Lincoln毕业证)新西兰林肯大学毕业证成绩单不能毕业办理
zoowe
 
7 Best Cloud Hosting Services to Try Out in 2024
7 Best Cloud Hosting Services to Try Out in 20247 Best Cloud Hosting Services to Try Out in 2024
7 Best Cloud Hosting Services to Try Out in 2024
Danica Gill
 
原版仿制(uob毕业证书)英国伯明翰大学毕业证本科学历证书原版一模一样
原版仿制(uob毕业证书)英国伯明翰大学毕业证本科学历证书原版一模一样原版仿制(uob毕业证书)英国伯明翰大学毕业证本科学历证书原版一模一样
原版仿制(uob毕业证书)英国伯明翰大学毕业证本科学历证书原版一模一样
3ipehhoa
 
学位认证网(DU毕业证)迪肯大学毕业证成绩单一比一原版制作
学位认证网(DU毕业证)迪肯大学毕业证成绩单一比一原版制作学位认证网(DU毕业证)迪肯大学毕业证成绩单一比一原版制作
学位认证网(DU毕业证)迪肯大学毕业证成绩单一比一原版制作
zyfovom
 
一比一原版(CSU毕业证)加利福尼亚州立大学毕业证成绩单专业办理
一比一原版(CSU毕业证)加利福尼亚州立大学毕业证成绩单专业办理一比一原版(CSU毕业证)加利福尼亚州立大学毕业证成绩单专业办理
一比一原版(CSU毕业证)加利福尼亚州立大学毕业证成绩单专业办理
ufdana
 
成绩单ps(UST毕业证)圣托马斯大学毕业证成绩单快速办理
成绩单ps(UST毕业证)圣托马斯大学毕业证成绩单快速办理成绩单ps(UST毕业证)圣托马斯大学毕业证成绩单快速办理
成绩单ps(UST毕业证)圣托马斯大学毕业证成绩单快速办理
ysasp1
 
急速办(bedfordhire毕业证书)英国贝德福特大学毕业证成绩单原版一模一样
急速办(bedfordhire毕业证书)英国贝德福特大学毕业证成绩单原版一模一样急速办(bedfordhire毕业证书)英国贝德福特大学毕业证成绩单原版一模一样
急速办(bedfordhire毕业证书)英国贝德福特大学毕业证成绩单原版一模一样
3ipehhoa
 
Bài tập unit 1 English in the world.docx
Bài tập unit 1 English in the world.docxBài tập unit 1 English in the world.docx
Bài tập unit 1 English in the world.docx
nhiyenphan2005
 
Understanding User Behavior with Google Analytics.pdf
Understanding User Behavior with Google Analytics.pdfUnderstanding User Behavior with Google Analytics.pdf
Understanding User Behavior with Google Analytics.pdf
SEO Article Boost
 
制作毕业证书(ANU毕业证)莫纳什大学毕业证成绩单官方原版办理
制作毕业证书(ANU毕业证)莫纳什大学毕业证成绩单官方原版办理制作毕业证书(ANU毕业证)莫纳什大学毕业证成绩单官方原版办理
制作毕业证书(ANU毕业证)莫纳什大学毕业证成绩单官方原版办理
cuobya
 

Recently uploaded (20)

Internet of Things in Manufacturing: Revolutionizing Efficiency & Quality | C...
Internet of Things in Manufacturing: Revolutionizing Efficiency & Quality | C...Internet of Things in Manufacturing: Revolutionizing Efficiency & Quality | C...
Internet of Things in Manufacturing: Revolutionizing Efficiency & Quality | C...
 
test test test test testtest test testtest test testtest test testtest test ...
test test  test test testtest test testtest test testtest test testtest test ...test test  test test testtest test testtest test testtest test testtest test ...
test test test test testtest test testtest test testtest test testtest test ...
 
Gen Z and the marketplaces - let's translate their needs
Gen Z and the marketplaces - let's translate their needsGen Z and the marketplaces - let's translate their needs
Gen Z and the marketplaces - let's translate their needs
 
APNIC Foundation, presented by Ellisha Heppner at the PNG DNS Forum 2024
APNIC Foundation, presented by Ellisha Heppner at the PNG DNS Forum 2024APNIC Foundation, presented by Ellisha Heppner at the PNG DNS Forum 2024
APNIC Foundation, presented by Ellisha Heppner at the PNG DNS Forum 2024
 
假文凭国外(Adelaide毕业证)澳大利亚国立大学毕业证成绩单办理
假文凭国外(Adelaide毕业证)澳大利亚国立大学毕业证成绩单办理假文凭国外(Adelaide毕业证)澳大利亚国立大学毕业证成绩单办理
假文凭国外(Adelaide毕业证)澳大利亚国立大学毕业证成绩单办理
 
1比1复刻(bath毕业证书)英国巴斯大学毕业证学位证原版一模一样
1比1复刻(bath毕业证书)英国巴斯大学毕业证学位证原版一模一样1比1复刻(bath毕业证书)英国巴斯大学毕业证学位证原版一模一样
1比1复刻(bath毕业证书)英国巴斯大学毕业证学位证原版一模一样
 
存档可查的(USC毕业证)南加利福尼亚大学毕业证成绩单制做办理
存档可查的(USC毕业证)南加利福尼亚大学毕业证成绩单制做办理存档可查的(USC毕业证)南加利福尼亚大学毕业证成绩单制做办理
存档可查的(USC毕业证)南加利福尼亚大学毕业证成绩单制做办理
 
一比一原版(SLU毕业证)圣路易斯大学毕业证成绩单专业办理
一比一原版(SLU毕业证)圣路易斯大学毕业证成绩单专业办理一比一原版(SLU毕业证)圣路易斯大学毕业证成绩单专业办理
一比一原版(SLU毕业证)圣路易斯大学毕业证成绩单专业办理
 
一比一原版(LBS毕业证)伦敦商学院毕业证成绩单专业办理
一比一原版(LBS毕业证)伦敦商学院毕业证成绩单专业办理一比一原版(LBS毕业证)伦敦商学院毕业证成绩单专业办理
一比一原版(LBS毕业证)伦敦商学院毕业证成绩单专业办理
 
可查真实(Monash毕业证)西澳大学毕业证成绩单退学买
可查真实(Monash毕业证)西澳大学毕业证成绩单退学买可查真实(Monash毕业证)西澳大学毕业证成绩单退学买
可查真实(Monash毕业证)西澳大学毕业证成绩单退学买
 
国外证书(Lincoln毕业证)新西兰林肯大学毕业证成绩单不能毕业办理
国外证书(Lincoln毕业证)新西兰林肯大学毕业证成绩单不能毕业办理国外证书(Lincoln毕业证)新西兰林肯大学毕业证成绩单不能毕业办理
国外证书(Lincoln毕业证)新西兰林肯大学毕业证成绩单不能毕业办理
 
7 Best Cloud Hosting Services to Try Out in 2024
7 Best Cloud Hosting Services to Try Out in 20247 Best Cloud Hosting Services to Try Out in 2024
7 Best Cloud Hosting Services to Try Out in 2024
 
原版仿制(uob毕业证书)英国伯明翰大学毕业证本科学历证书原版一模一样
原版仿制(uob毕业证书)英国伯明翰大学毕业证本科学历证书原版一模一样原版仿制(uob毕业证书)英国伯明翰大学毕业证本科学历证书原版一模一样
原版仿制(uob毕业证书)英国伯明翰大学毕业证本科学历证书原版一模一样
 
学位认证网(DU毕业证)迪肯大学毕业证成绩单一比一原版制作
学位认证网(DU毕业证)迪肯大学毕业证成绩单一比一原版制作学位认证网(DU毕业证)迪肯大学毕业证成绩单一比一原版制作
学位认证网(DU毕业证)迪肯大学毕业证成绩单一比一原版制作
 
一比一原版(CSU毕业证)加利福尼亚州立大学毕业证成绩单专业办理
一比一原版(CSU毕业证)加利福尼亚州立大学毕业证成绩单专业办理一比一原版(CSU毕业证)加利福尼亚州立大学毕业证成绩单专业办理
一比一原版(CSU毕业证)加利福尼亚州立大学毕业证成绩单专业办理
 
成绩单ps(UST毕业证)圣托马斯大学毕业证成绩单快速办理
成绩单ps(UST毕业证)圣托马斯大学毕业证成绩单快速办理成绩单ps(UST毕业证)圣托马斯大学毕业证成绩单快速办理
成绩单ps(UST毕业证)圣托马斯大学毕业证成绩单快速办理
 
急速办(bedfordhire毕业证书)英国贝德福特大学毕业证成绩单原版一模一样
急速办(bedfordhire毕业证书)英国贝德福特大学毕业证成绩单原版一模一样急速办(bedfordhire毕业证书)英国贝德福特大学毕业证成绩单原版一模一样
急速办(bedfordhire毕业证书)英国贝德福特大学毕业证成绩单原版一模一样
 
Bài tập unit 1 English in the world.docx
Bài tập unit 1 English in the world.docxBài tập unit 1 English in the world.docx
Bài tập unit 1 English in the world.docx
 
Understanding User Behavior with Google Analytics.pdf
Understanding User Behavior with Google Analytics.pdfUnderstanding User Behavior with Google Analytics.pdf
Understanding User Behavior with Google Analytics.pdf
 
制作毕业证书(ANU毕业证)莫纳什大学毕业证成绩单官方原版办理
制作毕业证书(ANU毕业证)莫纳什大学毕业证成绩单官方原版办理制作毕业证书(ANU毕业证)莫纳什大学毕业证成绩单官方原版办理
制作毕业证书(ANU毕业证)莫纳什大学毕业证成绩单官方原版办理
 

DEV Čtvrtkon #76 - Fluent Interface

  • 2. PROBLÉM SKLÁDÁNÍ FUNKCÍ A OBJEKTŮ - POSTFIX NOTACE $json = new ParseJson(
 new AssertResponseStatus(
 new RequestWithHeader(
 new AuthHeader('basic', $username, $password),
 new RequestWithMethod(
 'GET',
 new Request('example.com')
 )
 ),
 200
 )
 ).toString();
  • 3. TEXT FLUENT INTEFACE class Request {
 // ...
 function withMethod($method) {
 $this->method = $method;
 return $this;
 }
 // ...
 }

  • 4. TEXT FLUENT INTEFACE $json = new Request('example.com')
 ->withMethod('GET')
 ->withHeader(new AuthHeader('basic', $username, $password))
 ->assertResponseStatus(200)
 ->parseJson()
 ->toString();

  • 5. THE API IS PRIMARILY DESIGNED TO BE READABLE AND TO FLOW. THE PRICE OF THIS FLUENCY IS MORE EFFORT, BOTH IN THINKING AND IN THE API CONSTRUCTION ITSELF. Martin Fowler TEXT
  • 6. TEXT NEVÝHODY FLUENT INTERFACE ‣Špatná rozšiřitelnost ‣Nemožnost spojit do "fluentu" více rozhraní ‣Proxy / dekorátory a "unwrapnutí" $this!
  • 7. TEXT UNWRAP class FluentCounter {
 $i = 0;
 function inc() {
 $this->i++;
 return $this;
 }
 }
 
 class LoggerCounter {
 $this->counter = new FluentCounter();
 function inc() {
 echo "calling incn";
 return $this->counter->inc();
 }
 }
 
 new LoggerCounter(new FluentCounter())->inc()->inc()->inc(); // "calling inc" (jednou)
  • 8. TEXT UNWRAP class FluentCounter {
 $i = 0;
 function inc() {
 $this->i++;
 return $this;
 }
 }
 
 class LoggerCounter {
 $this->counter = new FluentCounter();
 function inc() {
 echo "calling incn";
 $this->counter = $this->counter->inc();
 return $this;
 }
 }
 
 new LoggerCounter(new FluentCounter())->inc()->inc()->inc(); // "calling inc" (třikrát)
  • 9. TEXT NEŠLO BY PROSTĚ OTOČIT POŘADÍ? function revert2($fn1, $fn2) {
 return function (...$args) use ($fn1, $fn2) {
 return $fn2($fn1(...$args));
 };
 } function fn1($x) {
 return 'fn1(' . $x . ')';
 }
 
 function fn2($x) {
 return 'fn2(' . $x . ')';
 }
 
 echo revert2('fn1', 'fn2')('x'); // 'fn2(fn1(x))'
  • 10. TEXT JAK TO UDĚLAT PRO N FUNKCÍ?
  • 11. TEXT JAK TO UDĚLAT PRO N FUNKCÍ? function revert2($fn1, $fn2) {
 return function (...$args) use ($fn1, $fn2) {
 return $fn2($fn1(...$args));
 };
 } function revert($f1, ...$fns) {
 return array_reduce($fns, 'revert2', $f1);
 } // final version: function revert($f1, ...$fns) {
 return array_reduce($fns, function ($fn1, $fn2) {
 return function (...$args) use ($fn1, $fn2) { return $fn2($fn1(...$args)); };
 }, $f1);
 }
  • 12. REVERT = PIPE OPERÁTOR
  • 13. TEXT POUŽITÍ $json = pipe(
 new Request('example.com'),
 new WithMethod('GET'),
 new WithHeader(new AuthHeader('basic', $username, $password),
 new AssertResponseStatus(200),
 new ParseJson(),
 )->toString(); // s pipe operátorem: $json = new Request('example.com')
 |> new WithMethod($$, 'GET'),
 |> new WithHeader(new AuthHeader('basic', $username, $password), $$),
 |> new AssertResponseStatus($$, 200),
 |> new ParseJson(),
 |> toString();
  • 14. TEXT PIPE OPERÁTOR V OSTATNÍCH JAZYCÍCH ▸ PHP: https://wiki.php.net/rfc/pipe-operator ▸ javascript: https://github.com/tc39/proposal-pipeline- operator ▸ C#: https://github.com/dotnet/csharplang/issues/96 ▸ ...