From ad163dc35382b8d69ca033e4b67591e32d81c8bf Mon Sep 17 00:00:00 2001 From: ko22009 Date: Thu, 27 Apr 2017 09:13:45 +0500 Subject: [PATCH 1/2] State pattern is maintainable state pattern change readme.rst --- Behavioral/State/ContextOrder.php | 26 + Behavioral/State/CreateOrder.php | 31 +- Behavioral/State/Order.php | 18 - Behavioral/State/OrderRepository.php | 34 -- Behavioral/State/README.rst | 8 +- Behavioral/State/ShippingOrder.php | 29 +- Behavioral/State/StateOrder.php | 32 ++ Behavioral/State/Tests/StateTest.php | 29 +- Behavioral/State/uml/uml.png | Bin 12470 -> 22989 bytes Behavioral/State/uml/uml.svg | 759 +++++++++++++++++---------- 10 files changed, 569 insertions(+), 397 deletions(-) create mode 100644 Behavioral/State/ContextOrder.php delete mode 100644 Behavioral/State/Order.php delete mode 100644 Behavioral/State/OrderRepository.php create mode 100644 Behavioral/State/StateOrder.php diff --git a/Behavioral/State/ContextOrder.php b/Behavioral/State/ContextOrder.php new file mode 100644 index 0000000..b05537d --- /dev/null +++ b/Behavioral/State/ContextOrder.php @@ -0,0 +1,26 @@ +done(); + } + + public function getStatus(): string + { + return static::$state->getStatus(); + } +} diff --git a/Behavioral/State/CreateOrder.php b/Behavioral/State/CreateOrder.php index 4a35ac3..ec4e542 100644 --- a/Behavioral/State/CreateOrder.php +++ b/Behavioral/State/CreateOrder.php @@ -2,34 +2,17 @@ namespace DesignPatterns\Behavioral\State; -class CreateOrder implements Order +class CreateOrder extends StateOrder { - /** - * @var array - */ - private $details; - - /** - * @param array $details - */ - public function __construct(array $details) + public function __construct() { - $this->details = $details; + $this->setStatus('created'); } - public function shipOrder() + protected function done() { - $this->details['status'] = 'shipping'; - $this->details['updatedTime'] = time(); - } - - public function completeOrder() - { - throw new \Exception('Can not complete the order which status is created'); - } - - public function getStatus(): string - { - return $this->details['status']; + $order = new ShippingOrder(); + static::$state = $order; + //$this->setStatus('shipping'); } } diff --git a/Behavioral/State/Order.php b/Behavioral/State/Order.php deleted file mode 100644 index ea85159..0000000 --- a/Behavioral/State/Order.php +++ /dev/null @@ -1,18 +0,0 @@ - ['status' => 'created'], - 2 => ['status' => 'shipping'], - 3 => ['status' => 'completed'], - ]; - - public static function findById(int $id): Order - { - if (!isset(self::$orders[$id])) { - throw new \InvalidArgumentException(sprintf('Order with id %d does not exist', $id)); - } - - $order = self::$orders[$id]; - - switch ($order['status']) { - case 'created': - return new CreateOrder($order); - case 'shipping': - return new ShippingOrder($order); - default: - throw new \InvalidArgumentException('Invalid order status given'); - break; - } - } -} diff --git a/Behavioral/State/README.rst b/Behavioral/State/README.rst index 30b3e1a..50e3cbd 100644 --- a/Behavioral/State/README.rst +++ b/Behavioral/State/README.rst @@ -20,15 +20,15 @@ Code You can also find this code on `GitHub`_ -OrderRepository.php +ContextOrder.php -.. literalinclude:: OrderRepository.php +.. literalinclude:: ContextOrder.php :language: php :linenos: -Order.php +StateOrder.php -.. literalinclude:: Order.php +.. literalinclude:: StateOrder.php :language: php :linenos: diff --git a/Behavioral/State/ShippingOrder.php b/Behavioral/State/ShippingOrder.php index 41198b2..06032eb 100644 --- a/Behavioral/State/ShippingOrder.php +++ b/Behavioral/State/ShippingOrder.php @@ -2,34 +2,15 @@ namespace DesignPatterns\Behavioral\State; -class ShippingOrder implements Order +class ShippingOrder extends StateOrder { - /** - * @var array - */ - private $details; - - /** - * @param array $details - */ - public function __construct(array $details) + public function __construct() { - $this->details = $details; + $this->setStatus('shipping'); } - public function shipOrder() + protected function done() { - throw new \Exception('Can not ship the order which status is shipping!'); - } - - public function completeOrder() - { - $this->details['status'] = 'completed'; - $this->details['updatedTime'] = time(); - } - - public function getStatus(): string - { - return $this->details['status']; + $this->setStatus('completed'); } } diff --git a/Behavioral/State/StateOrder.php b/Behavioral/State/StateOrder.php new file mode 100644 index 0000000..b003cb7 --- /dev/null +++ b/Behavioral/State/StateOrder.php @@ -0,0 +1,32 @@ +details['status'] = $status; + $this->details['updatedTime'] = time(); + } + + protected function getStatus(): string + { + return $this->details['status']; + } +} diff --git a/Behavioral/State/Tests/StateTest.php b/Behavioral/State/Tests/StateTest.php index 7f9ea4e..834c02c 100644 --- a/Behavioral/State/Tests/StateTest.php +++ b/Behavioral/State/Tests/StateTest.php @@ -2,33 +2,30 @@ namespace DesignPatterns\Behavioral\State\Tests; -use DesignPatterns\Behavioral\State\OrderRepository; +use DesignPatterns\Behavioral\State\ContextOrder; +use DesignPatterns\Behavioral\State\CreateOrder; use PHPUnit\Framework\TestCase; class StateTest extends TestCase { public function testCanShipCreatedOrder() { - $order = (new OrderRepository())->findById(1); - $order->shipOrder(); + $order = new CreateOrder(); + $contextOrder = new ContextOrder(); + $contextOrder->setState($order); + $contextOrder->done(); - $this->assertEquals('shipping', $order->getStatus()); + $this->assertEquals('shipping', $contextOrder->getStatus()); } public function testCanCompleteShippedOrder() { - $order = (new OrderRepository())->findById(2); - $order->completeOrder(); + $order = new CreateOrder(); + $contextOrder = new ContextOrder(); + $contextOrder->setState($order); + $contextOrder->done(); + $contextOrder->done(); - $this->assertEquals('completed', $order->getStatus()); - } - - /** - * @expectedException \Exception - */ - public function testThrowsExceptionWhenTryingToCompleteCreatedOrder() - { - $order = (new OrderRepository())->findById(1); - $order->completeOrder(); + $this->assertEquals('completed', $contextOrder->getStatus()); } } diff --git a/Behavioral/State/uml/uml.png b/Behavioral/State/uml/uml.png index 847a4e47cbbbb025042bed94785af42966b45f68..e95b39a52578609d83234a56e8dc9779c7b4bc11 100644 GIT binary patch literal 22989 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 + - + - + - + - + - + + + + + + + + + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - - - - + - - + + - + - - + + - - + + - - + + - - + + - - - - - - order + + + + + + __construct() - - + + - - + + - - - - - __construct(order) + + + + + + done() - - + + - - + + + - - - - - shipOrder() + + - - + + ShippingOrder - - - - - completeOrder() + + ShippingOrder - - + + - - - + + - - + + - - CreateOrder + + + + + + __construct() - - CreateOrder + + - - + + - - + + + + + + done() - - + + - - + + + - - - - - __construct() + + - - + + ShippingOrder - - + + ShippingOrder - - - - - getOrder(id) + + - - + + - - - + + - - + + - - OrderFactory + + + + + + __construct() - - OrderFactory + + - - + + - - + + + + + + done() - - + + - - + + + - - - - - shipAction(id) + + - - + + CreateOrder - - - - - completeAction(id) + + CreateOrder - - + + - - - + + - - + + - - OrderController + + + + + + __construct() - - OrderController + + - - + + - - + + + + + + done() - - + + - - + + + - - - - - shipOrder() + + - - + + CreateOrder - - - - - completeOrder() + + CreateOrder - - + + - - - + + - - + + - - OrderInterface + + - - OrderInterface + + + + + + details - - + + - - + + + + + + + state + + + + + + + + + + + + + done() + + + - - + + + + + + setStatus(status) + + + + + + + + + + getStatus() + + + + + + + - - + + + + + StateOrder + + + StateOrder + + + + + + + + + + + + + + + + details + + + + + + + + + + + state + + + + + + + + + + + + + done() + + + + + + + + + + setStatus(status) - - - - - - order + + + + + + + + + getStatus() + + + + + + + + + + + + + StateOrder + + + StateOrder + + + + + + + + + + + + + + + + + + + getState() + + + + + + + + + + setState(state) + + + + + + + + + + done() + + + + + + + + + + getStatus() + + + + + + + + + + + + + ContextOrder + + + ContextOrder + + + + + + + + + - - + + + + + + getState() + + + - - + + + + + + setState(state) - - - - - __construct(order) + + - - - - - - - - - - - shipOrder() - - - - - - - - - completeOrder() - - - - - - - - - - - - - ShippingOrder - - - ShippingOrder - - - - - - - - + + + + + + done() + + + + + + + + + + getStatus() + + + + + + + + + + + + + ContextOrder + + + ContextOrder + + + + + + + + + + From 590b15b58dce62b0a2ba8379423dfe7a63a5f56c Mon Sep 17 00:00:00 2001 From: ko22009 Date: Wed, 10 May 2017 18:53:03 +0500 Subject: [PATCH 2/2] remove comment and superfluously state --- Behavioral/State/CreateOrder.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Behavioral/State/CreateOrder.php b/Behavioral/State/CreateOrder.php index ec4e542..9c95b61 100644 --- a/Behavioral/State/CreateOrder.php +++ b/Behavioral/State/CreateOrder.php @@ -11,8 +11,6 @@ class CreateOrder extends StateOrder protected function done() { - $order = new ShippingOrder(); - static::$state = $order; - //$this->setStatus('shipping'); + static::$state = new ShippingOrder(); } }