代码重构之消除分支结构
一. 为什么要消除 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
}
代码重构之消除分支结构相关推荐
- 【MATLAB】流程控制 ( 循环结构 | for 循环 | while 循环 | 分支结构 | if end 分支结构 | if else end 分支结构 | switch case 分支结构 )
文章目录 一.MATLAB 流程控制结构 二.for 循环 1.for 循环 2.嵌套 for 循环 三.while 循环 二.分支结构 1.if end 分支结构 2.if else end 分支结 ...
- Java标识符命名规则,运算符,分支结构
Java标识符命名规则,运算符,分支结构 1 Java标识符命名规则 1.1命名规则案例 163邮箱,注册邮箱名限制6~18个字符,可使用字母,数字,下划线,需要以字母开头命名规则分析1.有长度限制2 ...
- 04、switch-case分支结构、循环结构
Day04_Java基础语法 1.分支结构 1.1 switch-case 分支结构 格式: switch (表达式) {case 常量1:语句块1;break;case 常量2:语句块2;break ...
- python控制结构(一)if分支入门_【2020Python修炼记12】Python语法入门—流程控制(if分支结构+while/for循环结构)...
一.条件 灵魂三问: 什么是条件?什么可以当做条件?为何要用条件? 1. 条件,就是判断依据,判断前提-- 2.条件的类型 # 第一大类:显式布尔值 条件可以是:比较运算符 # age = 18 # ...
- Java基础之分支结构
一:java程序的三种流程结构: 1.顺序结构:程序由上往下依次执行. 2.分支结构{if语句.switch语句}: 在顺序结构基础上,根据某种条件的是否成立,执行不同的代码. 3.循环结构{whil ...
- #华为云·寻找黑马程序员#【代码重构之路】如何“消除”if/else
1. 背景 if/else是高级编程语言中最基础的功能,虽然 if/else 是必须的,但滥用 if/else,特别是各种大量的if/else嵌套,会对代码的可读性.可维护性造成很大伤害,对于阅读代码 ...
- 代码重构之旅(一) 项目结构
起因 之前说过自己被分配了一个重构代码的任务: 这是一个有6.7年历史,多人经手的老系统,PHP 语言,分布在50台机器上运行.代码使用最简单的结构,没有使用任何完整框架,甚至有三四千行代码的文件,修 ...
- 无码系列5.1 代码重构 消除重复代码
1 前言 本文可以视为对ThoughtWorks高级顾问yuanyingjie关于"正交四原则"策略"消除重复"的"个人解读". 如有谬误, ...
- Python教学 | Python 中的分支结构(判断语句)【附本文代码和数据】
查看原文:[数据seminar]Python教学 | Python 中的分支结构(判断语句)[附本文代码和数据] Part1引言 上期文章我们学习了组合数据类型字典以及元组,这标志着 Python 基 ...
最新文章
- PyTorch 笔记(08)— Tensor 比较运算(torch.gt、lt、ge、le、eq、ne、torch.topk、torch.sort、torch.max、torch.min)
- 从键盘输入10个互不相同的整数,找出其中最小的元素将其与数组中的第一个元素进行交换。
- git找回误删的文件
- python比java简单好学-21、PHP和python/JAVA比,哪个更好学?
- vsftpd的不同安装方式及服务控制脚本
- Could not open app - SAP UI5 error message
- 安装linux18双系统,Win10 安装Linux ubuntu-18.04双系统(安装指南)
- java版电子商务spring cloud分布式微服务b2b2c社交电商(四)SpringBoot 整合JPA
- 日本企业RPA导入风险分析和解决对策
- 8-1-Filter过滤器
- 有幸和一位企业家聊天,他白手起家
- M - Corporate Identity(多组字符串匹配问题)
- JAVA语言基础-面向对象(IO:IO字节流)
- 基于遗传算法车辆路径问题(VRP)
- Interview Tips with Consulting Firms
- 惊!用python将数据存到txt文件中发现顺序乱排或缺斤少两
- IDEA中Resource Bundle ‘application‘
- 安卓Android拍照车牌,车牌扫描识别技术SDK
- macOS长按键盘重复输入
- latex表格调整行距