IMHO、ポリモーフィズムを使用する必要があります。
このビデオは、この原則を理解するのに役立ちます
これが私の考え方です。
まず、必要な操作のインターフェイスを定義します
interface OperationInterface
{
public function evaluate(array $operands = array());
}
次に、電卓ホルダーを作成します
class Calculator
{
protected $operands = array();
public function setOperands(array $operands = array())
{
$this->operands = $operands;
}
public function addOperand($operand)
{
$this->operands[] = $operand;
}
/**
* You need any operation that implement the given interface
*/
public function setOperation(OperationInterface $operation)
{
$this->operation = $operation;
}
public function process()
{
return $this->operation->evaluate($this->operands);
}
}
次に、加算などの操作を定義できます
class Addition implements OperationInterface
{
public function evaluate(array $operands = array())
{
return array_sum($operands);
}
}
そして、あなたはそれを次のように使用します:
$calculator = new Calculator;
$calculator->setOperands(array(4,2));
$calculator->setOperation(new Addition);
echo $calculator->process(); // 6
その時点で、新しい動作を追加したり、既存の動作を変更したりする場合は、クラスを作成または編集するだけです。
たとえば、モジュラス演算が必要だとします。
class Modulus implements OperationInterface
{
public function evaluate(array $operands = array())
{
$equals = array_shift($operands);
foreach ($operands as $value) {
$equals = $equals % $value;
}
return $equals;
}
}
それで、
$calculator = new Calculator;
$calculator->setOperands(array(4,2));
$calculator->setOperation(new Addition); // 4 + 2
echo $calculator->process(); // 6
$calculator->setOperation(new Modulus); // 4 % 2
echo $calculator->process(); // 0
$calculator->setOperands(array(55, 10)); // 55 % 10
echo $calculator->process(); // 5
このソリューションにより、コードをサードパーティのライブラリにすることができます
このコードを再利用したり、ライブラリとして提供したりする場合、ユーザーはソース コードを変更することは決してありません。しかし、定義されていないまたはメソッドが 必要
な場合はどうすればよいでしょうか?Substraction
BackwardSubstraction
彼は自分のプロジェクトで独自のクラスを作成するだけで済みます。これは、ライブラリを操作するためにSubstraction
実装されます。OperationInterface
読みやすくなっています
プロジェクトのアーキテクチャを見ると、このようなフォルダーが見やすいです
- app/
- lib/
- Calculator/
- Operation/
- Addition.php
- Modulus.php
- Substraction.php
- OperationInterface.php
- Calculator.php
そして、どのファイルに目的の動作が含まれているかがすぐにわかります。