不会把if-else重构成高质量代码的程序员,不是个优秀的程序员

2023-11-17

为什么我们写的代码都是 if-else?

程序员想必都经历过这样的场景:刚开始自己写的代码很简洁,逻辑清晰,函数精简,没有一个 if-else,可随着代码逻辑不断完善和业务的瞬息万变:比如需要对入参进行类型和值进行判断;这里要判断下对象是否为 null;不同类型执行不同的流程。

落地到具体实现只能不停地加 if-else 来处理,渐渐地,代码变得越来越庞大,函数越来越长,文件行数也迅速突破上千行,维护难度也越来越大,到后期基本达到一种难以维护的状态。

虽然我们都很不情愿写出满屏 if-else 的代码,可逻辑上就是需要特殊判断,很绝望,可也没办法避免啊。

其实回头看看自己的代码,写 if-else 不外乎两种场景:异常逻辑处理和不同状态处理。

两者最主要的区别是:异常逻辑处理说明只能一个分支是正常流程,而不同状态处理都所有分支都是正常流程。

怎么理解?举个例子:

//举例一:异常逻辑处理例子
Object obj = getObj();if (obj != null) {
    //do something
}else{
    //do something
}//举例二:状态处理例子
Object obj = getObj();if (obj.getType == 1) {
    //do something
}else if (obj.getType == 2) {
    //do something
}else{
    //do something
}

第一个例子 if (obj != null) 是异常处理,是代码健壮性判断,只有 if 里面才是正常的处理流程,else 分支是出错处理流程;而第二个例子不管 type 等于 1,2 还是其他情况,都属于业务的正常流程。对于这两种情况重构的方法也不一样。

代码 if-else 代码太多有什么缺点?

缺点相当明显了:最大的问题是代码逻辑复杂,维护性差,极容易引发 bug。如果使用 if-else,说明 if 分支和 else 分支的重视是同等的,但大多数情况并非如此,容易引起误解和理解困难。

是否有好的方法优化?如何重构?

方法肯定是有的。重构 if-else 时,心中无时无刻把握一个原则:

尽可能地维持正常流程代码在最外层。

意思是说,可以写 if-else 语句时一定要尽量保持主干代码是正常流程,避免嵌套过深。

实现的手段有:减少嵌套、移除临时变量、条件取反判断、合并条件表达式等。

下面举几个实例来讲解这些重构方法:

  • 异常逻辑处理型重构方法实例一

重构前:

double disablityAmount(){
    if(_seniority < 2)
        return 0;
    if(_monthsDisabled > 12)
        return 0;
    if(_isPartTime)
        return 0;
    //do somethig
}

重构后:


                
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

