Oop 从硬编码到PHP中的可靠原则

Oop 从硬编码到PHP中的可靠原则,oop,solid-principles,Oop,Solid Principles,我实际上在阅读关于干净代码和坚实原则的理论。我很清楚,我们应该编程到接口,而不是实现 因此,我实际上尝试将这些原则应用于我的代码的一小部分。我想听听你的建议或观点,这样我才能知道我是否朝着好的方向前进。我将向您展示我以前的代码和我的实际代码,这样您就可以直观地看到演变过程 首先,我的控制器中有一种方法,可以检查订单流程每个步骤的一些要求(用户必须按照正确的顺序遵循4个步骤=>1、2、3、4) 这是我的旧代码: private function isAuthorizedStep($stepNumb

我实际上在阅读关于干净代码和坚实原则的理论。我很清楚,我们应该编程到接口,而不是实现

因此,我实际上尝试将这些原则应用于我的代码的一小部分。我想听听你的建议或观点,这样我才能知道我是否朝着好的方向前进。我将向您展示我以前的代码和我的实际代码,这样您就可以直观地看到演变过程

首先,我的控制器中有一种方法,可以检查订单流程每个步骤的一些要求(用户必须按照正确的顺序遵循4个步骤=>1、2、3、4)

这是我的旧代码:

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 } 私有函数isAuthorizedStep($stepNumber) { $isStepAccessAuthorized=TRUE; 交换机($stepNumber){ case self::ORDER\u STEP\u TWO://ORDER\u STEP\u TWO=2 如果(!($\会话['actualOrderStep']>=订单\步骤\第一步)){ $isStepAccessAuthorized=FALSE; } 打破 案例本身::顺序步骤三: 如果(!($\会话['actualOrderStep']>=顺序\步骤\两个)){ $isStepAccessAuthorized=FALSE; } 打破 ... } 返回$isStepAccessAuthorized; } 公共函数orderStep2() { 如果($this->isAuthorizedStep(self::ORDER\u STEP\u TWO){ 返回; } …做点什么 //在所有验证之后: $\会话['actualOrderStep']=顺序\u步骤\u二 } 为了符合坚实的原则,我按照以下逻辑拆分了代码:

  • 从控制器中提取硬编码逻辑以将其放入类中(可重用性)
  • 使用依赖注入和抽象
接口规则接口{ 公共功能匹配($int); } 类StepAccessControl { 受保护的规则; 公共函数构造(数组$规则) { foreach($key=>$rule的规则){ $this->addRule($key,$rule); } } public isaccessgrated($actuatorlorderstep) { $isAccessGranded=TRUE; foreach($this->rules as$rule){ 如果(!$rule->匹配($actuatorlorderstep){ $isAccessGranded=FALSE; } } 返回$isaccessgranded; } 公共函数addRule($key,RuleInterface$rule) { $this->rules[$key]=$rule; } } 类OrderStepTwoRule实现RuleInterface { 公共函数匹配($actualStep) { $matches=TRUE; 如果(!($actualStep>=1)){ $isStepAccessAuthorized=FALSE; } 返回$matches; } } 类StepAccessControlFactory { 公共功能构建($stepNumber) { 如果($stepNumber==1){ ... }elseif($stepNumber==2){ $orderStepTwoRule=新的orderStepTwoRule(); 返回新的StepAcesControl($orderStepTwoRule); }... } } 然后在控制器中:

public function stepTwoAction() { $stepAccessControlFactory = new StepAccessControlFactory(); $stepTwoAccessControl = $stepAccessControlFactory(2); if (!$stepTwoAccessControl->isAccesGranted($_SESSION['actualOrderStep'])) { return FALSE; } } 公共职能第二步行动() { $stepAccessControlFactory=新的stepAccessControlFactory(); $stepTwoAccessControl=$stepAccessControlFactory(2); 如果(!$stepTwoAccessControl->IsAccessGranted($\u会话['actualOrderStep'])){ 返回FALSE; } }
我想知道我是否得到了精神,我是否走上了好的道路:)

只有一个建议…不要把所有的
都写得很扎实
…有些原则真的很难实现(例如LSP)…我的意思是,不要获取所有这些信息本身;做出你自己的假设,并尝试阅读许多人如何以更易于管理的方式简化这些原则…好的,我会记住这一事实。有没有人能告诉我我的方向是否正确?:)我认为你已经走上了正轨……我可以问你为什么要尝试在php上使用
SOLID
,而不是另一种更加面向对象的编程和传统语言,比如
Java
C
?如果你只是想查看代码,你可以在codereview上发布它 public function stepTwoAction() { $stepAccessControlFactory = new StepAccessControlFactory(); $stepTwoAccessControl = $stepAccessControlFactory(2); if (!$stepTwoAccessControl->isAccesGranted($_SESSION['actualOrderStep'])) { return FALSE; } }