From 95ad95c33e9486f57e96d7f5fc81973b8499c325 Mon Sep 17 00:00:00 2001 From: Dominik Liebler Date: Wed, 21 Sep 2016 17:23:20 +0200 Subject: [PATCH 01/43] On to PHP7^! --- Behavioral/Observer/Tests/ObserverTest.php | 2 +- Makefile | 17 ++++++++++++ Structural/Decorator/Tests/DecoratorTest.php | 2 +- Structural/Proxy/Record.php | 28 ++++++++++---------- Structural/Proxy/RecordProxy.php | 28 +++++++++++--------- Structural/Proxy/Tests/ProxyTest.php | 25 +++++++++++++++++ 6 files changed, 74 insertions(+), 28 deletions(-) create mode 100644 Structural/Proxy/Tests/ProxyTest.php diff --git a/Behavioral/Observer/Tests/ObserverTest.php b/Behavioral/Observer/Tests/ObserverTest.php index d9dacec27..6a3f36986 100644 --- a/Behavioral/Observer/Tests/ObserverTest.php +++ b/Behavioral/Observer/Tests/ObserverTest.php @@ -57,7 +57,7 @@ public function testAttachDetach() public function testUpdateCalling() { $subject = new User(); - $observer = $this->getMock('SplObserver'); + $observer = $this->createMock('SplObserver'); $subject->attach($observer); $observer->expects($this->once()) diff --git a/Makefile b/Makefile index 52169e65b..c3841a231 100644 --- a/Makefile +++ b/Makefile @@ -190,3 +190,20 @@ pseudoxml: $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml @echo @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml." + +composer.phar: + php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" + php -r "if (hash_file('SHA384', 'composer-setup.php') === 'e115a8dc7871f15d853148a7fbac7da27d6c0030b848d9b3dc09e2a0388afed865e6a3d6b3c0fad45c48e2b5fc1196ae') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" + php composer-setup.php + php -r "unlink('composer-setup.php');" + +install: vendor + +vendor: composer.phar + php composer.phar install + +cs: install + ./vendor/bin/phpcs -p --standard=PSR2 --ignore=vendor . + +test: install cs + ./vendor/bin/phpunit diff --git a/Structural/Decorator/Tests/DecoratorTest.php b/Structural/Decorator/Tests/DecoratorTest.php index 689caf26e..2878772fe 100644 --- a/Structural/Decorator/Tests/DecoratorTest.php +++ b/Structural/Decorator/Tests/DecoratorTest.php @@ -73,7 +73,7 @@ public function testDecoratorTypeHintedForPhp7() */ public function testDecoratorOnlyAcceptRenderer() { - $mock = $this->getMock('DesignPatterns\Structural\Decorator\RendererInterface'); + $mock = $this->createMock('DesignPatterns\Structural\Decorator\RendererInterface'); $dec = $this->getMockForAbstractClass('DesignPatterns\Structural\Decorator\Decorator', array($mock)); $this->assertNotNull($dec); } diff --git a/Structural/Proxy/Record.php b/Structural/Proxy/Record.php index 7ae4a3cfc..fd9bb0c48 100644 --- a/Structural/Proxy/Record.php +++ b/Structural/Proxy/Record.php @@ -8,44 +8,44 @@ class Record { /** - * @var array|null + * @var string[] */ - protected $data; + private $data; /** - * @param null $data + * @param string[] $data */ - public function __construct($data = null) + public function __construct(array $data = []) { - $this->data = (array) $data; + $this->data = $data; } /** - * magic setter. + * magic setter * * @param string $name * @param mixed $value * * @return void */ - public function __set($name, $value) + public function __set(string $name, string $value) { - $this->data[(string) $name] = $value; + $this->data[$name] = $value; } /** - * magic getter. + * magic getter * * @param string $name * - * @return mixed|null + * @return string|null */ - public function __get($name) + public function __get(string $name): string { - if (array_key_exists($name, $this->data)) { - return $this->data[(string) $name]; + if (isset($this->data[$name])) { + return $this->data[$name]; } else { - return; + return null; } } } diff --git a/Structural/Proxy/RecordProxy.php b/Structural/Proxy/RecordProxy.php index f8c78a819..2432e012d 100644 --- a/Structural/Proxy/RecordProxy.php +++ b/Structural/Proxy/RecordProxy.php @@ -2,25 +2,22 @@ namespace DesignPatterns\Structural\Proxy; -/** - * Class RecordProxy. - */ class RecordProxy extends Record { /** * @var bool */ - protected $isDirty = false; + private $isDirty = false; /** * @var bool */ - protected $isInitialized = false; + private $isInitialized = false; /** * @param array $data */ - public function __construct($data) + public function __construct(array $data) { parent::__construct($data); @@ -28,23 +25,30 @@ public function __construct($data) // since Record will hold our business logic, we don't want to // implement this behaviour there, but instead in a new proxy class // that extends the Record class - if (null !== $data) { + if (count($data) > 0) { $this->isInitialized = true; $this->isDirty = true; } } /** - * magic setter. + * magic setter * * @param string $name - * @param mixed $value - * - * @return void + * @param string $value */ - public function __set($name, $value) + public function __set(string $name, string $value) { $this->isDirty = true; + parent::__set($name, $value); } + + /** + * @return bool + */ + public function isDirty(): bool + { + return $this->isDirty; + } } diff --git a/Structural/Proxy/Tests/ProxyTest.php b/Structural/Proxy/Tests/ProxyTest.php new file mode 100644 index 000000000..955282fd8 --- /dev/null +++ b/Structural/Proxy/Tests/ProxyTest.php @@ -0,0 +1,25 @@ +foobar = 'baz'; + + $this->assertTrue($recordProxy->isDirty()); + } + + public function testProxyIsInstanceOfRecord() + { + $recordProxy = new RecordProxy([]); + $recordProxy->foobar = 'baz'; + + $this->assertInstanceOf('DesignPatterns\Structural\Proxy\Record', $recordProxy); + } +} From 1da5772226e3b9056fc9c92c471b8845e865518f Mon Sep 17 00:00:00 2001 From: Dominik Liebler Date: Thu, 22 Sep 2016 09:18:20 +0200 Subject: [PATCH 02/43] removed superfluous Class comments --- .../ChainOfResponsibilities/Responsible/FastStorage.php | 3 --- Behavioral/State/CreateOrder.php | 3 --- Behavioral/State/OrderController.php | 3 --- Behavioral/State/OrderFactory.php | 3 --- Behavioral/State/OrderInterface.php | 3 --- Behavioral/State/ShippingOrder.php | 3 --- Behavioral/Strategy/ComparatorInterface.php | 3 --- Behavioral/Strategy/DateComparator.php | 3 --- Behavioral/Strategy/IdComparator.php | 3 --- Behavioral/Strategy/ObjectCollection.php | 3 --- Creational/AbstractFactory/Html/Picture.php | 5 ----- Creational/AbstractFactory/Html/Text.php | 5 ----- Creational/AbstractFactory/HtmlFactory.php | 5 ----- Creational/AbstractFactory/Json/Picture.php | 5 ----- Creational/AbstractFactory/Json/Text.php | 5 ----- Creational/AbstractFactory/JsonFactory.php | 6 ------ Creational/AbstractFactory/Picture.php | 3 --- Creational/AbstractFactory/Text.php | 3 --- Creational/Builder/Parts/Door.php | 3 --- Creational/Builder/Parts/Engine.php | 3 --- Creational/Builder/Parts/Wheel.php | 3 --- Creational/Prototype/BarBookPrototype.php | 3 --- Creational/Prototype/FooBookPrototype.php | 3 --- Creational/StaticFactory/FormatNumber.php | 3 --- Creational/StaticFactory/FormatString.php | 3 --- Creational/StaticFactory/FormatterInterface.php | 3 --- More/Delegation/JuniorDeveloper.php | 3 --- More/Delegation/TeamLead.php | 3 --- More/EAV/Attribute.php | 3 --- More/EAV/Entity.php | 3 --- More/EAV/Value.php | 3 --- More/Repository/MemoryStorage.php | 3 --- More/Repository/Post.php | 5 ----- More/Repository/PostRepository.php | 5 +---- Structural/Composite/FormElement.php | 3 --- Structural/Composite/InputElement.php | 3 --- Structural/Composite/TextElement.php | 3 --- Structural/Decorator/RenderInJson.php | 3 --- Structural/Decorator/RenderInXml.php | 3 --- Structural/Decorator/RendererInterface.php | 3 --- Structural/Decorator/Webservice.php | 3 --- Structural/DependencyInjection/Connection.php | 3 --- Structural/Facade/Facade.php | 3 --- 43 files changed, 1 insertion(+), 145 deletions(-) diff --git a/Behavioral/ChainOfResponsibilities/Responsible/FastStorage.php b/Behavioral/ChainOfResponsibilities/Responsible/FastStorage.php index 8acaad185..d7cbe52f5 100644 --- a/Behavioral/ChainOfResponsibilities/Responsible/FastStorage.php +++ b/Behavioral/ChainOfResponsibilities/Responsible/FastStorage.php @@ -5,9 +5,6 @@ use DesignPatterns\Behavioral\ChainOfResponsibilities\Handler; use DesignPatterns\Behavioral\ChainOfResponsibilities\Request; -/** - * Class FastStorage. - */ class FastStorage extends Handler { /** diff --git a/Behavioral/State/CreateOrder.php b/Behavioral/State/CreateOrder.php index 7ac48d440..19c6b4ad7 100644 --- a/Behavioral/State/CreateOrder.php +++ b/Behavioral/State/CreateOrder.php @@ -2,9 +2,6 @@ namespace DesignPatterns\Behavioral\State; -/** - * Class CreateOrder. - */ class CreateOrder implements OrderInterface { /** diff --git a/Behavioral/State/OrderController.php b/Behavioral/State/OrderController.php index 93ac5425c..99ade5f66 100644 --- a/Behavioral/State/OrderController.php +++ b/Behavioral/State/OrderController.php @@ -2,9 +2,6 @@ namespace DesignPatterns\Behavioral\State; -/** - * Class OrderController. - */ class OrderController { /** diff --git a/Behavioral/State/OrderFactory.php b/Behavioral/State/OrderFactory.php index 205d505da..a2d326172 100644 --- a/Behavioral/State/OrderFactory.php +++ b/Behavioral/State/OrderFactory.php @@ -2,9 +2,6 @@ namespace DesignPatterns\Behavioral\State; -/** - * Class OrderFactory. - */ class OrderFactory { private function __construct() diff --git a/Behavioral/State/OrderInterface.php b/Behavioral/State/OrderInterface.php index 6a97e69c0..1f86b96de 100644 --- a/Behavioral/State/OrderInterface.php +++ b/Behavioral/State/OrderInterface.php @@ -2,9 +2,6 @@ namespace DesignPatterns\Behavioral\State; -/** - * Class OrderInterface. - */ interface OrderInterface { /** diff --git a/Behavioral/State/ShippingOrder.php b/Behavioral/State/ShippingOrder.php index 943d714ec..0ffa06807 100644 --- a/Behavioral/State/ShippingOrder.php +++ b/Behavioral/State/ShippingOrder.php @@ -2,9 +2,6 @@ namespace DesignPatterns\Behavioral\State; -/** - * Class ShippingOrder. - */ class ShippingOrder implements OrderInterface { /** diff --git a/Behavioral/Strategy/ComparatorInterface.php b/Behavioral/Strategy/ComparatorInterface.php index f472fd932..8e3c89392 100644 --- a/Behavioral/Strategy/ComparatorInterface.php +++ b/Behavioral/Strategy/ComparatorInterface.php @@ -2,9 +2,6 @@ namespace DesignPatterns\Behavioral\Strategy; -/** - * Class ComparatorInterface. - */ interface ComparatorInterface { /** diff --git a/Behavioral/Strategy/DateComparator.php b/Behavioral/Strategy/DateComparator.php index d355dc9a4..37fc3babe 100644 --- a/Behavioral/Strategy/DateComparator.php +++ b/Behavioral/Strategy/DateComparator.php @@ -2,9 +2,6 @@ namespace DesignPatterns\Behavioral\Strategy; -/** - * Class DateComparator. - */ class DateComparator implements ComparatorInterface { /** diff --git a/Behavioral/Strategy/IdComparator.php b/Behavioral/Strategy/IdComparator.php index f829195bb..1f882a197 100644 --- a/Behavioral/Strategy/IdComparator.php +++ b/Behavioral/Strategy/IdComparator.php @@ -2,9 +2,6 @@ namespace DesignPatterns\Behavioral\Strategy; -/** - * Class IdComparator. - */ class IdComparator implements ComparatorInterface { /** diff --git a/Behavioral/Strategy/ObjectCollection.php b/Behavioral/Strategy/ObjectCollection.php index b5c1bd233..ed2096964 100644 --- a/Behavioral/Strategy/ObjectCollection.php +++ b/Behavioral/Strategy/ObjectCollection.php @@ -2,9 +2,6 @@ namespace DesignPatterns\Behavioral\Strategy; -/** - * Class ObjectCollection. - */ class ObjectCollection { /** diff --git a/Creational/AbstractFactory/Html/Picture.php b/Creational/AbstractFactory/Html/Picture.php index 3abacb484..e5f430b71 100644 --- a/Creational/AbstractFactory/Html/Picture.php +++ b/Creational/AbstractFactory/Html/Picture.php @@ -4,11 +4,6 @@ use DesignPatterns\Creational\AbstractFactory\Picture as BasePicture; -/** - * Class Picture. - * - * Picture is a concrete image for HTML rendering - */ class Picture extends BasePicture { /** diff --git a/Creational/AbstractFactory/Html/Text.php b/Creational/AbstractFactory/Html/Text.php index 8c33da629..32d93504e 100644 --- a/Creational/AbstractFactory/Html/Text.php +++ b/Creational/AbstractFactory/Html/Text.php @@ -4,11 +4,6 @@ use DesignPatterns\Creational\AbstractFactory\Text as BaseText; -/** - * Class Text. - * - * Text is a concrete text for HTML rendering - */ class Text extends BaseText { /** diff --git a/Creational/AbstractFactory/HtmlFactory.php b/Creational/AbstractFactory/HtmlFactory.php index 5c22859ea..1d622e12e 100644 --- a/Creational/AbstractFactory/HtmlFactory.php +++ b/Creational/AbstractFactory/HtmlFactory.php @@ -2,11 +2,6 @@ namespace DesignPatterns\Creational\AbstractFactory; -/** - * Class HtmlFactory. - * - * HtmlFactory is a concrete factory for HTML component - */ class HtmlFactory extends AbstractFactory { /** diff --git a/Creational/AbstractFactory/Json/Picture.php b/Creational/AbstractFactory/Json/Picture.php index 77bb150eb..cee82ddee 100644 --- a/Creational/AbstractFactory/Json/Picture.php +++ b/Creational/AbstractFactory/Json/Picture.php @@ -4,11 +4,6 @@ use DesignPatterns\Creational\AbstractFactory\Picture as BasePicture; -/** - * Class Picture. - * - * Picture is a concrete image for JSON rendering - */ class Picture extends BasePicture { /** diff --git a/Creational/AbstractFactory/Json/Text.php b/Creational/AbstractFactory/Json/Text.php index 4c51785d5..df69a4d96 100644 --- a/Creational/AbstractFactory/Json/Text.php +++ b/Creational/AbstractFactory/Json/Text.php @@ -4,11 +4,6 @@ use DesignPatterns\Creational\AbstractFactory\Text as BaseText; -/** - * Class Text. - * - * Text is a text component with a JSON rendering - */ class Text extends BaseText { /** diff --git a/Creational/AbstractFactory/JsonFactory.php b/Creational/AbstractFactory/JsonFactory.php index 63a997914..945f55dfa 100644 --- a/Creational/AbstractFactory/JsonFactory.php +++ b/Creational/AbstractFactory/JsonFactory.php @@ -2,12 +2,6 @@ namespace DesignPatterns\Creational\AbstractFactory; -/** - * Class JsonFactory. - * - * JsonFactory is a factory for creating a family of JSON component - * (example for ajax) - */ class JsonFactory extends AbstractFactory { /** diff --git a/Creational/AbstractFactory/Picture.php b/Creational/AbstractFactory/Picture.php index 89fd66f22..e0b41728d 100644 --- a/Creational/AbstractFactory/Picture.php +++ b/Creational/AbstractFactory/Picture.php @@ -2,9 +2,6 @@ namespace DesignPatterns\Creational\AbstractFactory; -/** - * Class Picture. - */ abstract class Picture implements MediaInterface { /** diff --git a/Creational/AbstractFactory/Text.php b/Creational/AbstractFactory/Text.php index 30984f35a..593c4e5b3 100644 --- a/Creational/AbstractFactory/Text.php +++ b/Creational/AbstractFactory/Text.php @@ -2,9 +2,6 @@ namespace DesignPatterns\Creational\AbstractFactory; -/** - * Class Text. - */ abstract class Text implements MediaInterface { /** diff --git a/Creational/Builder/Parts/Door.php b/Creational/Builder/Parts/Door.php index fc12608cd..f2732fe06 100644 --- a/Creational/Builder/Parts/Door.php +++ b/Creational/Builder/Parts/Door.php @@ -2,9 +2,6 @@ namespace DesignPatterns\Creational\Builder\Parts; -/** - * Class Door. - */ class Door { } diff --git a/Creational/Builder/Parts/Engine.php b/Creational/Builder/Parts/Engine.php index 5232ab383..48046b891 100644 --- a/Creational/Builder/Parts/Engine.php +++ b/Creational/Builder/Parts/Engine.php @@ -2,9 +2,6 @@ namespace DesignPatterns\Creational\Builder\Parts; -/** - * Class Engine. - */ class Engine { } diff --git a/Creational/Builder/Parts/Wheel.php b/Creational/Builder/Parts/Wheel.php index 0a1afbdfe..4e677e33e 100644 --- a/Creational/Builder/Parts/Wheel.php +++ b/Creational/Builder/Parts/Wheel.php @@ -2,9 +2,6 @@ namespace DesignPatterns\Creational\Builder\Parts; -/** - * Class Wheel. - */ class Wheel { } diff --git a/Creational/Prototype/BarBookPrototype.php b/Creational/Prototype/BarBookPrototype.php index 7c9b72b3e..c323a8cda 100644 --- a/Creational/Prototype/BarBookPrototype.php +++ b/Creational/Prototype/BarBookPrototype.php @@ -2,9 +2,6 @@ namespace DesignPatterns\Creational\Prototype; -/** - * Class BarBookPrototype. - */ class BarBookPrototype extends BookPrototype { /** diff --git a/Creational/Prototype/FooBookPrototype.php b/Creational/Prototype/FooBookPrototype.php index 95ea9e67c..47c73e653 100644 --- a/Creational/Prototype/FooBookPrototype.php +++ b/Creational/Prototype/FooBookPrototype.php @@ -2,9 +2,6 @@ namespace DesignPatterns\Creational\Prototype; -/** - * Class FooBookPrototype. - */ class FooBookPrototype extends BookPrototype { protected $category = 'Foo'; diff --git a/Creational/StaticFactory/FormatNumber.php b/Creational/StaticFactory/FormatNumber.php index e577ab243..69fd9e119 100644 --- a/Creational/StaticFactory/FormatNumber.php +++ b/Creational/StaticFactory/FormatNumber.php @@ -2,9 +2,6 @@ namespace DesignPatterns\Creational\StaticFactory; -/** - * Class FormatNumber. - */ class FormatNumber implements FormatterInterface { } diff --git a/Creational/StaticFactory/FormatString.php b/Creational/StaticFactory/FormatString.php index 5cb9e2878..14c205524 100644 --- a/Creational/StaticFactory/FormatString.php +++ b/Creational/StaticFactory/FormatString.php @@ -2,9 +2,6 @@ namespace DesignPatterns\Creational\StaticFactory; -/** - * Class FormatString. - */ class FormatString implements FormatterInterface { } diff --git a/Creational/StaticFactory/FormatterInterface.php b/Creational/StaticFactory/FormatterInterface.php index 349f8b6ad..22ea0de96 100644 --- a/Creational/StaticFactory/FormatterInterface.php +++ b/Creational/StaticFactory/FormatterInterface.php @@ -2,9 +2,6 @@ namespace DesignPatterns\Creational\StaticFactory; -/** - * Class FormatterInterface. - */ interface FormatterInterface { } diff --git a/More/Delegation/JuniorDeveloper.php b/More/Delegation/JuniorDeveloper.php index 0946dad61..64e2ff694 100644 --- a/More/Delegation/JuniorDeveloper.php +++ b/More/Delegation/JuniorDeveloper.php @@ -2,9 +2,6 @@ namespace DesignPatterns\More\Delegation; -/** - * Class JuniorDeveloper. - */ class JuniorDeveloper { public function writeBadCode() diff --git a/More/Delegation/TeamLead.php b/More/Delegation/TeamLead.php index 9b7519065..b617d54a5 100644 --- a/More/Delegation/TeamLead.php +++ b/More/Delegation/TeamLead.php @@ -2,9 +2,6 @@ namespace DesignPatterns\More\Delegation; -/** - * Class TeamLead. - */ class TeamLead { /** @var JuniorDeveloper */ diff --git a/More/EAV/Attribute.php b/More/EAV/Attribute.php index 3874360b3..dda66e93f 100644 --- a/More/EAV/Attribute.php +++ b/More/EAV/Attribute.php @@ -4,9 +4,6 @@ use SplObjectStorage; -/** - * Class Attribute. - */ class Attribute implements ValueAccessInterface { /** diff --git a/More/EAV/Entity.php b/More/EAV/Entity.php index ff26589f9..e98f11a5d 100644 --- a/More/EAV/Entity.php +++ b/More/EAV/Entity.php @@ -4,9 +4,6 @@ use SplObjectStorage; -/** - * Class Entity. - */ class Entity implements ValueAccessInterface { /** diff --git a/More/EAV/Value.php b/More/EAV/Value.php index da4370fe2..e3556c625 100644 --- a/More/EAV/Value.php +++ b/More/EAV/Value.php @@ -2,9 +2,6 @@ namespace DesignPatterns\More\EAV; -/** - * Class Value. - */ class Value implements ValueInterface { /** diff --git a/More/Repository/MemoryStorage.php b/More/Repository/MemoryStorage.php index 44276d552..d97077367 100644 --- a/More/Repository/MemoryStorage.php +++ b/More/Repository/MemoryStorage.php @@ -2,9 +2,6 @@ namespace DesignPatterns\More\Repository; -/** - * Class MemoryStorage. - */ class MemoryStorage implements Storage { private $data; diff --git a/More/Repository/Post.php b/More/Repository/Post.php index e9990b44c..6fdcfc03c 100644 --- a/More/Repository/Post.php +++ b/More/Repository/Post.php @@ -2,11 +2,6 @@ namespace DesignPatterns\More\Repository; -/** - * Post represents entity for some post that user left on the site. - * - * Class Post - */ class Post { /** diff --git a/More/Repository/PostRepository.php b/More/Repository/PostRepository.php index e7687f3ca..2f92dd351 100644 --- a/More/Repository/PostRepository.php +++ b/More/Repository/PostRepository.php @@ -3,16 +3,13 @@ namespace DesignPatterns\More\Repository; /** - * Repository for class Post - * This class is between Entity layer(class Post) and access object layer(interface Storage). + * This class is between Entity layer (class Post) and access object layer (interface Storage). * * Repository encapsulates the set of objects persisted in a data store and the operations performed over them * providing a more object-oriented view of the persistence layer * * Repository also supports the objective of achieving a clean separation and one-way dependency * between the domain and data mapping layers - * - * Class PostRepository */ class PostRepository { diff --git a/Structural/Composite/FormElement.php b/Structural/Composite/FormElement.php index 0055aeea7..76ecf31b7 100644 --- a/Structural/Composite/FormElement.php +++ b/Structural/Composite/FormElement.php @@ -2,9 +2,6 @@ namespace DesignPatterns\Structural\Composite; -/** - * Class FormElement. - */ abstract class FormElement { /** diff --git a/Structural/Composite/InputElement.php b/Structural/Composite/InputElement.php index 19786d517..44ac047dd 100644 --- a/Structural/Composite/InputElement.php +++ b/Structural/Composite/InputElement.php @@ -2,9 +2,6 @@ namespace DesignPatterns\Structural\Composite; -/** - * Class InputElement. - */ class InputElement extends FormElement { /** diff --git a/Structural/Composite/TextElement.php b/Structural/Composite/TextElement.php index 48b33bab1..8bd56b56f 100644 --- a/Structural/Composite/TextElement.php +++ b/Structural/Composite/TextElement.php @@ -2,9 +2,6 @@ namespace DesignPatterns\Structural\Composite; -/** - * Class TextElement. - */ class TextElement extends FormElement { /** diff --git a/Structural/Decorator/RenderInJson.php b/Structural/Decorator/RenderInJson.php index fb9a71e1f..e950e28b0 100644 --- a/Structural/Decorator/RenderInJson.php +++ b/Structural/Decorator/RenderInJson.php @@ -2,9 +2,6 @@ namespace DesignPatterns\Structural\Decorator; -/** - * Class RenderInJson. - */ class RenderInJson extends Decorator { /** diff --git a/Structural/Decorator/RenderInXml.php b/Structural/Decorator/RenderInXml.php index f203d5373..5afffda25 100644 --- a/Structural/Decorator/RenderInXml.php +++ b/Structural/Decorator/RenderInXml.php @@ -2,9 +2,6 @@ namespace DesignPatterns\Structural\Decorator; -/** - * Class RenderInXml. - */ class RenderInXml extends Decorator { /** diff --git a/Structural/Decorator/RendererInterface.php b/Structural/Decorator/RendererInterface.php index 73152b9ad..e7b95ebe0 100644 --- a/Structural/Decorator/RendererInterface.php +++ b/Structural/Decorator/RendererInterface.php @@ -2,9 +2,6 @@ namespace DesignPatterns\Structural\Decorator; -/** - * Class RendererInterface. - */ interface RendererInterface { /** diff --git a/Structural/Decorator/Webservice.php b/Structural/Decorator/Webservice.php index e2bcc6940..1151672ab 100644 --- a/Structural/Decorator/Webservice.php +++ b/Structural/Decorator/Webservice.php @@ -2,9 +2,6 @@ namespace DesignPatterns\Structural\Decorator; -/** - * Class Webservice. - */ class Webservice implements RendererInterface { /** diff --git a/Structural/DependencyInjection/Connection.php b/Structural/DependencyInjection/Connection.php index d38908969..1a5764c59 100644 --- a/Structural/DependencyInjection/Connection.php +++ b/Structural/DependencyInjection/Connection.php @@ -2,9 +2,6 @@ namespace DesignPatterns\Structural\DependencyInjection; -/** - * Class Connection. - */ class Connection { /** diff --git a/Structural/Facade/Facade.php b/Structural/Facade/Facade.php index 43d1bcb3e..f199600de 100644 --- a/Structural/Facade/Facade.php +++ b/Structural/Facade/Facade.php @@ -2,9 +2,6 @@ namespace DesignPatterns\Structural\Facade; -/** - * Class Facade. - */ class Facade { /** From a6b09d6b18edcca1bde40c8102b3b3ac0b878e2a Mon Sep 17 00:00:00 2001 From: Dominik Liebler Date: Thu, 22 Sep 2016 09:25:26 +0200 Subject: [PATCH 03/43] PHP7 Command --- Behavioral/Command/AddMessageDateCommand.php | 4 +- Behavioral/Command/CommandInterface.php | 3 -- Behavioral/Command/HelloCommand.php | 9 ++-- Behavioral/Command/Invoker.php | 10 ++--- Behavioral/Command/Receiver.php | 18 +++++--- Behavioral/Command/Tests/CommandTest.php | 28 +++---------- .../Command/Tests/UndoableCommandTest.php | 41 ++++++------------- .../Command/UndoableCommandInterface.php | 4 -- 8 files changed, 40 insertions(+), 77 deletions(-) diff --git a/Behavioral/Command/AddMessageDateCommand.php b/Behavioral/Command/AddMessageDateCommand.php index 11bb9af2c..fcaeb4f9f 100644 --- a/Behavioral/Command/AddMessageDateCommand.php +++ b/Behavioral/Command/AddMessageDateCommand.php @@ -4,14 +4,14 @@ /** * This concrete command tweaks receiver to add current date to messages - * invoker just knows that it can call "execute". + * invoker just knows that it can call "execute" */ class AddMessageDateCommand implements UndoableCommandInterface { /** * @var Receiver */ - protected $output; + private $output; /** * Each concrete command is built with different receivers. diff --git a/Behavioral/Command/CommandInterface.php b/Behavioral/Command/CommandInterface.php index cd9d9c631..265e86261 100644 --- a/Behavioral/Command/CommandInterface.php +++ b/Behavioral/Command/CommandInterface.php @@ -2,9 +2,6 @@ namespace DesignPatterns\Behavioral\Command; -/** - * class CommandInterface. - */ interface CommandInterface { /** diff --git a/Behavioral/Command/HelloCommand.php b/Behavioral/Command/HelloCommand.php index 94d47236e..1dbfaf552 100644 --- a/Behavioral/Command/HelloCommand.php +++ b/Behavioral/Command/HelloCommand.php @@ -4,18 +4,18 @@ /** * This concrete command calls "print" on the Receiver, but an external - * invoker just knows that it can call "execute". + * invoker just knows that it can call "execute" */ class HelloCommand implements CommandInterface { /** * @var Receiver */ - protected $output; + private $output; /** * Each concrete command is built with different receivers. - * There can be one, many or completely no receivers, but there can be other commands in the parameters. + * There can be one, many or completely no receivers, but there can be other commands in the parameters * * @param Receiver $console */ @@ -29,8 +29,7 @@ public function __construct(Receiver $console) */ public function execute() { - // sometimes, there is no receiver and this is the command which - // does all the work + // sometimes, there is no receiver and this is the command which does all the work $this->output->write('Hello World'); } } diff --git a/Behavioral/Command/Invoker.php b/Behavioral/Command/Invoker.php index 7942adb32..c6e7f9320 100644 --- a/Behavioral/Command/Invoker.php +++ b/Behavioral/Command/Invoker.php @@ -11,11 +11,11 @@ class Invoker /** * @var CommandInterface */ - protected $command; + private $command; /** - * In the invoker we find this kind of method for subscribing the command. - * There can be also a stack, a list, a fixed set... + * in the invoker we find this kind of method for subscribing the command + * There can be also a stack, a list, a fixed set ... * * @param CommandInterface $cmd */ @@ -25,12 +25,10 @@ public function setCommand(CommandInterface $cmd) } /** - * executes the command. + * executes the command; the invoker is the same whatever is the command */ public function run() { - // here is a key feature of the invoker - // the invoker is the same whatever is the command $this->command->execute(); } } diff --git a/Behavioral/Command/Receiver.php b/Behavioral/Command/Receiver.php index 956ce74be..7ca6343b7 100644 --- a/Behavioral/Command/Receiver.php +++ b/Behavioral/Command/Receiver.php @@ -7,14 +7,20 @@ */ class Receiver { + /** + * @var bool + */ private $enableDate = false; - private $output = array(); + /** + * @var string[] + */ + private $output = []; /** * @param string $str */ - public function write($str) + public function write(string $str) { if ($this->enableDate) { $str .= ' ['.date('Y-m-d').']'; @@ -23,13 +29,13 @@ public function write($str) $this->output[] = $str; } - public function getOutput() + public function getOutput(): string { - return implode("\n", $this->output); + return join("\n", $this->output); } /** - * Enable receiver to display message date. + * Enable receiver to display message date */ public function enableDate() { @@ -37,7 +43,7 @@ public function enableDate() } /** - * Disable receiver to display message date. + * Disable receiver to display message date */ public function disableDate() { diff --git a/Behavioral/Command/Tests/CommandTest.php b/Behavioral/Command/Tests/CommandTest.php index 38524950d..cd3ea03cd 100644 --- a/Behavioral/Command/Tests/CommandTest.php +++ b/Behavioral/Command/Tests/CommandTest.php @@ -6,31 +6,15 @@ use DesignPatterns\Behavioral\Command\Invoker; use DesignPatterns\Behavioral\Command\Receiver; -/** - * CommandTest has the role of the Client in the Command Pattern. - */ class CommandTest extends \PHPUnit_Framework_TestCase { - /** - * @var Invoker - */ - protected $invoker; - - /** - * @var Receiver - */ - protected $receiver; - - protected function setUp() - { - $this->invoker = new Invoker(); - $this->receiver = new Receiver(); - } - public function testInvocation() { - $this->invoker->setCommand(new HelloCommand($this->receiver)); - $this->invoker->run(); - $this->assertEquals($this->receiver->getOutput(), 'Hello World'); + $invoker = new Invoker(); + $receiver = new Receiver(); + + $invoker->setCommand(new HelloCommand($receiver)); + $invoker->run(); + $this->assertEquals($receiver->getOutput(), 'Hello World'); } } diff --git a/Behavioral/Command/Tests/UndoableCommandTest.php b/Behavioral/Command/Tests/UndoableCommandTest.php index 5302a7b50..8d102593f 100644 --- a/Behavioral/Command/Tests/UndoableCommandTest.php +++ b/Behavioral/Command/Tests/UndoableCommandTest.php @@ -6,44 +6,27 @@ use DesignPatterns\Behavioral\Command\HelloCommand; use DesignPatterns\Behavioral\Command\Invoker; use DesignPatterns\Behavioral\Command\Receiver; -use PHPUnit_Framework_TestCase; -/** - * UndoableCommandTest has the role of the Client in the Command Pattern. - */ -class UndoableCommandTest extends PHPUnit_Framework_TestCase +class UndoableCommandTest extends \PHPUnit_Framework_TestCase { - /** - * @var Invoker - */ - protected $invoker; - - /** - * @var Receiver - */ - protected $receiver; - - protected function setUp() - { - $this->invoker = new Invoker(); - $this->receiver = new Receiver(); - } - public function testInvocation() { - $this->invoker->setCommand(new HelloCommand($this->receiver)); - $this->invoker->run(); - $this->assertEquals($this->receiver->getOutput(), 'Hello World'); + $invoker = new Invoker(); + $receiver = new Receiver(); + + $invoker->setCommand(new HelloCommand($receiver)); + $invoker->run(); + $this->assertEquals($receiver->getOutput(), 'Hello World'); - $messageDateCommand = new AddMessageDateCommand($this->receiver); + $messageDateCommand = new AddMessageDateCommand($receiver); $messageDateCommand->execute(); - $this->invoker->run(); - $this->assertEquals($this->receiver->getOutput(), "Hello World\nHello World [".date('Y-m-d').']'); + $invoker->run(); + $this->assertEquals($receiver->getOutput(), "Hello World\nHello World [".date('Y-m-d').']'); $messageDateCommand->undo(); - $this->invoker->run(); - $this->assertEquals($this->receiver->getOutput(), "Hello World\nHello World [".date('Y-m-d')."]\nHello World"); + $invoker->run(); + $this->assertEquals($receiver->getOutput(), "Hello World\nHello World [".date('Y-m-d')."]\nHello World"); } } diff --git a/Behavioral/Command/UndoableCommandInterface.php b/Behavioral/Command/UndoableCommandInterface.php index f9234ab57..52b02e941 100644 --- a/Behavioral/Command/UndoableCommandInterface.php +++ b/Behavioral/Command/UndoableCommandInterface.php @@ -2,14 +2,10 @@ namespace DesignPatterns\Behavioral\Command; -/** - * Interface UndoableCommandInterface. - */ interface UndoableCommandInterface extends CommandInterface { /** * This method is used to undo change made by command execution - * The Receiver goes in the constructor. */ public function undo(); } From 64e21e8581430124589745c442d3b30945e67216 Mon Sep 17 00:00:00 2001 From: Dominik Liebler Date: Thu, 22 Sep 2016 09:38:55 +0200 Subject: [PATCH 04/43] PHP7 Mediator --- Behavioral/Mediator/Colleague.php | 18 +++------- Behavioral/Mediator/Mediator.php | 41 ++++++++++------------ Behavioral/Mediator/MediatorInterface.php | 6 ++-- Behavioral/Mediator/Subsystem/Client.php | 14 ++------ Behavioral/Mediator/Subsystem/Database.php | 8 +---- Behavioral/Mediator/Subsystem/Server.php | 10 ++---- Behavioral/Mediator/Tests/MediatorTest.php | 21 +++-------- 7 files changed, 36 insertions(+), 82 deletions(-) diff --git a/Behavioral/Mediator/Colleague.php b/Behavioral/Mediator/Colleague.php index c74dee5ed..3a837421c 100644 --- a/Behavioral/Mediator/Colleague.php +++ b/Behavioral/Mediator/Colleague.php @@ -4,7 +4,7 @@ /** * Colleague is an abstract colleague who works together but he only knows - * the Mediator, not other colleague. + * the Mediator, not other colleagues */ abstract class Colleague { @@ -13,21 +13,13 @@ abstract class Colleague * * @var MediatorInterface */ - private $mediator; + protected $mediator; /** - * @param MediatorInterface $medium + * @param MediatorInterface $mediator */ - public function __construct(MediatorInterface $medium) + public function setMediator(MediatorInterface $mediator) { - // in this way, we are sure the concrete colleague knows the mediator - $this->mediator = $medium; - } - - // for subclasses - - protected function getMediator() - { - return $this->mediator; + $this->mediator = $mediator; } } diff --git a/Behavioral/Mediator/Mediator.php b/Behavioral/Mediator/Mediator.php index 98a789083..08e1b7190 100644 --- a/Behavioral/Mediator/Mediator.php +++ b/Behavioral/Mediator/Mediator.php @@ -3,59 +3,54 @@ namespace DesignPatterns\Behavioral\Mediator; /** - * Mediator is the concrete Mediator for this design pattern. - * In this example, I have made a "Hello World" with the Mediator Pattern. + * Mediator is the concrete Mediator for this design pattern + * + * In this example, I have made a "Hello World" with the Mediator Pattern */ class Mediator implements MediatorInterface { /** * @var Subsystem\Server */ - protected $server; + private $server; /** * @var Subsystem\Database */ - protected $database; + private $database; /** * @var Subsystem\Client */ - protected $client; + private $client; /** - * @param Subsystem\Database $db - * @param Subsystem\Client $cl - * @param Subsystem\Server $srv + * @param Subsystem\Database $database + * @param Subsystem\Client $client + * @param Subsystem\Server $server */ - public function setColleague(Subsystem\Database $db, Subsystem\Client $cl, Subsystem\Server $srv) + public function __construct(Subsystem\Database $database, Subsystem\Client $client, Subsystem\Server $server) { - $this->database = $db; - $this->server = $srv; - $this->client = $cl; + $this->database = $database; + $this->server = $server; + $this->client = $client; + + $this->database->setMediator($this); + $this->server->setMediator($this); + $this->client->setMediator($this); } - /** - * make request. - */ public function makeRequest() { $this->server->process(); } - /** - * query db. - * - * @return mixed - */ - public function queryDb() + public function queryDb(): string { return $this->database->getData(); } /** - * send response. - * * @param string $content */ public function sendResponse($content) diff --git a/Behavioral/Mediator/MediatorInterface.php b/Behavioral/Mediator/MediatorInterface.php index dbdd48920..5ec717a77 100644 --- a/Behavioral/Mediator/MediatorInterface.php +++ b/Behavioral/Mediator/MediatorInterface.php @@ -4,7 +4,7 @@ /** * MediatorInterface is a contract for the Mediator - * This interface is not mandatory but it is better for LSP concerns. + * This interface is not mandatory but it is better for Liskov substitution principle concerns. */ interface MediatorInterface { @@ -16,12 +16,12 @@ interface MediatorInterface public function sendResponse($content); /** - * makes a request. + * makes a request */ public function makeRequest(); /** - * queries the DB. + * queries the DB */ public function queryDb(); } diff --git a/Behavioral/Mediator/Subsystem/Client.php b/Behavioral/Mediator/Subsystem/Client.php index f7a21c967..e7897a420 100644 --- a/Behavioral/Mediator/Subsystem/Client.php +++ b/Behavioral/Mediator/Subsystem/Client.php @@ -5,24 +5,16 @@ use DesignPatterns\Behavioral\Mediator\Colleague; /** - * Client is a client that make request et get response. + * Client is a client that makes requests and gets the response response. */ class Client extends Colleague { - /** - * request. - */ public function request() { - $this->getMediator()->makeRequest(); + $this->mediator->makeRequest(); } - /** - * output content. - * - * @param string $content - */ - public function output($content) + public function output(string $content) { echo $content; } diff --git a/Behavioral/Mediator/Subsystem/Database.php b/Behavioral/Mediator/Subsystem/Database.php index 69ad6cf6b..9255f22fe 100644 --- a/Behavioral/Mediator/Subsystem/Database.php +++ b/Behavioral/Mediator/Subsystem/Database.php @@ -4,15 +4,9 @@ use DesignPatterns\Behavioral\Mediator\Colleague; -/** - * Database is a database service. - */ class Database extends Colleague { - /** - * @return string - */ - public function getData() + public function getData(): string { return 'World'; } diff --git a/Behavioral/Mediator/Subsystem/Server.php b/Behavioral/Mediator/Subsystem/Server.php index 1602bcb3b..c05be5eb0 100644 --- a/Behavioral/Mediator/Subsystem/Server.php +++ b/Behavioral/Mediator/Subsystem/Server.php @@ -4,17 +4,11 @@ use DesignPatterns\Behavioral\Mediator\Colleague; -/** - * Server serves responses. - */ class Server extends Colleague { - /** - * process on server. - */ public function process() { - $data = $this->getMediator()->queryDb(); - $this->getMediator()->sendResponse("Hello $data"); + $data = $this->mediator->queryDb(); + $this->mediator->sendResponse(sprintf("Hello %s", $data)); } } diff --git a/Behavioral/Mediator/Tests/MediatorTest.php b/Behavioral/Mediator/Tests/MediatorTest.php index 2bce947fe..2cd40a6a5 100644 --- a/Behavioral/Mediator/Tests/MediatorTest.php +++ b/Behavioral/Mediator/Tests/MediatorTest.php @@ -7,27 +7,14 @@ use DesignPatterns\Behavioral\Mediator\Subsystem\Database; use DesignPatterns\Behavioral\Mediator\Subsystem\Server; -/** - * MediatorTest tests hello world. - */ class MediatorTest extends \PHPUnit_Framework_TestCase { - protected $client; - - protected function setUp() - { - $media = new Mediator(); - $this->client = new Client($media); - $media->setColleague(new Database($media), $this->client, new Server($media)); - } - public function testOutputHelloWorld() { - // testing if Hello World is output : + $client = new Client(); + new Mediator(new Database(), $client, new Server()); + $this->expectOutputString('Hello World'); - // as you see, the 3 components Client, Server and Database are totally decoupled - $this->client->request(); - // Anyway, it remains complexity in the Mediator that's why the pattern - // Observer is preferable in mnay situations. + $client->request(); } } From 01007ec5a8c440af8543607dac14e6db20a16a1f Mon Sep 17 00:00:00 2001 From: Dominik Liebler Date: Thu, 22 Sep 2016 10:39:03 +0200 Subject: [PATCH 05/43] PHP7 Memento --- Behavioral/Memento/Caretaker.php | 49 - Behavioral/Memento/Memento.php | 10 +- Behavioral/Memento/Originator.php | 38 - Behavioral/Memento/README.rst | 8 +- Behavioral/Memento/State.php | 48 + Behavioral/Memento/Tests/MementoTest.php | 163 +-- Behavioral/Memento/Ticket.php | 49 + Behavioral/Memento/uml/Memento.uml | 21 + Behavioral/Memento/uml/Momento.uml | 22 - Behavioral/Memento/uml/uml.png | Bin 62525 -> 63348 bytes Behavioral/Memento/uml/uml.svg | 1262 ++++++++++++++++------ 11 files changed, 1096 insertions(+), 574 deletions(-) delete mode 100644 Behavioral/Memento/Caretaker.php delete mode 100644 Behavioral/Memento/Originator.php create mode 100644 Behavioral/Memento/State.php create mode 100644 Behavioral/Memento/Ticket.php create mode 100644 Behavioral/Memento/uml/Memento.uml delete mode 100644 Behavioral/Memento/uml/Momento.uml diff --git a/Behavioral/Memento/Caretaker.php b/Behavioral/Memento/Caretaker.php deleted file mode 100644 index d80454a93..000000000 --- a/Behavioral/Memento/Caretaker.php +++ /dev/null @@ -1,49 +0,0 @@ -history[$id]; - } - - /** - * @param Memento $state - */ - public function saveToHistory(Memento $state) - { - $this->history[] = $state; - } - - public function runCustomLogic() - { - $originator = new Originator(); - - //Setting state to State1 - $originator->setState('State1'); - //Setting state to State2 - $originator->setState('State2'); - //Saving State2 to Memento - $this->saveToHistory($originator->getStateAsMemento()); - //Setting state to State3 - $originator->setState('State3'); - - // We can request multiple mementos, and choose which one to roll back to. - // Saving State3 to Memento - $this->saveToHistory($originator->getStateAsMemento()); - //Setting state to State4 - $originator->setState('State4'); - - $originator->restoreFromMemento($this->getFromHistory(1)); - //State after restoring from Memento: State3 - - return $originator->getStateAsMemento()->getState(); - } -} diff --git a/Behavioral/Memento/Memento.php b/Behavioral/Memento/Memento.php index 4dd2fc8a0..f75fcc943 100644 --- a/Behavioral/Memento/Memento.php +++ b/Behavioral/Memento/Memento.php @@ -4,19 +4,21 @@ class Memento { - /* @var mixed */ + /** + * @var State + */ private $state; /** - * @param mixed $stateToSave + * @param State $stateToSave */ - public function __construct($stateToSave) + public function __construct(State $stateToSave) { $this->state = $stateToSave; } /** - * @return mixed + * @return State */ public function getState() { diff --git a/Behavioral/Memento/Originator.php b/Behavioral/Memento/Originator.php deleted file mode 100644 index 3acb0c171..000000000 --- a/Behavioral/Memento/Originator.php +++ /dev/null @@ -1,38 +0,0 @@ -state = $state; - } - - /** - * @return Memento - */ - public function getStateAsMemento() - { - // you must save a separate copy in Memento - $state = is_object($this->state) ? clone $this->state : $this->state; - - return new Memento($state); - } - - public function restoreFromMemento(Memento $memento) - { - $this->state = $memento->getState(); - } -} diff --git a/Behavioral/Memento/README.rst b/Behavioral/Memento/README.rst index 911e30e57..32ec70396 100644 --- a/Behavioral/Memento/README.rst +++ b/Behavioral/Memento/README.rst @@ -6,8 +6,8 @@ Purpose It provides the ability to restore an object to it's previous state (undo via rollback) or to gain access to state of the object, without revealing -it's implementation (i.e., the object is not required to have a functional -for return the current state). +it's implementation (i.e., the object is not required to have a function +to return the current state). The memento pattern is implemented with three objects: the Originator, a Caretaker and a Memento. @@ -66,9 +66,9 @@ Originator.php :language: php :linenos: -Caretaker.php +Ticket.php -.. literalinclude:: Caretaker.php +.. literalinclude:: Ticket.php :language: php :linenos: diff --git a/Behavioral/Memento/State.php b/Behavioral/Memento/State.php new file mode 100644 index 000000000..6cb5dd101 --- /dev/null +++ b/Behavioral/Memento/State.php @@ -0,0 +1,48 @@ +state = $state; + } + + private static function ensureIsValidState(string $state) + { + if (!in_array($state, self::$validStates)) { + throw new \InvalidArgumentException('Invalid state given'); + } + } + + public function __toString(): string + { + return $this->state; + } +} diff --git a/Behavioral/Memento/Tests/MementoTest.php b/Behavioral/Memento/Tests/MementoTest.php index 722dbfa8a..d4a44f39e 100644 --- a/Behavioral/Memento/Tests/MementoTest.php +++ b/Behavioral/Memento/Tests/MementoTest.php @@ -2,161 +2,30 @@ namespace DesignPatterns\Behavioral\Memento\Tests; -use DesignPatterns\Behavioral\Memento\Caretaker; -use DesignPatterns\Behavioral\Memento\Memento; -use DesignPatterns\Behavioral\Memento\Originator; +use DesignPatterns\Behavioral\Memento\State; +use DesignPatterns\Behavioral\Memento\Ticket; -/** - * MementoTest tests the memento pattern. - */ class MementoTest extends \PHPUnit_Framework_TestCase { - public function testUsageExample() + public function testOpenTicketAssignAndSetBackToOpen() { - $originator = new Originator(); - $caretaker = new Caretaker(); + $ticket = new Ticket(); - $character = new \stdClass(); - // new object - $character->name = 'Gandalf'; - // connect Originator to character object - $originator->setState($character); + // open the ticket + $ticket->open(); + $openedState = $ticket->getState(); + $this->assertEquals(State::STATE_OPENED, (string) $ticket->getState()); - // work on the object - $character->name = 'Gandalf the Grey'; - // still change something - $character->race = 'Maia'; - // time to save state - $snapshot = $originator->getStateAsMemento(); - // put state to log - $caretaker->saveToHistory($snapshot); + $memento = $ticket->saveToMemento(); - // change something - $character->name = 'Sauron'; - // and again - $character->race = 'Ainur'; - // state inside the Originator was equally changed - $this->assertAttributeEquals($character, 'state', $originator); + // assign the ticket + $ticket->assign(); + $this->assertEquals(State::STATE_ASSIGNED, (string) $ticket->getState()); - // time to save another state - $snapshot = $originator->getStateAsMemento(); - // put state to log - $caretaker->saveToHistory($snapshot); + // no restore to the opened state, but verify that the state object has been cloned for the memento + $ticket->restoreFromMemento($memento); - $rollback = $caretaker->getFromHistory(0); - // return to first state - $originator->restoreFromMemento($rollback); - // use character from old state - $character = $rollback->getState(); - - // yes, that what we need - $this->assertEquals('Gandalf the Grey', $character->name); - // make new changes - $character->name = 'Gandalf the White'; - - // and Originator linked to actual object again - $this->assertAttributeEquals($character, 'state', $originator); - } - - public function testStringState() - { - $originator = new Originator(); - $originator->setState('State1'); - - $this->assertAttributeEquals('State1', 'state', $originator); - - $originator->setState('State2'); - $this->assertAttributeEquals('State2', 'state', $originator); - - $snapshot = $originator->getStateAsMemento(); - $this->assertAttributeEquals('State2', 'state', $snapshot); - - $originator->setState('State3'); - $this->assertAttributeEquals('State3', 'state', $originator); - - $originator->restoreFromMemento($snapshot); - $this->assertAttributeEquals('State2', 'state', $originator); - } - - public function testSnapshotIsClone() - { - $originator = new Originator(); - $object = new \stdClass(); - - $originator->setState($object); - $snapshot = $originator->getStateAsMemento(); - $object->new_property = 1; - - $this->assertAttributeEquals($object, 'state', $originator); - $this->assertAttributeNotEquals($object, 'state', $snapshot); - - $originator->restoreFromMemento($snapshot); - $this->assertAttributeNotEquals($object, 'state', $originator); - } - - public function testCanChangeActualState() - { - $originator = new Originator(); - $first_state = new \stdClass(); - - $originator->setState($first_state); - $snapshot = $originator->getStateAsMemento(); - $second_state = $snapshot->getState(); - - // still actual - $first_state->first_property = 1; - // just history - $second_state->second_property = 2; - $this->assertAttributeEquals($first_state, 'state', $originator); - $this->assertAttributeNotEquals($second_state, 'state', $originator); - - $originator->restoreFromMemento($snapshot); - // now it lost state - $first_state->first_property = 11; - // must be actual - $second_state->second_property = 22; - $this->assertAttributeEquals($second_state, 'state', $originator); - $this->assertAttributeNotEquals($first_state, 'state', $originator); - } - - public function testStateWithDifferentObjects() - { - $originator = new Originator(); - - $first = new \stdClass(); - $first->data = 'foo'; - - $originator->setState($first); - $this->assertAttributeEquals($first, 'state', $originator); - - $first_snapshot = $originator->getStateAsMemento(); - $this->assertAttributeEquals($first, 'state', $first_snapshot); - - $second = new \stdClass(); - $second->data = 'bar'; - $originator->setState($second); - $this->assertAttributeEquals($second, 'state', $originator); - - $originator->restoreFromMemento($first_snapshot); - $this->assertAttributeEquals($first, 'state', $originator); - } - - public function testCaretaker() - { - $caretaker = new Caretaker(); - $memento1 = new Memento('foo'); - $memento2 = new Memento('bar'); - $caretaker->saveToHistory($memento1); - $caretaker->saveToHistory($memento2); - $this->assertAttributeEquals(array($memento1, $memento2), 'history', $caretaker); - $this->assertEquals($memento1, $caretaker->getFromHistory(0)); - $this->assertEquals($memento2, $caretaker->getFromHistory(1)); - } - - public function testCaretakerCustomLogic() - { - $caretaker = new Caretaker(); - $result = $caretaker->runCustomLogic(); - $this->assertEquals('State3', $result); + $this->assertEquals(State::STATE_OPENED, (string) $ticket->getState()); + $this->assertNotSame($openedState, $ticket->getState()); } } diff --git a/Behavioral/Memento/Ticket.php b/Behavioral/Memento/Ticket.php new file mode 100644 index 000000000..13f75e7c7 --- /dev/null +++ b/Behavioral/Memento/Ticket.php @@ -0,0 +1,49 @@ +currentState = new State(State::STATE_CREATED); + } + + public function open() + { + $this->currentState = new State(State::STATE_OPENED); + } + + public function assign() + { + $this->currentState = new State(State::STATE_ASSIGNED); + } + + public function close() + { + $this->currentState = new State(State::STATE_CLOSED); + } + + public function saveToMemento(): Memento + { + return new Memento(clone $this->currentState); + } + + public function restoreFromMemento(Memento $memento) + { + $this->currentState = $memento->getState(); + } + + public function getState(): State + { + return $this->currentState; + } +} diff --git a/Behavioral/Memento/uml/Memento.uml b/Behavioral/Memento/uml/Memento.uml new file mode 100644 index 000000000..194187a5e --- /dev/null +++ b/Behavioral/Memento/uml/Memento.uml @@ -0,0 +1,21 @@ + + + PHP + \DesignPatterns\Behavioral\Memento\Memento + + \DesignPatterns\Behavioral\Memento\State + \DesignPatterns\Behavioral\Memento\Memento + \DesignPatterns\Behavioral\Memento\Ticket + + + + + + + Fields + Constants + Methods + + private + + diff --git a/Behavioral/Memento/uml/Momento.uml b/Behavioral/Memento/uml/Momento.uml deleted file mode 100644 index c72667ed8..000000000 --- a/Behavioral/Memento/uml/Momento.uml +++ /dev/null @@ -1,22 +0,0 @@ - - - PHP - \DesignPatterns\Behavioral\Memento\Caretaker - - \DesignPatterns\Behavioral\Memento\Caretaker - \DesignPatterns\Behavioral\Memento\Originator - \DesignPatterns\Behavioral\Memento\Memento - - - - - - - Fields - Constants - Constructors - Methods - - private - - diff --git a/Behavioral/Memento/uml/uml.png b/Behavioral/Memento/uml/uml.png index 0fde074e8a8f2f74c617bbc4a0e7323c2c346fb7..417b29343cecee29103ae3698790b8e7273ec2bc 100644 GIT binary patch literal 63348 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

|3Ve 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 -@8;i0C@=r>p~-V(@tewk}bgZY{Q%_e4Y+O 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

_fRntTQwG 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - state - - - - - - - - - - - - setState(state) - - - - - - - - - saveToMemento() - - - - - - - - - restoreFromMemento(memento) - - - - - - - - - - - - - Originator - - - Originator - - - - - - - - - - - - - - - - - - run() - - - - - - - - - - - - - Caretaker - - - Caretaker - - - - - - - - - - - - - - - - - - - state - - - - - - - - - - - - __construct(stateToSave) - - - - - - - - - - - - getState() - - - - - - - - - - - - - Memento - - - Memento - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + validStates + + + + + + + + + + + + + + + + state + + + + + + + + + + + + + + + + + + + STATE_CREATED + + + + + + + + + + + + + + + + STATE_OPENED + + + + + + + + + + + + + + + + STATE_ASSIGNED + + + + + + + + + + + + + + + + STATE_CLOSED + + + + + + + + + + + + + + + + ensureIsValidState(state) + + + + + + + + + + + + + __toString() + + + + + + + + + + + + + State + + + State + + + + + + + + + + + + + + + + + + + + + + + + + validStates + + + + + + + + + + + + + + + + state + + + + + + + + + + + + + + + + + + + STATE_CREATED + + + + + + + + + + + + + + + + STATE_OPENED + + + + + + + + + + + + + + + + STATE_ASSIGNED + + + + + + + + + + + + + + + + STATE_CLOSED + + + + + + + + + + + + + + + + + + + + + + ensureIsValidState(state) + + + + + + + + + + + + + + + + __toString() + + + + + + + + + + + + + State + + + State + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + state + + + + + + + + + + + + + + + + getState() + + + + + + + + + + + + + Memento + + + Memento + + + + + + + + + + + + + + + + + + + + + + state + + + + + + + + + + + + + + + + + + + getState() + + + + + + + + + + + + + Memento + + + Memento + + + + + + + + + + + + + + + + + + + + + + + + + currentState + + + + + + + + + + + + + + + + open() + + + + + + + + + + + + + assign() + + + + + + + + + + + + + close() + + + + + + + + + + + + + saveToMemento() + + + + + + + + + + + + + restoreFromMemento(memento) + + + + + + + + + + + + + getState() + + + + + + + + + + + + + Ticket + + + Ticket + + + + + + + + + + + + + + + + + + + + + + currentState + + + + + + + + + + + + + + + + + + + open() + + + + + + + + + + + + + + + + assign() + + + + + + + + + + + + + + + + close() + + + + + + + + + + + + + + + + saveToMemento() + + + + + + + + + + + + + + + + restoreFromMemento(memento) + + + + + + + + + + + + + + + + getState() + + + + + + + + + + + + + Ticket + + + Ticket + + + From b707bf064e6693ab7aacb212901aa3631dc3d6a4 Mon Sep 17 00:00:00 2001 From: Dominik Liebler Date: Thu, 22 Sep 2016 10:43:27 +0200 Subject: [PATCH 06/43] PHP7 NullObject --- Behavioral/NullObject/LoggerInterface.php | 11 ++--------- Behavioral/NullObject/NullLogger.php | 12 +----------- Behavioral/NullObject/PrintLogger.php | 8 +------- Behavioral/NullObject/Service.php | 16 +++++----------- Behavioral/NullObject/Tests/LoggerTest.php | 7 +------ 5 files changed, 10 insertions(+), 44 deletions(-) diff --git a/Behavioral/NullObject/LoggerInterface.php b/Behavioral/NullObject/LoggerInterface.php index 99a28c752..7c1ff7db0 100644 --- a/Behavioral/NullObject/LoggerInterface.php +++ b/Behavioral/NullObject/LoggerInterface.php @@ -3,16 +3,9 @@ namespace DesignPatterns\Behavioral\NullObject; /** - * LoggerInterface is a contract for logging something. - * - * Key feature: NullLogger MUST inherit from this interface like any other Loggers + * Key feature: NullLogger must inherit from this interface like any other loggers */ interface LoggerInterface { - /** - * @param string $str - * - * @return mixed - */ - public function log($str); + public function log(string $str); } diff --git a/Behavioral/NullObject/NullLogger.php b/Behavioral/NullObject/NullLogger.php index a4bf46941..afddbd61f 100644 --- a/Behavioral/NullObject/NullLogger.php +++ b/Behavioral/NullObject/NullLogger.php @@ -2,19 +2,9 @@ namespace DesignPatterns\Behavioral\NullObject; -/** - * Performance concerns : ok there is a call for nothing but we spare an "if is_null" - * I didn't run a benchmark but I think it's equivalent. - * - * Key feature : of course this logger MUST implement the same interface (or abstract) - * like the other loggers. - */ class NullLogger implements LoggerInterface { - /** - * {@inheritdoc} - */ - public function log($str) + public function log(string $str) { // do nothing } diff --git a/Behavioral/NullObject/PrintLogger.php b/Behavioral/NullObject/PrintLogger.php index 371c1ab3a..6c1d4ba08 100644 --- a/Behavioral/NullObject/PrintLogger.php +++ b/Behavioral/NullObject/PrintLogger.php @@ -2,15 +2,9 @@ namespace DesignPatterns\Behavioral\NullObject; -/** - * PrintLogger is a logger that prints the log entry to standard output. - */ class PrintLogger implements LoggerInterface { - /** - * @param string $str - */ - public function log($str) + public function log(string $str) { echo $str; } diff --git a/Behavioral/NullObject/Service.php b/Behavioral/NullObject/Service.php index 56a384723..81baf8fff 100644 --- a/Behavioral/NullObject/Service.php +++ b/Behavioral/NullObject/Service.php @@ -2,24 +2,19 @@ namespace DesignPatterns\Behavioral\NullObject; -/** - * Service is dummy service that uses a logger. - */ class Service { /** * @var LoggerInterface */ - protected $logger; + private $logger; /** - * we inject the logger in ctor and it is mandatory. - * - * @param LoggerInterface $log + * @param LoggerInterface $logger */ - public function __construct(LoggerInterface $log) + public function __construct(LoggerInterface $logger) { - $this->logger = $log; + $this->logger = $logger; } /** @@ -27,8 +22,7 @@ public function __construct(LoggerInterface $log) */ public function doSomething() { - // no more check "if (!is_null($this->logger))..." with the NullObject pattern + // notice here that you don't have to check if the logger is set with eg. is_null(), instead just use it $this->logger->log('We are in '.__METHOD__); - // something to do... } } diff --git a/Behavioral/NullObject/Tests/LoggerTest.php b/Behavioral/NullObject/Tests/LoggerTest.php index 034b577bf..0e35aa51e 100644 --- a/Behavioral/NullObject/Tests/LoggerTest.php +++ b/Behavioral/NullObject/Tests/LoggerTest.php @@ -6,17 +6,12 @@ use DesignPatterns\Behavioral\NullObject\PrintLogger; use DesignPatterns\Behavioral\NullObject\Service; -/** - * LoggerTest tests for different loggers. - */ class LoggerTest extends \PHPUnit_Framework_TestCase { public function testNullObject() { - // one can use a singleton for NullObjet : I don't think it's a good idea - // because the purpose behind null object is to "avoid special case". $service = new Service(new NullLogger()); - $this->expectOutputString(null); // no output + $this->expectOutputString(null); $service->doSomething(); } From 9b9eee5a4cefc1301df368b3215e2489e3c216a9 Mon Sep 17 00:00:00 2001 From: Dominik Liebler Date: Thu, 22 Sep 2016 10:54:22 +0200 Subject: [PATCH 07/43] PHP7 Observer --- Behavioral/Observer/Tests/ObserverTest.php | 61 +- Behavioral/Observer/User.php | 57 +- Behavioral/Observer/UserObserver.php | 21 +- Behavioral/Observer/uml/Observer.uml | 53 +- Behavioral/Observer/uml/uml.png | Bin 9977 -> 45971 bytes Behavioral/Observer/uml/uml.svg | 959 ++++++++++++++------- 6 files changed, 707 insertions(+), 444 deletions(-) diff --git a/Behavioral/Observer/Tests/ObserverTest.php b/Behavioral/Observer/Tests/ObserverTest.php index 6a3f36986..c26399749 100644 --- a/Behavioral/Observer/Tests/ObserverTest.php +++ b/Behavioral/Observer/Tests/ObserverTest.php @@ -5,65 +5,16 @@ use DesignPatterns\Behavioral\Observer\User; use DesignPatterns\Behavioral\Observer\UserObserver; -/** - * ObserverTest tests the Observer pattern. - */ class ObserverTest extends \PHPUnit_Framework_TestCase { - protected $observer; - - protected function setUp() - { - $this->observer = new UserObserver(); - } - - /** - * Tests the notification. - */ - public function testNotify() - { - $this->expectOutputString('DesignPatterns\Behavioral\Observer\User has been updated'); - $subject = new User(); - - $subject->attach($this->observer); - $subject->property = 123; - } - - /** - * Tests the subscribing. - */ - public function testAttachDetach() - { - $subject = new User(); - $reflection = new \ReflectionProperty($subject, 'observers'); - - $reflection->setAccessible(true); - /** @var \SplObjectStorage $observers */ - $observers = $reflection->getValue($subject); - - $this->assertInstanceOf('SplObjectStorage', $observers); - $this->assertFalse($observers->contains($this->observer)); - - $subject->attach($this->observer); - $this->assertTrue($observers->contains($this->observer)); - - $subject->detach($this->observer); - $this->assertFalse($observers->contains($this->observer)); - } - - /** - * Tests the update() invocation on a mockup. - */ - public function testUpdateCalling() + public function testChangeInUserLeadsToUserObserverBeingNotified() { - $subject = new User(); - $observer = $this->createMock('SplObserver'); - $subject->attach($observer); + $observer = new UserObserver(); - $observer->expects($this->once()) - ->method('update') - ->with($subject); + $user = new User(); + $user->attach($observer); - $subject->notify(); + $user->changeEmail('foo@bar.com'); + $this->assertCount(1, $observer->getChangedUsers()); } } diff --git a/Behavioral/Observer/User.php b/Behavioral/Observer/User.php index 0d2a8171f..6fd58d47b 100644 --- a/Behavioral/Observer/User.php +++ b/Behavioral/Observer/User.php @@ -3,60 +3,42 @@ namespace DesignPatterns\Behavioral\Observer; /** - * Observer pattern : The observed object (the subject). - * - * The subject maintains a list of Observers and sends notifications. + * User implements the observed object (called Subject), it maintains a list of observers and sends notifications to + * them in case changes are made on the User object */ class User implements \SplSubject { /** - * user data. - * - * @var array + * @var string */ - protected $data = array(); + private $email; /** - * observers. - * * @var \SplObjectStorage */ - protected $observers; + private $observers; public function __construct() { $this->observers = new \SplObjectStorage(); } - /** - * attach a new observer. - * - * @param \SplObserver $observer - * - * @return void - */ public function attach(\SplObserver $observer) { $this->observers->attach($observer); } - /** - * detach an observer. - * - * @param \SplObserver $observer - * - * @return void - */ public function detach(\SplObserver $observer) { $this->observers->detach($observer); } - /** - * notify observers. - * - * @return void - */ + public function changeEmail(string $email) + { + $this->email = $email; + $this->notify(); + } + public function notify() { /** @var \SplObserver $observer */ @@ -64,21 +46,4 @@ public function notify() $observer->update($this); } } - - /** - * Ideally one would better write setter/getter for all valid attributes and only call notify() - * on attributes that matter when changed. - * - * @param string $name - * @param mixed $value - * - * @return void - */ - public function __set($name, $value) - { - $this->data[$name] = $value; - - // notify the observers, that user has been updated - $this->notify(); - } } diff --git a/Behavioral/Observer/UserObserver.php b/Behavioral/Observer/UserObserver.php index f2673bacc..243e7404d 100644 --- a/Behavioral/Observer/UserObserver.php +++ b/Behavioral/Observer/UserObserver.php @@ -2,19 +2,28 @@ namespace DesignPatterns\Behavioral\Observer; -/** - * class UserObserver. - */ class UserObserver implements \SplObserver { /** - * This is the only method to implement as an observer. - * It is called by the Subject (usually by SplSubject::notify() ). + * @var User[] + */ + private $changedUsers = []; + + /** + * It is called by the Subject, usually by SplSubject::notify() * * @param \SplSubject $subject */ public function update(\SplSubject $subject) { - echo get_class($subject).' has been updated'; + $this->changedUsers[] = clone $subject; + } + + /** + * @return User[] + */ + public function getChangedUsers(): array + { + return $this->changedUsers; } } diff --git a/Behavioral/Observer/uml/Observer.uml b/Behavioral/Observer/uml/Observer.uml index 0e5ddef4f..b74d770a8 100644 --- a/Behavioral/Observer/uml/Observer.uml +++ b/Behavioral/Observer/uml/Observer.uml @@ -1,27 +1,26 @@ - - - PHP - \DesignPatterns\Behavioral\Observer\User - - \DesignPatterns\Behavioral\Observer\UserObserver - \DesignPatterns\Behavioral\Observer\User - \SplSubject - - - - - - - - - - - - Fields - Constants - Constructors - Methods - - private - - + + + PHP + \DesignPatterns\Behavioral\Observer\UserObserver + + \DesignPatterns\Behavioral\Observer\UserObserver + \SplObserver + \DesignPatterns\Behavioral\Observer\User + + + + + + + + + + + + Fields + Constants + Methods + + private + + diff --git a/Behavioral/Observer/uml/uml.png b/Behavioral/Observer/uml/uml.png index 0300bd4a9d4f4cb2626518ca52d45a1fa7ff3746..3eff4646fbc8ebbbbbf96abcb849ae30ed1a5cf1 100644 GIT binary patch literal 45971 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 literal 9977 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - data - - - - - - - - - - observers - - - - - - - - - - - - attach(observer) - - - - - - - - - detach(observer) - - - - - - - - - notify() - - - - - - - - - __set(name, value) - - - - - - - - - - - - - User - - - User - - - - - - - - - - - - - - - - - - update(subject) - - - - - - - - - - - - - UserObserver - - - UserObserver - - - - - - - - - - - - - - - - - - attach(observer) - - - - - - - - - detach(observer) - - - - - - - - - notify() - - - - - - - - - - - - - SplSubject - - - SplSubject - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + changedUsers + + + + + + + + + + + + + + + + update(subject) + + + + + + + + + + + + + getChangedUsers() + + + + + + + + + + + + + UserObserver + + + UserObserver + + + + + + + + + + + + + + + + + + + + + + changedUsers + + + + + + + + + + + + + + + + + + + update(subject) + + + + + + + + + + + + + + + + getChangedUsers() + + + + + + + + + + + + + UserObserver + + + UserObserver + + + + + + + + + + + + + + + + + + + + + + update(subject) + + + + + + + + + + + + + SplObserver + + + SplObserver + + + + + + + + + + + + + + + + + + + + + + update(subject) + + + + + + + + + + + + + SplObserver + + + SplObserver + + + + + + + + + + + + + + + + + + + + + + + + + email + + + + + + + + + + + + + + + + observers + + + + + + + + + + + + + + + + attach(observer) + + + + + + + + + + + + + detach(observer) + + + + + + + + + + + + + changeEmail(email) + + + + + + + + + + + + + notify() + + + + + + + + + + + + + User + + + User + + + + + + + + + + + + + + + + + + + + + + email + + + + + + + + + + + + + + + + observers + + + + + + + + + + + + + + + + + + + attach(observer) + + + + + + + + + + + + + + + + detach(observer) + + + + + + + + + + + + + + + + changeEmail(email) + + + + + + + + + + + + + + + + notify() + + + + + + + + + + + + + User + + + User + + + + + + + + + From 36f3df8fbb5da9a7ff539bd95940a45c7e2e315d Mon Sep 17 00:00:00 2001 From: Dominik Liebler Date: Thu, 22 Sep 2016 11:02:03 +0200 Subject: [PATCH 08/43] PHP7 Strategy --- Behavioral/Strategy/ComparatorInterface.php | 4 +- Behavioral/Strategy/DateComparator.php | 13 +++-- Behavioral/Strategy/IdComparator.php | 13 +++-- Behavioral/Strategy/ObjectCollection.php | 12 ++--- Behavioral/Strategy/Tests/StrategyTest.php | 58 +++++++++++---------- 5 files changed, 47 insertions(+), 53 deletions(-) diff --git a/Behavioral/Strategy/ComparatorInterface.php b/Behavioral/Strategy/ComparatorInterface.php index 8e3c89392..4c5dcb2f5 100644 --- a/Behavioral/Strategy/ComparatorInterface.php +++ b/Behavioral/Strategy/ComparatorInterface.php @@ -8,7 +8,7 @@ interface ComparatorInterface * @param mixed $a * @param mixed $b * - * @return bool + * @return int */ - public function compare($a, $b); + public function compare($a, $b): int; } diff --git a/Behavioral/Strategy/DateComparator.php b/Behavioral/Strategy/DateComparator.php index 37fc3babe..3f5966738 100644 --- a/Behavioral/Strategy/DateComparator.php +++ b/Behavioral/Strategy/DateComparator.php @@ -5,17 +5,16 @@ class DateComparator implements ComparatorInterface { /** - * {@inheritdoc} + * @param mixed $a + * @param mixed $b + * + * @return int */ - public function compare($a, $b) + public function compare($a, $b): int { $aDate = new \DateTime($a['date']); $bDate = new \DateTime($b['date']); - if ($aDate == $bDate) { - return 0; - } - - return $aDate < $bDate ? -1 : 1; + return $aDate <=> $bDate; } } diff --git a/Behavioral/Strategy/IdComparator.php b/Behavioral/Strategy/IdComparator.php index 1f882a197..80c43cc91 100644 --- a/Behavioral/Strategy/IdComparator.php +++ b/Behavioral/Strategy/IdComparator.php @@ -5,14 +5,13 @@ class IdComparator implements ComparatorInterface { /** - * {@inheritdoc} + * @param mixed $a + * @param mixed $b + * + * @return int */ - public function compare($a, $b) + public function compare($a, $b): int { - if ($a['id'] == $b['id']) { - return 0; - } else { - return $a['id'] < $b['id'] ? -1 : 1; - } + return $a['id'] <=> $b['id']; } } diff --git a/Behavioral/Strategy/ObjectCollection.php b/Behavioral/Strategy/ObjectCollection.php index ed2096964..ca8165bab 100644 --- a/Behavioral/Strategy/ObjectCollection.php +++ b/Behavioral/Strategy/ObjectCollection.php @@ -17,30 +17,24 @@ class ObjectCollection /** * @param array $elements */ - public function __construct(array $elements = array()) + public function __construct(array $elements = []) { $this->elements = $elements; } - /** - * @return array - */ - public function sort() + public function sort(): array { if (!$this->comparator) { throw new \LogicException('Comparator is not set'); } - $callback = array($this->comparator, 'compare'); - uasort($this->elements, $callback); + uasort($this->elements, [$this->comparator, 'compare']); return $this->elements; } /** * @param ComparatorInterface $comparator - * - * @return void */ public function setComparator(ComparatorInterface $comparator) { diff --git a/Behavioral/Strategy/Tests/StrategyTest.php b/Behavioral/Strategy/Tests/StrategyTest.php index 1911ba406..033a4a941 100644 --- a/Behavioral/Strategy/Tests/StrategyTest.php +++ b/Behavioral/Strategy/Tests/StrategyTest.php @@ -5,43 +5,42 @@ use DesignPatterns\Behavioral\Strategy\DateComparator; use DesignPatterns\Behavioral\Strategy\IdComparator; use DesignPatterns\Behavioral\Strategy\ObjectCollection; -use DesignPatterns\Behavioral\Strategy\Strategy; -/** - * Tests for Strategy pattern. - */ class StrategyTest extends \PHPUnit_Framework_TestCase { - public function getIdCollection() + public function provideIntegers() { - return array( - array( - array(array('id' => 2), array('id' => 1), array('id' => 3)), - array('id' => 1), - ), - array( - array(array('id' => 3), array('id' => 2), array('id' => 1)), - array('id' => 1), - ), - ); + return [ + [ + [['id' => 2], ['id' => 1], ['id' => 3]], + ['id' => 1], + ], + [ + [['id' => 3], ['id' => 2], ['id' => 1]], + ['id' => 1], + ], + ]; } - public function getDateCollection() + public function providateDates() { - return array( - array( - array(array('date' => '2014-03-03'), array('date' => '2015-03-02'), array('date' => '2013-03-01')), - array('date' => '2013-03-01'), - ), - array( - array(array('date' => '2014-02-03'), array('date' => '2013-02-01'), array('date' => '2015-02-02')), - array('date' => '2013-02-01'), - ), - ); + return [ + [ + [['date' => '2014-03-03'], ['date' => '2015-03-02'], ['date' => '2013-03-01']], + ['date' => '2013-03-01'], + ], + [ + [['date' => '2014-02-03'], ['date' => '2013-02-01'], ['date' => '2015-02-02']], + ['date' => '2013-02-01'], + ], + ]; } /** - * @dataProvider getIdCollection + * @dataProvider provideIntegers + * + * @param array $collection + * @param array $expected */ public function testIdComparator($collection, $expected) { @@ -54,7 +53,10 @@ public function testIdComparator($collection, $expected) } /** - * @dataProvider getDateCollection + * @dataProvider providateDates + * + * @param array $collection + * @param array $expected */ public function testDateComparator($collection, $expected) { From 19fff0aed9a3fe0f2b29ef699550459366b07bcb Mon Sep 17 00:00:00 2001 From: Dominik Liebler Date: Thu, 22 Sep 2016 11:13:47 +0200 Subject: [PATCH 09/43] PHP7 TemplateMethod --- Behavioral/TemplateMethod/BeachJourney.php | 10 +- Behavioral/TemplateMethod/CityJourney.php | 15 +- Behavioral/TemplateMethod/Journey.php | 52 +- .../TemplateMethod/Tests/JourneyTest.php | 47 +- .../TemplateMethod/uml/TemplateMethod.uml | 70 +- Behavioral/TemplateMethod/uml/uml.png | Bin 8688 -> 46609 bytes Behavioral/TemplateMethod/uml/uml.svg | 892 +++++++++++++----- 7 files changed, 730 insertions(+), 356 deletions(-) diff --git a/Behavioral/TemplateMethod/BeachJourney.php b/Behavioral/TemplateMethod/BeachJourney.php index d19845c31..500705409 100644 --- a/Behavioral/TemplateMethod/BeachJourney.php +++ b/Behavioral/TemplateMethod/BeachJourney.php @@ -2,16 +2,10 @@ namespace DesignPatterns\Behavioral\TemplateMethod; -/** - * BeachJourney is vacation at the beach. - */ class BeachJourney extends Journey { - /** - * prints what to do to enjoy your vacation. - */ - protected function enjoyVacation() + protected function enjoyVacation(): string { - echo "Swimming and sun-bathing\n"; + return "Swimming and sun-bathing"; } } diff --git a/Behavioral/TemplateMethod/CityJourney.php b/Behavioral/TemplateMethod/CityJourney.php index 3f36b61e4..f1f93351c 100644 --- a/Behavioral/TemplateMethod/CityJourney.php +++ b/Behavioral/TemplateMethod/CityJourney.php @@ -2,16 +2,15 @@ namespace DesignPatterns\Behavioral\TemplateMethod; -/** - * CityJourney is a journey in a city. - */ class CityJourney extends Journey { - /** - * prints what to do in your journey to enjoy vacation. - */ - protected function enjoyVacation() + protected function enjoyVacation(): string { - echo "Eat, drink, take photos and sleep\n"; + return "Eat, drink, take photos and sleep"; + } + + protected function buyGift(): string + { + return "Buy a gift"; } } diff --git a/Behavioral/TemplateMethod/Journey.php b/Behavioral/TemplateMethod/Journey.php index c7a68096b..0a1407c25 100644 --- a/Behavioral/TemplateMethod/Journey.php +++ b/Behavioral/TemplateMethod/Journey.php @@ -4,6 +4,11 @@ abstract class Journey { + /** + * @var string[] + */ + private $thingsToDo = []; + /** * This is the public service provided by this class and its subclasses. * Notice it is final to "freeze" the global behavior of algorithm. @@ -12,46 +17,49 @@ abstract class Journey */ final public function takeATrip() { - $this->buyAFlight(); - $this->takePlane(); - $this->enjoyVacation(); - $this->buyGift(); - $this->takePlane(); + $this->thingsToDo[] = $this->buyAFlight(); + $this->thingsToDo[] = $this->takePlane(); + $this->thingsToDo[] = $this->enjoyVacation(); + $buyGift = $this->buyGift(); + + if ($buyGift !== null) { + $this->thingsToDo[] = $buyGift; + } + + $this->thingsToDo[] = $this->takePlane(); } /** * This method must be implemented, this is the key-feature of this pattern. */ - abstract protected function enjoyVacation(); + abstract protected function enjoyVacation(): string; /** * This method is also part of the algorithm but it is optional. - * This is an "adapter" (do not confuse with the Adapter pattern, not related) - * You can override it only if you need to. + * You can override it only if you need to + * + * @return null|string */ protected function buyGift() { + return null; } - /** - * This method will be unknown by subclasses (better). - */ - private function buyAFlight() + private function buyAFlight(): string { - echo "Buying a flight\n"; + return 'Buy a flight ticket'; + } + + private function takePlane(): string + { + return 'Taking the plane'; } /** - * Subclasses will get access to this method but cannot override it and - * compromise this algorithm (warning : cause of cyclic dependencies). + * @return string[] */ - final protected function takePlane() + public function getThingsToDo(): array { - echo "Taking the plane\n"; + return $this->thingsToDo; } - - // A note regarding the keyword "final" : don't use it when you start coding : - // add it after you narrow and know exactly what change and what remain unchanged - // in this algorithm. - // [abstract] x [3 access] x [final] = 12 combinations, it can be hard ! } diff --git a/Behavioral/TemplateMethod/Tests/JourneyTest.php b/Behavioral/TemplateMethod/Tests/JourneyTest.php index 82acef3cf..26c1763be 100644 --- a/Behavioral/TemplateMethod/Tests/JourneyTest.php +++ b/Behavioral/TemplateMethod/Tests/JourneyTest.php @@ -4,40 +4,33 @@ use DesignPatterns\Behavioral\TemplateMethod; -/** - * JourneyTest tests all journeys. - */ class JourneyTest extends \PHPUnit_Framework_TestCase { - public function testBeach() + public function testCanGetOnVacationOnTheBeach() { - $journey = new TemplateMethod\BeachJourney(); - $this->expectOutputRegex('#sun-bathing#'); - $journey->takeATrip(); - } + $beachJourney = new TemplateMethod\BeachJourney(); + $beachJourney->takeATrip(); - public function testCity() - { - $journey = new TemplateMethod\CityJourney(); - $this->expectOutputRegex('#drink#'); - $journey->takeATrip(); + $this->assertEquals( + ['Buy a flight ticket', 'Taking the plane', 'Swimming and sun-bathing', 'Taking the plane'], + $beachJourney->getThingsToDo() + ); } - /** - * How to test an abstract template method with PHPUnit. - */ - public function testLasVegas() + public function testCanGetOnAJourneyToACity() { - $journey = $this->getMockForAbstractClass('DesignPatterns\Behavioral\TemplateMethod\Journey'); - $journey->expects($this->once()) - ->method('enjoyVacation') - ->will($this->returnCallback(array($this, 'mockUpVacation'))); - $this->expectOutputRegex('#Las Vegas#'); - $journey->takeATrip(); - } + $beachJourney = new TemplateMethod\CityJourney(); + $beachJourney->takeATrip(); - public function mockUpVacation() - { - echo "Fear and loathing in Las Vegas\n"; + $this->assertEquals( + [ + 'Buy a flight ticket', + 'Taking the plane', + 'Eat, drink, take photos and sleep', + 'Buy a gift', + 'Taking the plane' + ], + $beachJourney->getThingsToDo() + ); } } diff --git a/Behavioral/TemplateMethod/uml/TemplateMethod.uml b/Behavioral/TemplateMethod/uml/TemplateMethod.uml index 063b0221a..29d6c04c4 100644 --- a/Behavioral/TemplateMethod/uml/TemplateMethod.uml +++ b/Behavioral/TemplateMethod/uml/TemplateMethod.uml @@ -1,35 +1,35 @@ - - - PHP - \DesignPatterns\Behavioral\TemplateMethod\BeachJourney - - \DesignPatterns\Behavioral\TemplateMethod\CityJourney - \DesignPatterns\Behavioral\TemplateMethod\Journey - \DesignPatterns\Behavioral\TemplateMethod\BeachJourney - - - - - - - - - - - - - - - - - - - - Fields - Constants - Constructors - Methods - - private - - + + + PHP + \DesignPatterns\Behavioral\TemplateMethod\BeachJourney + + \DesignPatterns\Behavioral\TemplateMethod\BeachJourney + \DesignPatterns\Behavioral\TemplateMethod\Journey + \DesignPatterns\Behavioral\TemplateMethod\CityJourney + + + + + + + + + + + + + + + + + + + + Fields + Constants + Constructors + Methods + + private + + diff --git a/Behavioral/TemplateMethod/uml/uml.png b/Behavioral/TemplateMethod/uml/uml.png index c557e8fcdb831339cfab288323611835f0cac518..d8e9f6980600cc71d0c5704f2b61b1ced742b7b1 100644 GIT binary patch literal 46609 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