不会把if-else重构成高质量代码的程序员,不是个优秀的程序员 的相关文章

  • Spring Data 与 Spring Data JPA 与 JdbcTemplate

    我有信心Spring Data and Spring Data JPA指的是相同的 但后来我在 youtube 上观看了一个关于他正在使用JdbcTemplate在那篇教程中 所以我在那里感到困惑 我想澄清一下两者之间有什么区别Spring
  • 反思 Groovy 脚本中声明的函数

    有没有一种方法可以获取 Groovy 脚本中声明的函数的反射数据 该脚本已通过GroovyShell目的 具体来说 我想枚举脚本中的函数并访问附加到它们的注释 Put this到 Groovy 脚本的最后一行 它将作为脚本的返回值 a la
  • 在请求中设置端口

    我正在尝试利用cgminer使用 Python 的 API 我对利用requests图书馆 我了解如何做基本的事情requests but cgminer想要更具体一点 我想缩小 import socket import json sock
  • Python-验证我的文档 xls 中是否存在工作表

    我正在尝试在空闲时间设计一个小程序 加载 xls 文件 然后在要扫描的文档中选择一张纸 步骤1 用户导入 xls文件 导入程序后检查文件是否存在 我能做到的 第 2 步 我要求用户提供要分析的文档表 xls 的名称 这就是它停止的地方 该程
  • 如何在 JFreeChart TimeSeries 图表上显示降雨指数和温度?

    目前 我的 TimeSeries 图表每 2 秒显示一个位置的温度 现在 如果我想每2秒显示一次降雨指数和温度 我该如何实现呢 这是我的代码 import testWeatherService TestWeatherTimeLapseSer
  • Java直接内存:在自定义类中使用sun.misc.Cleaner

    在 Java 中 NIO 直接缓冲区分配的内存通过以下方式释放 sun misc Cleaner实例 一些比对象终结更有效的特殊幻像引用 这种清洁器机制是否仅针对直接缓冲区子类硬编码在 JVM 中 或者是否也可以在自定义组件中使用清洁器 例
  • Tomcat 6找不到mysql驱动

    这里有一个类似的问题 但关于类路径 ClassNotFoundException com mysql jdbc Driver https stackoverflow com questions 1585811 classnotfoundex
  • 如何在matplotlib中调整x轴

    I have a graph like this x轴上的数据表示小时 所以我希望x轴设置为0 24 48 72 而不是现在的值 很难看到 0 100 之间的数据 fig1 plt figure ax fig1 add subplot 11
  • 从 wxPython 事件处理程序中调用函数

    我正在努力寻找一种在 wxPython 事件处理函数中使用函数的方法 假设我有一个按钮 单击该按钮时 它会使用事件处理程序运行一个名为 OnRun 的函数 但是 用户忘记单击 OnRun 按钮之前的 RadionButton 我想弹出一个
  • Java - 不要用 bufferedwriter 覆盖

    我有一个程序可以将人员添加到数组列表中 我想做的是将这些人也添加到文本文件中 但程序会覆盖第一行 因此这些人会被删除 如何告诉编译器在下一个空闲行写入 import java io import java util import javax
  • 从迭代器外部将 StopIteration 发送到 for 循环

    有几种方法可以打破一些嵌套循环 他们是 1 使用中断 继续 for x in xrange 10 for y in xrange 10 print x y if x y gt 50 break else continue only exec
  • 休眠以持久保存日期

    有没有办法告诉 Hibernate java util Date 应该持久保存 我需要这个来解决 MySQL 中缺少的毫秒分辨率问题 您能想到这种方法有什么缺点吗 您可以自己创建字段long 或者使用自定义的UserType 实施后User
  • Python:如何在不先创建整个列表的情况下计算列表的总和?

    通常我们必须 1 声明一个列表 2 使用以下方法计算该列表的总和sum 但现在我希望指定一个以 1 开头 间隔为 4 100 个元素的列表 如下所示 1 5 9 13 17 21 25 29 33 37 我不想涉及数学公式 所以 1 如何在
  • 如何使用 enumerate 来倒数?

    letters a b c 假设这是我的清单 在哪里for i letter in enumerate letters 将会 0 a 1 b 2 c 我怎样才能让它向后枚举 如 2 a 1 b 0 c 这是一个很好的解决方案并且工作完美 i
  • KeyPressed 和 KeyTyped 混淆[重复]

    这个问题在这里已经有答案了 我搜索过之间的区别KeyPressedand KeyTyped事件 但我仍然不清楚 我发现的一件事是 Keypressed 比 KeyTyped 首先被触发 请澄清一下这些事件何时被准确触发 哪个适合用于哪个目的
  • 为boost python编译的.so找不到模块

    我正在尝试将 C 代码包装到 python 中 只需一个类即可导出两个函数 我编译为map so 当我尝试时import map得到像噪音一样的错误 Traceback most recent call last File
  • 如何使用 Python/Django 在 Facebook 中获取(和使用)扩展权限

    我正在尝试编写一个简单的应用程序 让用户授予我的代码写入其页面的 Facebook 流的权限 据我了解 它应该很简单 让用户单击一个按钮 启动一个弹出窗口 其中包含我的 Facebook 应用程序中的页面 在该页面中 他们单击授予的内容流发
  • java8 Collectors.toMap() 限制?

    我正在尝试使用java8Collectors toMap on a Stream of ZipEntry 这可能不是最好的想法 因为在处理过程中可能会发生异常 但我想这应该是可能的 我现在收到一个我不明白的编译错误 我猜是类型推理引擎 这是
  • javax.persistence.Table.indexes()[Ljavax/persistence/Index 中的 NoSuchMethodError

    我有一个 Play Framework 应用程序 并且我was使用 Hibernate 4 2 5 Final 通过 Maven 依赖项管理器检索 我决定升级到 Hibernate 4 3 0 Final 成功重新编译我的应用程序并运行它
  • 在Python中停止ThreadPool中的进程

    我一直在尝试为控制某些硬件的库编写一个交互式包装器 用于 ipython 有些调用对 IO 的影响很大 因此并行执行任务是有意义的 使用 ThreadPool 几乎 效果很好 from multiprocessing pool import

随机推荐

  • Linux文件权限一共10位长度,分成四段,每段表示

    1 文件类型 2 文件所有者的权限 3 文件所有者所在组的权限 4 其他用户的权限句号
  • 求两个有序数组的中位数

    leetcode 4 Median of Two Sorted Arrays 题目 给两个有序数组 长度为n和m 在 O log m n 时间内找出两个数组中所有数字的中位数 题解 参考讨论区大佬解法 递归分治方法 先上代码 include
  • c#读取csv到数组_使用C#将CSV文件读入数组 - c#

    我正在尝试创建一个将拉入 读取和分隔csv文件的代码 它有四列 没有标题 我一直在网上找几个小时 似乎没有人真正找到答案 所以我希望这里有人可以 读入后 由于它是设计的一部分 因此我需要能够将其拉得很特别 提前谢谢 参考方案 您的问题有点含
  • How to detect the encoding of a text file with Deno?

    How to detect the encoding of a text file with Python Python 中有一个有用的包 chardet 它有助于检测文件中使用的编码 实际上 没有程序可以 100 确信使用了哪种编码 这就
  • pgsql有dual表?

    在 PostgreSQL 中 没有类似于 Oracle 中的 DUAL 表的概念 然而 您可以使用匿名块 Anonymous Block 来创建一个临时的查询结果集 并在其中进行测试或操作 以下是一个使用匿名块创建临时表的示例 DO DEC
  • 利用SAM实现自动标注

    利用SAM实现自动标注 目录 利用SAM实现自动标注 一 下载安装 1 1 下载SAM Tool和SAM 1 2 下载SAM模型文件 1 3 安装SAM 二 配置项目 三 提取信息 四 获得SAM onnx文件 五 标注 六 格式转换 6
  • 提示 使用驱动器D:中的光盘之前需要将其格式化

    千万不要格式化 直接格式化是最low的做法 方法如下 方法一 chkdsk G f 其中G是你U盘的盘符 f是fix修复的意思 之后电脑就会自动开始修复 修复的时候会告诉你修复了多少多少 最后修复完了 如果硬盘较大就多等会 注意 在此期间不
  • 静息态fMRI状态依赖的有效连接

    文章来源于微信公众号 茗创科技 欢迎有兴趣的朋友搜索关注 导读 大脑在静息状态下存在着不同脑区间的功能连接 并且在多重稳态之间具有内在动态平衡过程 因此 探索特定状态下的功能连接 有利于以加深对精神疾病的理解 然而 与功能连接相比 有效连接
  • 【深入理解C++】运算符重载、插入和提取运算符、拷贝赋值运算符

    文章目录 1 运算符重载 2 重载为友元函数 3 重载为成员函数 4 插入和提取运算符 5 拷贝赋值运算符 5 1 深拷贝 1 运算符重载 运算符重载可以为运算符增加一些新的功能 C 中绝大部分的运算符允许重载 不能重载的运算符有以下几个
  • excel柱状图堆叠图显示总和_如何在Excel堆积柱形图中显示合计值

    在Excel中 用堆积柱形图可以比较相交于类别轴上的每一数值占总数值的大小 对于普通的簇状柱形图 我们可以在每个柱形系列的顶端放置一个数据标志 如数值 来反映各系列数据的大小 对于堆积柱形图 Excel没有提供直接的方法将数据标志显示在柱形
  • mysql - windows下my.ini和linux下my.cnf简单配置

    mysql 设置mysql客户端默认字符集 default character set utf8 mysqld 设置3307端口 port 3307 设置mysql的安装目录 basedir G a workIndex mysql mysq
  • MFC创建窗口流程

    一个MFC程序框架 1 应用程序类 CWinApp 2 框架类 CFrameWnd 流程 1 有且仅有一个全局的应用程序类对象 MyApp myApp 2 在程序入口函数实现 InitInstance 1 给框架类对象动态分配空间 自动调用
  • mysql 大数据量如何导入

    MySQL 有多种方法可以用来导入大数据量 这里列举几种常见的方法 导入数据库备份文件 如果你已经有了数据库的备份文件 可以使用 MySQL 的 mysql 命令行工具来导入 例如 mysql u username p db name lt
  • 【微信小程序】运行机制和更新机制

    观众老爷们好呀 牛牛又更文了 上文我们对部分比较常用的组件进行了讲解 作为开发者 我们还需要对小程序的运行机制和更新机制做一定的了解 那问题来了 你对它们了解多少呢 今天牛牛就带大家测一测 不了解的还不笔记做起来 文章目录 一 运行机制 1
  • 图像相似度计算之直方图方法OpenCV实现

    操作步骤 1 载入图像 灰度图或者彩色图 并使其大小一致 2 若为彩色图 增进行颜色空间变换 从RGB转换到HSV 若为灰度图则无需变换 3 若为灰度图 直接计算其直方图 并进行直方图归一化 4 若为彩色图 则计算其彩色直方图 并进行彩色直
  • HTTP首部(下)

    开始头大 哈哈 这个东西真的很无聊且枯燥 奈何最近的学习中经常用到这些知识 还是过一遍比较放心 上一篇博客中我们讨论了http报文首部 其划分为请求头和响应头 请求头主要由请求行 请求字段 通用字段 实体字段组成 那么响应头也由响应行 响应
  • go hash中的读写操作

    在 Go 语言中 我们可以使用 for 循环来遍历哈希表 hash 中的键值对 针对不同的操作进行读写操作 示例代码如下 创建一个映射类型的哈希表 hash map string int apple 2 banana 3 orange 4
  • uni-app实现PDA采集器扫码

    uni app实现PDA采集器扫码 一 开发建议 1 建议使用nvue开发 体检会非常好 使用uni preloadPage url pages index 预加载页面 页面的流畅程度会提高非常多 单独vue的写法 打包成安卓体验很不好 模
  • IntelliJ IDEA 编译程序出现非法字符的解决方法

    最近编码完成后总是报非法字符 项目启动不起来 网上有很多说是File gt Setting gt File Encoding 将IDE Encoding和Project Encoding 都设置为UTF 8就行 可是我试了不行 后来看到另外
  • 不会把if-else重构成高质量代码的程序员,不是个优秀的程序员

    为什么我们写的代码都是 if else 程序员想必都经历过这样的场景 刚开始自己写的代码很简洁 逻辑清晰 函数精简 没有一个 if else 可随着代码逻辑不断完善和业务的瞬息万变 比如需要对入参进行类型和值进行判断 这里要判断下对象是否为