恕我直言,您应该使用多态性。
这个视频可以帮助你理解这个原理
这是我的想法。
首先,为您需要的任何操作定义一个接口
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
并立即知道哪个文件包含所需的行为。