From af0fccfef33593118f9525087b0b612d91f2614c Mon Sep 17 00:00:00 2001 From: Roman Martinuk <romanmartinuk@gmail.com> Date: Sun, 14 Mar 2021 18:40:48 +0300 Subject: [PATCH] add pattern Interpreter --- Behavioral/Interpreter/AbstractExp.php | 8 +++ Behavioral/Interpreter/AndExp.php | 20 ++++++ Behavioral/Interpreter/Context.php | 24 +++++++ Behavioral/Interpreter/OrExp.php | 20 ++++++ .../Interpreter/Tests/InterpreterTest.php | 63 ++++++++++++++++++ Behavioral/Interpreter/VariableExp.php | 23 +++++++ Behavioral/Interpreter/uml/uml.png | Bin 0 -> 22922 bytes 7 files changed, 158 insertions(+) create mode 100644 Behavioral/Interpreter/AbstractExp.php create mode 100644 Behavioral/Interpreter/AndExp.php create mode 100644 Behavioral/Interpreter/Context.php create mode 100644 Behavioral/Interpreter/OrExp.php create mode 100644 Behavioral/Interpreter/Tests/InterpreterTest.php create mode 100644 Behavioral/Interpreter/VariableExp.php create mode 100644 Behavioral/Interpreter/uml/uml.png diff --git a/Behavioral/Interpreter/AbstractExp.php b/Behavioral/Interpreter/AbstractExp.php new file mode 100644 index 0000000..5e34736 --- /dev/null +++ b/Behavioral/Interpreter/AbstractExp.php @@ -0,0 +1,8 @@ +<?php declare(strict_types=1); + +namespace DesignPatterns\Behavioral\Interpreter; + +abstract class AbstractExp +{ + abstract public function interpret(Context $context): bool; +} diff --git a/Behavioral/Interpreter/AndExp.php b/Behavioral/Interpreter/AndExp.php new file mode 100644 index 0000000..9715ddb --- /dev/null +++ b/Behavioral/Interpreter/AndExp.php @@ -0,0 +1,20 @@ +<?php declare(strict_types=1); + +namespace DesignPatterns\Behavioral\Interpreter; + +class AndExp extends AbstractExp +{ + private AbstractExp $first; + private AbstractExp $second; + + public function __construct(AbstractExp $first, AbstractExp $second) + { + $this->first = $first; + $this->second = $second; + } + + public function interpret(Context $context): bool + { + return (bool) $this->first->interpret($context) && $this->second->interpret($context); + } +} diff --git a/Behavioral/Interpreter/Context.php b/Behavioral/Interpreter/Context.php new file mode 100644 index 0000000..2a0b2c7 --- /dev/null +++ b/Behavioral/Interpreter/Context.php @@ -0,0 +1,24 @@ +<?php declare(strict_types=1); + +namespace DesignPatterns\Behavioral\Interpreter; + +use Exception; + +class Context +{ + private array $poolVariable; + + public function lookUp(string $name): bool + { + if (!key_exists($name, $this->poolVariable)) { + throw new Exception("no exist variable: $name"); + } + + return $this->poolVariable[$name]; + } + + public function assign(VariableExp $variable, bool $val) + { + $this->poolVariable[$variable->getName()] = $val; + } +} diff --git a/Behavioral/Interpreter/OrExp.php b/Behavioral/Interpreter/OrExp.php new file mode 100644 index 0000000..db3ba1b --- /dev/null +++ b/Behavioral/Interpreter/OrExp.php @@ -0,0 +1,20 @@ +<?php declare(strict_types=1); + +namespace DesignPatterns\Behavioral\Interpreter; + +class OrExp extends AbstractExp +{ + private AbstractExp $first; + private AbstractExp $second; + + public function __construct(AbstractExp $first, AbstractExp $second) + { + $this->first = $first; + $this->second = $second; + } + + public function interpret(Context $context): bool + { + return $this->first->interpret($context) || $this->second->interpret($context); + } +} diff --git a/Behavioral/Interpreter/Tests/InterpreterTest.php b/Behavioral/Interpreter/Tests/InterpreterTest.php new file mode 100644 index 0000000..3b1c07a --- /dev/null +++ b/Behavioral/Interpreter/Tests/InterpreterTest.php @@ -0,0 +1,63 @@ +<?php declare(strict_types=1); + +namespace DesignPatterns\Behavioral\Interpreter\Tests; + +use DesignPatterns\Behavioral\Interpreter\AndExp; +use DesignPatterns\Behavioral\Interpreter\Context; +use DesignPatterns\Behavioral\Interpreter\OrExp; +use DesignPatterns\Behavioral\Interpreter\VariableExp; +use PHPUnit\Framework\TestCase; + +class InterpreterTest extends TestCase +{ + private Context $context; + private VariableExp $a; + private VariableExp $b; + private VariableExp $c; + + public function setUp(): void + { + $this->context = new Context(); + $this->a = new VariableExp('A'); + $this->b = new VariableExp('B'); + $this->c = new VariableExp('C'); + } + + public function testOr() + { + $this->context->assign($this->a, false); + $this->context->assign($this->b, false); + $this->context->assign($this->c, true); + + // A ∨ B + $exp1 = new OrExp($this->a, $this->b); + $result1 = $exp1->interpret($this->context); + + $this->assertFalse($result1, 'A ∨ B must false'); + + // $exp1 ∨ C + $exp2 = new OrExp($exp1, $this->c); + $result2 = $exp2->interpret($this->context); + + $this->assertTrue($result2, '(A ∨ B) ∨ C must true'); + } + + public function testAnd() + { + $this->context->assign($this->a, true); + $this->context->assign($this->b, true); + $this->context->assign($this->c, false); + + // A ∧ B + $exp1 = new AndExp($this->a, $this->b); + $result1 = $exp1->interpret($this->context); + + $this->assertTrue($result1, 'A ∧ B must true'); + + // $exp1 ∧ C + $exp2 = new AndExp($exp1, $this->c); + $result2 = $exp2->interpret($this->context); + + $this->assertFalse($result2, '(A ∧ B) ∧ C must false'); + } +} diff --git a/Behavioral/Interpreter/VariableExp.php b/Behavioral/Interpreter/VariableExp.php new file mode 100644 index 0000000..f7fc871 --- /dev/null +++ b/Behavioral/Interpreter/VariableExp.php @@ -0,0 +1,23 @@ +<?php declare(strict_types=1); + +namespace DesignPatterns\Behavioral\Interpreter; + +class VariableExp extends AbstractExp +{ + private string $name; + + public function __construct(string $name) + { + $this->name = $name; + } + + public function interpret(Context $context): bool + { + return $context->lookUp($this->name); + } + + public function getName(): string + { + return $this->name; + } +} diff --git a/Behavioral/Interpreter/uml/uml.png b/Behavioral/Interpreter/uml/uml.png new file mode 100644 index 0000000000000000000000000000000000000000..09d372bd81a019619581da775a35b0dfcc6fb014 GIT binary patch literal 22922 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 literal 0 HcmV?d00001