在PHP中从硬编码原则转变为SOLID原则

时间:2017-01-05 13:41:27

标签: oop solid-principles

我实际上正在阅读关于清洁代码和SOLID原则的理论。我知道我们应该编程接口而不是实现。

所以,我实际上尝试将这些原则应用于我的代码的一小部分。我想得到你的建议或观点,以便我知道我是否朝着正确的方向前进。我将向您展示我之前的代码和我的实际代码,以便您可以直观地了解它。

首先,我在我的控制器中有一个方法来检查订单处理的每个步骤的一些要求(用户必须遵循正确顺序的4个步骤=&gt; 1然后2然后3个然后4个)< / p>

这是我的旧代码:


    private function isAuthorizedStep($stepNumber)
    {
        $isStepAccessAuthorized = TRUE;

        switch($stepNumber) {
            case self::ORDER_STEP_TWO: // ORDER_STEP_TWO = 2
                if (!($_SESSION['actualOrderStep'] >= ORDER_STEP_ONE)) {
                    $isStepAccessAuthorized = FALSE;
                }
                break;

            case self::ORDER_STEP_THREE:
                if (!($_SESSION['actualOrderStep'] >= ORDER_STEP_TWO)) {
                    $isStepAccessAuthorized = FALSE;
                }
                break;

            ...
        }

        return $isStepAccessAuthorized;
    }

    public function orderStepTwo()
    {
        if ($this->isAuthorizedStep(self::ORDER_STEP_TWO) {
            return;
        }

        ... // do some stuff

        // after all the verifications: 
        $_SESSION['actualOrderStep'] = ORDER_STEP_TWO
    }

为了符合SOLID原则,我按照这个逻辑分割了我的代码:

  • 从控制器中提取硬编码逻辑以将其放入类中(可重用性)
  • 使用依赖注入和抽象

    interface RuleInterface {
        public function matches($int);
    }

    class StepAccessControl
    {
       protected $rules;

       public function __construct(array $rules)
       {
           foreach($rules as $key => $rule) {
               $this->addRule($key, $rule);
           }
       }

       public isAccessGranted($actualOrderStep)
       {
           $isAccessGranted = TRUE;

           foreach($this->rules as $rule) {
               if (!$rule->matches($actualOrderStep) {
                   $isAccessGranted = FALSE;
               }
           }

           return $isAccessGranted;
       }

       public function addRule($key, RuleInterface $rule)
       {
           $this->rules[$key] = $rule;
       }
    }

    class OrderStepTwoRule implements RuleInterface
    {
        public function matches($actualStep)
        {
            $matches = TRUE;

            if (!($actualStep >= 1)) {
                $isStepAccessAuthorized = FALSE;
            }

            return $matches;
        }
    }

    class StepAccessControlFactory
    {
        public function build($stepNumber)
        {
            if ($stepNumber == 1) {
                ...
            } elseif ($stepNumber == 2) {
                $orderStepTwoRule = new OrderStepTwoRule();
                return new StepAcessControl($orderStepTwoRule);
            }...
        }
    }

然后在控制器中:


    public function stepTwoAction()
    {
        $stepAccessControlFactory = new StepAccessControlFactory();
        $stepTwoAccessControl = $stepAccessControlFactory(2);

        if (!$stepTwoAccessControl->isAccesGranted($_SESSION['actualOrderStep'])) {
            return FALSE;
        }
    }

我想知道我是否得到了精神,如果我的方式很好:)

0 个答案:

没有答案