一. 为什么要消除 if-else

当写下第一行 if-else 时,就为发展成几十个 if-else 埋下了伏笔.

当一个 if-else 有可能臃肿时,那么它一定会臃肿.  --墨菲

一个例子:

$userType = '';
if ($userTypeID == 1){$userType = 'Admin';
}elseif($userTypeID == 2){$userType = 'Corporate Customers';
}

看起来非常美妙,简洁.但是当系统慢慢复杂化,角色不断的丰富,就变成这样的代码:

$userType = '';
if ($userTypeID == 1){$userType = 'Admin';
}elseif($userTypeID == 2){$userType = 'Corporate Customers';
}elseif($userTypeID == 3){$userType = 'Editorial Users';
}elseif($userTypeID == 4){$userType = 'Photographers';
}elseif($userTypeID == 5){$userType = 'Vendors';
}

来个极端的例子:

可以说非常可怕了.

二. 如何消除 if-else

消除这种条件里都是定值的 if-else 我们可以采用 查表法 来消除.

通过容器将对应的关系进行存储。通过运算得出相应关系中的其中一方的结果,再通过这个结果去容器中找对应的另一个内容

通俗的说,就是建立一个对象或者数组的 hash 表, key 值存储条件判断, value 存储符合该条件判断的逻辑处理.
比如上面的代码可以写成:

  const USER_TYPE_ADMIN = 1;const USER_TYPE_CORPORATE = 2;const USER_TYPE_EDITORIAL = 3;const USER_TYPE_PHOTOGRAPHERS = 4;const USER_TYPE_VENDORS = 5;public function getUserTypeName($key = null){$data = array(self::USER_TYPE_ADMIN => 'Admin',self::USER_TYPE_CORPORATE => 'Corporate Customers',self::USER_TYPE_EDITORIAL => 'Editorial Users',self::USER_TYPE_PHOTOGRAPHERS => 'Photographers',self::USER_TYPE_VENDORS => 'Vendors',);return $key === null ? $data : (isset($data[$key]) ? $data[$key] : '');}

这样,上面的一大段的 if-else 就一行代码搞定: $userType = User::getUserTypeName($userTypeID)

用 JavaScrip 语言来描述:

let userTypeObj = {1: 'Admin',2: 'Corporate Customers',3: 'Editorial Users',4: 'Photographers',5: 'Vendors',
};let userTypeName = userTypeObj[userTypeID];

上面的例子只是不同的 userTypeID 获取不同的 userTypeName. 考虑更复杂的情况,当不同的 userTypeID 时进行不同逻辑处理.

if (userTypeID == 1) {//Todo ...
} else if(userTypeID == 2) {//Todo ...
} else if(userTypeID == 3) {//Todo ...
} else if(userTypeID == 4) {//Todo ...
}

这个时候可以把里面的逻辑处理代码抽出来为一个函数:

