From ea85485b85a4fba39ca788f6bec74342f2a78087 Mon Sep 17 00:00:00 2001 From: Dominik Liebler Date: Thu, 14 Jun 2018 22:17:14 +0200 Subject: [PATCH] Refactored example of Proxy pattern --- Structural/Proxy/BankAccount.php | 10 + Structural/Proxy/BankAccountProxy.php | 24 ++ Structural/Proxy/HeavyBankAccount.php | 25 ++ Structural/Proxy/README.rst | 14 +- Structural/Proxy/Record.php | 40 --- Structural/Proxy/RecordProxy.php | 49 ---- Structural/Proxy/Tests/ProxyTest.php | 21 +- Structural/Proxy/uml/Proxy.uml | 71 +++-- Structural/Proxy/uml/uml.png | Bin 7509 -> 36001 bytes Structural/Proxy/uml/uml.svg | 356 ++++++-------------------- 10 files changed, 197 insertions(+), 413 deletions(-) create mode 100644 Structural/Proxy/BankAccount.php create mode 100644 Structural/Proxy/BankAccountProxy.php create mode 100644 Structural/Proxy/HeavyBankAccount.php delete mode 100644 Structural/Proxy/Record.php delete mode 100644 Structural/Proxy/RecordProxy.php diff --git a/Structural/Proxy/BankAccount.php b/Structural/Proxy/BankAccount.php new file mode 100644 index 0000000..84fab34 --- /dev/null +++ b/Structural/Proxy/BankAccount.php @@ -0,0 +1,10 @@ +balance === null) { + $this->balance = parent::getBalance(); + } + + return $this->balance; + } +} diff --git a/Structural/Proxy/HeavyBankAccount.php b/Structural/Proxy/HeavyBankAccount.php new file mode 100644 index 0000000..7fd8c17 --- /dev/null +++ b/Structural/Proxy/HeavyBankAccount.php @@ -0,0 +1,25 @@ +transactions[] = $amount; + } + + public function getBalance(): int + { + // this is the heavy part, imagine all the transactions even from + // years and decades ago must be fetched from a database or web service + // and the balance must be calculated from it + + return array_sum($this->transactions); + } +} diff --git a/Structural/Proxy/README.rst b/Structural/Proxy/README.rst index 554a0fc..4b3e410 100644 --- a/Structural/Proxy/README.rst +++ b/Structural/Proxy/README.rst @@ -25,15 +25,21 @@ Code You can also find this code on `GitHub`_ -Record.php +BankAccount.php -.. literalinclude:: Record.php +.. literalinclude:: BankAccount.php :language: php :linenos: -RecordProxy.php +HeavyBankAccount.php -.. literalinclude:: RecordProxy.php +.. literalinclude:: HeavyBankAccount.php + :language: php + :linenos: + +BankAccountProxy.php + +.. literalinclude:: BankAccountProxy.php :language: php :linenos: diff --git a/Structural/Proxy/Record.php b/Structural/Proxy/Record.php deleted file mode 100644 index ea018b2..0000000 --- a/Structural/Proxy/Record.php +++ /dev/null @@ -1,40 +0,0 @@ -data = $data; - } - - /** - * @param string $name - * @param string $value - */ - public function __set(string $name, string $value) - { - $this->data[$name] = $value; - } - - public function __get(string $name): string - { - if (!isset($this->data[$name])) { - throw new \OutOfRangeException('Invalid name given'); - } - - return $this->data[$name]; - } -} diff --git a/Structural/Proxy/RecordProxy.php b/Structural/Proxy/RecordProxy.php deleted file mode 100644 index 4d29ee8..0000000 --- a/Structural/Proxy/RecordProxy.php +++ /dev/null @@ -1,49 +0,0 @@ - 0) { - $this->isInitialized = true; - $this->isDirty = true; - } - } - - /** - * @param string $name - * @param string $value - */ - public function __set(string $name, string $value) - { - $this->isDirty = true; - - parent::__set($name, $value); - } - - public function isDirty(): bool - { - return $this->isDirty; - } -} diff --git a/Structural/Proxy/Tests/ProxyTest.php b/Structural/Proxy/Tests/ProxyTest.php index f2cf2f4..4e7a4a3 100644 --- a/Structural/Proxy/Tests/ProxyTest.php +++ b/Structural/Proxy/Tests/ProxyTest.php @@ -2,24 +2,23 @@ namespace DesignPatterns\Structural\Proxy\Tests; -use DesignPatterns\Structural\Proxy\RecordProxy; +use DesignPatterns\Structural\Proxy\BankAccountProxy; use PHPUnit\Framework\TestCase; class ProxyTest extends TestCase { - public function testWillSetDirtyFlagInProxy() + public function testProxyWillOnlyExecuteExpensiveGetBalanceOnce() { - $recordProxy = new RecordProxy([]); - $recordProxy->username = 'baz'; + $bankAccount = new BankAccountProxy(); + $bankAccount->deposit(30); - $this->assertTrue($recordProxy->isDirty()); - } + // this time balance is being calculated + $this->assertEquals(0, $bankAccount->getBalance()); - public function testProxyIsInstanceOfRecord() - { - $recordProxy = new RecordProxy([]); - $recordProxy->username = 'baz'; + // inheritance allows for BankAccountProxy to behave to an outsider exactly like ServerBankAccount + $bankAccount->deposit(50); - $this->assertInstanceOf(RecordProxy::class, $recordProxy); + // this time the previously calculated balance is returned again without re-calculating it + $this->assertEquals(0, $bankAccount->getBalance()); } } diff --git a/Structural/Proxy/uml/Proxy.uml b/Structural/Proxy/uml/Proxy.uml index 9b407e1..a66d877 100644 --- a/Structural/Proxy/uml/Proxy.uml +++ b/Structural/Proxy/uml/Proxy.uml @@ -1,28 +1,43 @@ - - - PHP - \DesignPatterns\Structural\Proxy\Record - - \DesignPatterns\Structural\Proxy\Record - \DesignPatterns\Structural\Proxy\RecordProxy - - - - - - - - - - - \DesignPatterns\Structural\Proxy\Record - - - Fields - Constants - Constructors - Methods - - private - - + + + PHP + \DesignPatterns\Structural\Proxy\BankAccount + + \DesignPatterns\Structural\Proxy\BankAccountProxy + \DesignPatterns\Structural\Proxy\HeavyBankAccount + \DesignPatterns\Structural\Proxy\BankAccount + + + + + + + + + + + + + + + + + + + + + + + + + + + + Fields + Constants + Constructors + Methods + + private + + diff --git a/Structural/Proxy/uml/uml.png b/Structural/Proxy/uml/uml.png index 82f548a364897abf7530463465f00f83d9a66d59..ef75cd6344bd3ef2d7dd7bfc3635d9453a877363 100644 GIT binary patch literal 36001 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%0AU2B76^mw9i-#gehf=Tw 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

V zqjwCS?{Vmu{O_yw0$<2&phO$c%9U=={0OMt4(GO1tI?sZnp=7y{eG7_H+9K2yixf1 z^Jacq^&i3K;e_s^^!VI;R8oh|AK2FK9F(f0CeQwutU%>ZvMpNmy2EALvUFa~ULd?a zlv+DLtwctgJggb55jxz^x1qP>_ls|9s$P~ih49FYcA6>bRlU1Xc+s~erVY0K9}QXF z=g2@5UagX|Gs=M1pj2AgO=v2JHi@qj`)w8u`mu1$S6T-)2wOkSpJ&65K3iiW-a)d{ zV!7gD+0fi}!vt@eN`6^b$o*U{Ho?i$;N^3)u<-}1>xLL)e6oaKxhNCbob(JqV}kxn zLi@X0`-h8{STLkeir(6#dyk$00~wFCcj|Efus~b_p}6bN+2X`>^K|aJ$JVGmDX+mc zu}{3xLPNIX`@hB4{B?`W3mw(P`|rD1|3#;P?Ye)B(fy7`{*KrIH^!06UjKPd4A@dY zpb8)gO!Y_*Hvp#T0pAsYeP!eKcSin50Iy-GQ~&?2Q(fN2tY|GZ5L$x?QtIz3Pg}AD z6#x8s22>0~Fs|K8n;rZw*TULf(gRwQe(*(K{gZ17?_SEwU;xAErTq+iPfYmdXEO#0 zr5hJl?9+(>imq9_ZH?6(A_&XI+k@QhZ!N4NYj_ujdBCYnMZeLR?$P^k?CT@fKc=0V zZIU!PICK8}QWzZg|KV2HuSEUQ!q71~2H5rmpr*wKT4E>9xK9W#k`U#Hqn~?JH=ZVW zKkk3_4x$t$n$`7+v&vD8Sw}^Z=Y)LEyRgGB!(4%3jo0LL4FhMCvqj4&UGdB`)mIFF znWQ;(AWeKj08rtj%lbK1d2*D<+`OZH=4jh@{PA_}MU6DL!Wo?x;78KE?+JX(1HriNqdnw#DSyfdIW+JL&iNA|F z+5)gXl`OhLk1~44rMZ)}hmFSiE4V3nL*k-#5`_k)9n5T%KK1c|`5VgXsi`tj>|!#n zDMO;)`J9m=ZzO(^5y4lph2HTd21~ylo#t*@ieJP>m`lq1iDK;YBkNS%sN!gQu!I@7U(^-L?5#g;@isEVUzT$F9JiZm$!Mvc&z(Vi?&-F^+V(XhPvZ* zZ;|IMDaOT&0f8aK<7ydI1FlbFCZKZ1`Uus&rysnR;w5#IR+r4j^|%*KKY1G|ve!p5 z&>@y|d`QZ08K~Mm5*6wcKsNq_v1X0l@J3ZXu_hZL*)zW<(R7F}7GrJZnDkuny!g5P ztFNst{Pp(A3SBlD-0}M8eQZ(q`l>Qyv1UbFFH5?UX>^t=8Hab*yxn3Vj#$%HM9LdW zYo<~J+5CU&jl;4>;4ZIjNS(;&a_&z<$7jvRunDZTqswVPL-V-ll%@)&92ukiwG=f- zefzm7*8n-N6pLw8Y|%jmIT-3DOM4i)8b$}M%qTKakAJK>5_EN)*%_5EfZrA#@$UOJ zQ+s1#6g!)2WFy|UaSoUQ8Inp8%^5G;K&{K0&!|BzYHeze&$U>fgHWZuR-aBfd}VfO zWhk_mn*@2^G=9(a($F-lL%eRh-`Gv2!=BvttO_RNOJjtmMR3L6hQGg#!!3TVR7$Yn zc_;HWh!uH0g3gxw{XCD-aqnf^=T9y$6zSK0ph&%k{(&Oh8&m&q8pmqv;9U9)jeAG< ze^vJuP;oWg+8`20kRX9T6Fj y~yBY22mp;O>&(!9%d%Zo%Dx1$TD~0Yc+}K=3f9 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 Wg>Q1lwrL2!pNxd!t8y`D!2bc=j(Fby literal 7509 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 LL!na6Ea<-gyD`Ae diff --git a/Structural/Proxy/uml/uml.svg b/Structural/Proxy/uml/uml.svg index 1ec1d46..a2c889f 100644 --- a/Structural/Proxy/uml/uml.svg +++ b/Structural/Proxy/uml/uml.svg @@ -1,281 +1,75 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - data - - - - - - - - - - - - - __construct(data) - - - - - - - - - - - - - __set(name, value) - - - - - - - - - - __get(name) - - - - - - - - - - - - - Record - - - Record - - - - - - - - - - - - - - - - - - - isDirty - - - - - - - - - - isInitialized - - - - - - - - - - - - - __construct(data) - - - - - - - - - - - - - __set(name, value) - - - - - - - - - - - - - RecordProxy - - - RecordProxy - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +