当前位置: 首页 > 后端技术 > PHP

代码重构消除分支结构

时间:2023-03-29 19:02:34 PHP

1、为什么要淘汰if-else写第一行if-else的时候,就为后面几十个if-else的发展埋下了伏笔。当if-else很可能膨胀时,它就必须膨胀。--Murphy举个例子:$userType='';if($userTypeID==1){$userType='Admin';}elseif($userTypeID==2){$userType='CorporateCustomers';}看起来是非常漂亮和简洁。但是当系统逐渐复杂,角色不断丰富时,就变成了这样的代码:$userType='';if($userTypeID==1){$userType='Admin';}elseif($userTypeID==2){$userType='企业客户';}elseif($userTypeID==3){$userType='编辑用户';}elseif($userTypeID==4){$userType='摄影师';}elseif($userTypeID==5){$userType='Vendors';}举个极端的例子:可以说是非常恐怖了。2.如何排除if-else排除固定值的if-else这种条件我们可以用查表的方法来排除。通过容器存储对应关系。通过计算得到其中一种对应关系的结果,然后用这个结果在容器中找到对应的内容。通俗地说,就是创建一个对象或数组的哈希表,判断key值的存储条件,将value按照条件判断的逻辑处理进行存储。例如上面的代码可以写成:constUSER_TYPE_ADMIN=1;常量USER_TYPE_CORPORATE=2;constUSER_TYPE_EDITORIAL=3;constUSER_TYPE_PHOTOGRAPHERS=4;常量USER_TYPE_VENDORS=5;$data=array(self::USER_TYPE_ADMIN=>'Admin',self::USER_TYPE_CORPORATE=>'企业客户',self::USER_TYPE_EDITORIAL=>'编辑用户',self::USER_TYPE_PHOTOGRAPHERS=>'摄影师',self::USER_TYPE_VENDORS=>'供应商',);返回$key===null?$data:(isset($data[$key])?$data[$key]:'');}这样,上面一大段if-else用一行代码搞定:$userType=User::getUserTypeName($userTypeID)在JavaScript中是这样描述的:letuserTypeObj={1:'Admin',2:'企业客户',3:'编辑用户',4:'摄影师',5:'供应商',};letuserTypeName=userTypeObj[userTypeID];上面的例子只是不同的userTypeID得到不同的userTypeName。考虑更复杂的情况,当不同的userTypeID,不同的逻辑处理。if(userTypeID==1){//Todo...}elseif(userTypeID==2){//Todo...}elseif(userTypeID==3){//Todo...}elseif(userTypeID==4){//Todo...}这时候可以把里面的逻辑处理代码抽出来一个函数:letuserTypeObj={1:()=>{//Todo...},2:()=>{//Todo...},3:()=>{//Todo...},4:()=>{//Todo...},};userTypeObj[userTypeID]();上面的代码也可以用PHP的可变变量/面向对象的多态特性来实现。缺点:查表方式的实现需要进行越界检查,还需要保证下标计算不会重复。如果使用面向对象的多态性,还会存在策略类增多等问题。这种查表方式的实现其实就是策略模式的思想。策略模式是指定义一系列算法,然后将它们一个一个封装起来。策略模式的目的是将算法的使用和算法的实现分开。关于策略模式的更多解释请看这里三。总结if-else当然有用,比如mysql链接,curl返回码等,开始写的时候,if-else只有一个,我们不用剔除,但是当我们要写第三个的时候而第四个分支,或者说每个条件分支都有一大段逻辑处理代码,就要考虑去掉了。当条件语句不是固定值而是范围值时,如何消除if-else请教:if(x<30){//todo}elseif(x>=30){//todo}