let userTypeObj = {1: () => {//Todo...},2: () => {//Todo...},3: () => {//Todo...},4: () => {//Todo...},
};userTypeObj[userTypeID]();

以上代码也可以以 php 的可变变量/面向对象的多态特性来实现.

缺点:查表法的实现,要做越界检查,还要确保下标计算不会重复,如果使用面向对象的多态特性来实现,也有策略类增多等问题.

这个查表法的实现,其实是策略模式的思想.

策略模式指的是定义一系列的算法,把他们一个个的封装起来.策略模式的目的就是将算法的使用与算法的实现分离开来.

更多关于策略模式的讲解,请看这里

三. 总结

if-else 当然是有用的,比如 mysql 链接, curl 的返回码等等.当开始写的时候,只有一个 if-else ,我们可以不去消除,但是当要写到第三个第四个分支,或者每个条件分支里面都有大段大段的逻辑处理代码,我们就要考虑消除它了.

当条件语句不是定值,而是范围值的时候,如何消除 if-else 求教:

if(x < 30){//todo
}else if(x >= 30 ){//todo
}

代码重构之消除分支结构相关推荐

  1. 【MATLAB】流程控制 ( 循环结构 | for 循环 | while 循环 | 分支结构 | if end 分支结构 | if else end 分支结构 | switch case 分支结构 )

    文章目录 一.MATLAB 流程控制结构 二.for 循环 1.for 循环 2.嵌套 for 循环 三.while 循环 二.分支结构 1.if end 分支结构 2.if else end 分支结 ...

  2. Java标识符命名规则,运算符,分支结构

    Java标识符命名规则,运算符,分支结构 1 Java标识符命名规则 1.1命名规则案例 163邮箱,注册邮箱名限制6~18个字符,可使用字母,数字,下划线,需要以字母开头命名规则分析1.有长度限制2 ...

  3. 04、switch-case分支结构、循环结构

    Day04_Java基础语法 1.分支结构 1.1 switch-case 分支结构 格式: switch (表达式) {case 常量1:语句块1;break;case 常量2:语句块2;break ...

  4. python控制结构(一)if分支入门_【2020Python修炼记12】Python语法入门—流程控制(if分支结构+while/for循环结构)...

    一.条件 灵魂三问: 什么是条件?什么可以当做条件?为何要用条件? 1. 条件,就是判断依据,判断前提-- 2.条件的类型 # 第一大类:显式布尔值 条件可以是:比较运算符 # age = 18 # ...

  5. Java基础之分支结构

    一:java程序的三种流程结构: 1.顺序结构:程序由上往下依次执行. 2.分支结构{if语句.switch语句}: 在顺序结构基础上,根据某种条件的是否成立,执行不同的代码. 3.循环结构{whil ...

  6. #华为云·寻找黑马程序员#【代码重构之路】如何“消除”if/else

    1. 背景 if/else是高级编程语言中最基础的功能,虽然 if/else 是必须的,但滥用 if/else,特别是各种大量的if/else嵌套,会对代码的可读性.可维护性造成很大伤害,对于阅读代码 ...

  7. 代码重构之旅(一) 项目结构

    起因 之前说过自己被分配了一个重构代码的任务: 这是一个有6.7年历史,多人经手的老系统,PHP 语言,分布在50台机器上运行.代码使用最简单的结构,没有使用任何完整框架,甚至有三四千行代码的文件,修 ...

  8. 无码系列5.1 代码重构 消除重复代码

    1 前言 本文可以视为对ThoughtWorks高级顾问yuanyingjie关于"正交四原则"策略"消除重复"的"个人解读". 如有谬误, ...

  9. Python教学 | Python 中的分支结构(判断语句)【附本文代码和数据】

    查看原文:[数据seminar]Python教学 | Python 中的分支结构(判断语句)[附本文代码和数据] Part1引言 上期文章我们学习了组合数据类型字典以及元组,这标志着 Python 基 ...

最新文章

  1. PyTorch 笔记(08)— Tensor 比较运算(torch.gt、lt、ge、le、eq、ne、torch.topk、torch.sort、torch.max、torch.min)
  2. 从键盘输入10个互不相同的整数,找出其中最小的元素将其与数组中的第一个元素进行交换。
  3. git找回误删的文件
  4. python比java简单好学-21、PHP和python/JAVA比,哪个更好学?
  5. vsftpd的不同安装方式及服务控制脚本
  6. Could not open app - SAP UI5 error message
  7. 安装linux18双系统,Win10 安装Linux ubuntu-18.04双系统(安装指南)
  8. java版电子商务spring cloud分布式微服务b2b2c社交电商(四)SpringBoot 整合JPA
  9. 日本企业RPA导入风险分析和解决对策
  10. 8-1-Filter过滤器
  11. 有幸和一位企业家聊天,他白手起家
  12. M - Corporate Identity(多组字符串匹配问题)
  13. JAVA语言基础-面向对象(IO:IO字节流)
  14. 基于遗传算法车辆路径问题(VRP)
  15. Interview Tips with Consulting Firms
  16. 惊!用python将数据存到txt文件中发现顺序乱排或缺斤少两
  17. IDEA中Resource Bundle ‘application‘
  18. 安卓Android拍照车牌,车牌扫描识别技术SDK
  19. macOS长按键盘重复输入
  20. latex表格调整行距

热门文章

  1. 东方财富上半年净利同比大增30倍
  2. HE同态加密(Microsoft SEAL) 实例小试
  3. k8s考证-CKA真题
  4. linux中pl怎么使用教程,petalinux初学者-使用教程-快速入门
  5. 2020EdgeX中国挑战赛 | 决赛路演成功举办
  6. 从通达信中获取得到股票、期货等金融标的的分时数据。
  7. 【运维面试】面试官: tomcat三个端口号的作用
  8. 在线文字转语音哪个比较好
  9. 也看二代身份证的安全问题
  10. 4一20ma电流有源与无源区别_一文读懂传感器技术中的有源信号和无源信号