首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

代码重构!你敢吗?

因为这个系统是最核心的业务系统之一,而且几经易手,当时的代码已经变得极难维护,里面各种if else 的分支,还有长达一千行一个的函数,注释不全,文档也不足,要想长期的维护下去,这个技术债是非偿还不可了...设计好验证的方式 当确认好重构的范围后,接下来的事情,就是要考虑如何来验证重构后的代码了。 这个重构代码最重要的一个部分,如果没办法验证重构代码的正确性,你是不敢上线的,就算硬上了,也会睡不好觉。...因为业务逻辑很复杂,而且涉及到太多的外围系统,一个是测试用例很难覆盖全面,另外一个是没有办法可以很好的隔离外部系统的依赖。...后来,我们想到一个办法,把代码版本管理系统的log 全部拉出来。通过log我们找到了各部分逻辑不清晰的代码的负责人,然后一个一个的去跟他们聊,跟他们请教。...灰度完后,我们每间隔一段时间,就分析一遍log和监控,看看有没有隐藏的问题。 最终,我们确实在这个灰度的过程中,发现了不少的问题,不过因为涉及的用户很少,都没有造成大的影响。

72850

6个实例详解如何把if-else代码重构成高质量代码

虽然我们都很不情愿写出满屏if-else的代码,可逻辑上就是需要特殊判断,很绝望,可也没办法避免啊。 其实回头看看自己的代码,写if-else不外乎两种场景:异常逻辑处理和不同状态处理。...两者最主要的区别是:异常逻辑处理说明只能一个分支是正常流程,而不同状态处理都所有分支都是正常流程。 怎么理解?...这个重构手法简单易懂,带来的效果也非常明显,能有效地较少if语句,减少代码量逻辑上也更加易懂。...将这个表达式的每个分支放进一个子类内的覆写函数中,然后将原始函数声明为抽象函数。...为维持这个原则:合并条件表达式可以有效地减少if语句数目;减少嵌套能减少深层次逻辑; 异常条件先退出自然而然主干流程就是正常流程。

1.2K10

从小重构说起

,不建议这样做;再有是对相似流程代码抽象出模板方法,子类实现差异化逻辑。...如果我们没有良好的系统设计经验和深刻理解面向对象思想(业务系统主流的编程思想),就很容按照过程式的思想去写代码,就会出现职责庞大的函数或类,有着超多的分支判断逻辑,各种补丁代码块。...一个很好的办法就是将分支中的代码块抽离成小函数,把大类拆分成职责较为单一的小类。...我们通俗的说这个类的职责太重了,导致里面又很多的实例变量。改造的办法是将多个实例变量分组,然后拆分不同的类去处理,这样来拆分出一些单一职责类。...其实你在做小重构的过程中可以慢慢形成对于这个系统业务流程的理解,以及对于系统设计(大)重构方向上的思路。那么什么时候或者什么时机就要开始重构

21820

这满屏的 if else,交接的兄弟快被逼疯!

虽然我们都很不情愿写出满屏 if-else 的代码,可逻辑上就是需要特殊判断,很绝望,可也没办法避免啊。 其实回头看看自己的代码,写 if-else 不外乎两种场景:异常逻辑处理和不同状态处理。...两者最主要的区别是:异常逻辑处理说明只能一个分支是正常流程,而不同状态处理都所有分支都是正常流程。 怎么理解?...这个重构手法简单易懂,带来的效果也非常明显,能有效地较少if语句,减少代码量逻辑上也更加易懂。...将这个表达式的每个分支放进一个子类内的覆写函数中,然后将原始函数声明为抽象函数。...为维持这个原则:合并条件表达式可以有效地减少if语句数目;减少嵌套能减少深层次逻辑;异常条件先退出自然而然主干流程就是正常流程。

36810

怎么让代码更Pythonic?光有技巧可不行,你还需要看这些

我们通常写一个代码,必然会经过一个简单-难-简洁的过程,那么在重构的过程中需要注意哪些呢? 1、 代码可以正常运行 首先必然要保证,代码可以正常运行!...pep8原则,比如命名,每一行代码长度等等,这些细节要处理好 · 函数的重构,返回值、缺省值等等,要保持函数式功能单一原则 · 有没有过多的if else嵌套,是否可以提取 · 全局变量有没有大写,有没有写到开头...所以注释是一个非常重要的东西,有的同学不是很喜欢写注释,觉得很麻烦,那么如果这个代码很短,那么确实可以不写,但是如果你的代码很长,成百上千行,不写注释会让你很懵逼!...简单的程序可以设一些断言assert,看一些有无异常,对于复杂的逻辑,一定要针对性的设计多个分支回路反复测一下代码。 7、 添加日志功能 有同学说上面6步之后,我感觉代码已经很不错了,这么还有优化!...这个时候一定要考虑并发的处理,到底是用多进程,还是多线程,线程池,还是用协程,需要思考!

43630

实例告诉你如何把 if-else 重构成高质量代码!

虽然我们都很不情愿写出满屏 if-else 的代码,可逻辑上就是需要特殊判断,很绝望,可也没办法避免啊。 其实回头看看自己的代码,写 if-else 不外乎两种场景:异常逻辑处理和不同状态处理。...两者最主要的区别是:异常逻辑处理说明只能一个分支是正常流程,而不同状态处理都所有分支都是正常流程。搜索程序员白楠楠公众号,送你一份Java面试题宝典 怎么理解?...这个重构手法简单易懂,带来的效果也非常明显,能有效地较少if语句,减少代码量逻辑上也更加易懂。...将这个表达式的每个分支放进一个子类内的覆写函数中,然后将原始函数声明为抽象函数。...为维持这个原则:合并条件表达式可以有效地减少if语句数目;减少嵌套能减少深层次逻辑;异常条件先退出自然而然主干流程就是正常流程。

57100

关于软件重构的灵魂四问

第二是程序逻辑的复杂度。线性顺序执行的复杂度为1, 出现分支以后要乘以分支的个数。分支可以是条件判断也可以是循环。所以尽可能的避免分支的出现是降低程序逻辑复杂度的重要手段。...如果程序分支不可避免,要尽可能的把程序分支放到最高的逻辑层。这样做的目的是为了避免在下层处理的时候出现发散式的分支。发散式的分支会急剧的增加程序的复杂度。...像这种情况,如果从这个文件本身去做重构的话,难度非常之大,但是如果从上往下,从模块的整个设计角度来做重构的话,可能就容易一些。 对于这样的庞然大物,最好的办法就是分而治之。...首先要确定系统的功能逻辑点,针对这些逻辑点,要编排好对应的检测点,也就是说等我们完成了重构以后,我们得确保我们的重构是没有问题的,这些检测点就是做这个的,我们可以理解成集成类的测试。...这个过程,从字面意义上可以理解成重写,实际上,它也是一个重构的过程,因为我们肯定会重用这个系统本身的一些现有代码和现有的逻辑

47310

为什么我不建议你用 if-else ?

虽然我们都很不情愿写出满屏 if-else 的代码,可逻辑上就是需要特殊判断,很绝望,可也没办法避免啊。 其实回头看看自己的代码,写 if-else 不外乎两种场景:异常逻辑处理和不同状态处理。...两者最主要的区别是:异常逻辑处理说明只能一个分支是正常流程,而不同状态处理都所有分支都是正常流程。 怎么理解?...这个重构手法简单易懂,带来的效果也非常明显,能有效地较少if语句,减少代码量逻辑上也更加易懂。...将这个表达式的每个分支放进一个子类内的覆写函数中,然后将原始函数声明为抽象函数。...为维持这个原则:合并条件表达式可以有效地减少if语句数目;减少嵌套能减少深层次逻辑;异常条件先退出自然而然主干流程就是正常流程。

1.9K20

5.11 汇编语言:仿写IF条件语句

条件语句在处理决策和分支逻辑时非常有用。一般来说,条件语句由IF关键字、一个条件表达式、一个或多个代码块以及可选的ELSE关键字和对应的代码块组成。...如果var1不大于等于var2,则它将检查var2是否大于var3,如果是,则输出字符串"xor ecx, ecx"。这段代码实现了简单的条件分支逻辑。...这段代码实现了多个条件的逻辑判断,并且包含了算术和逻辑运算。三层嵌套IF语句,转换为汇编语句稍微复杂一些,但大方向不变,还是要由外部到内部,依次构建每一个分支按照此顺序构建,其实并不难。...这段代码实现了简单的条件分支逻辑判断。多重选择分支结构,其本质就是对某些条件一直判断下去,直到遇到符合条件的表达式则执行表达式内的语句块。...在这个if块中,它再次进行多个逻辑判断和比较,判断条件包括被位运算处理过的变量值和固定的数值50。如果所有条件都满足,则输出字符串"xor eax, eax"。

18830

重构的自动化

SCM(如 Git)的分支策略是否合理?扫描出所有的分支,了解对应的分支策略。 适应度函数检测。诸如于是否包含对应的测试策略——可以检测的测试工具、度量覆盖率,来判定是否拥有有效的测试策略。...而要打破依赖并不是一件容易的事,它所涉及的是一层层的函数调用,以及其背后的复杂业务逻辑。只需要构建出目标语言的 AST(抽象语法树),我们便能分析出项目中的各个包间的依赖关系。...而实践证明,那些“机智”(鸡贼)的开发人员,已经有各种办法绕过这些措施。 测试的快速反馈 ? 自动化的测试代码编写,依赖于大量的先验知识。...如果我们计划于生成某个函数的测试,那么我们首先必然需要调用这个函数,才能返回预期的结果。而测试的完整性,实质上是依赖于边界条件来构建的。...基于此,我们就可以拥有一套完整的端到端重构工具集。 结论 有没有这样的工具呢? 有。

1K30

vivo 基于 JaCoCo 的测试覆盖率设计与实践

一、为什么需要测试覆盖率1.1 在日常研发过程中,经常发现一些问题测试案例的设计凭经验,当研发一个新功能时,经常对测试场景估计不足,到上线后发现bug;开发经常做一些需求之外的代码变更(代码小范围内重构或在开发过程中发现小缺陷随手改掉...有没有技术手段能够尽可能的避免上面的问题呢?在业内已经在普遍使用代码覆盖率来提升测试质量,那什么是代码覆盖率?...JaCoCo计算逻辑,针对增量代码单独统计覆盖率指标值改造JaCoCo报告格式,在报告中兼容全量代码和增量代码的覆盖情况对于计算代码分支的变动情况,放弃 GitLab 提供的代码比对功能来获取不同版本之前的差异信息...既然知道问题所在,那有没有办法解决呢?是不是可以直接找到以前的classid,把以前的classid对应的探针数据复制到当前的classid下就可以?...五、总结对于测试覆盖率功能,有没有给测试的质量带来提升,答案是显而易见的。

1.2K20

5.11 汇编语言:仿写IF条件语句

条件语句在处理决策和分支逻辑时非常有用。一般来说,条件语句由IF关键字、一个条件表达式、一个或多个代码块以及可选的ELSE关键字和对应的代码块组成。...如果var1不大于等于var2,则它将检查var2是否大于var3,如果是,则输出字符串"xor ecx, ecx"。这段代码实现了简单的条件分支逻辑。...这段代码实现了多个条件的逻辑判断,并且包含了算术和逻辑运算。 三层嵌套IF语句,转换为汇编语句稍微复杂一些,但大方向不变,还是要由外部到内部,依次构建每一个分支按照此顺序构建,其实并不难。...这段代码实现了简单的条件分支逻辑判断。 多重选择分支结构,其本质就是对某些条件一直判断下去,直到遇到符合条件的表达式则执行表达式内的语句块。...在这个if块中,它再次进行多个逻辑判断和比较,判断条件包括被位运算处理过的变量值和固定的数值50。如果所有条件都满足,则输出字符串"xor eax, eax"。

43730

过多 if-else 分支的优化

我想谈一谈这个话题是因为我的上一篇博客在 ITEye 上有一些朋友回复,说 if-else 过多的分支可以使用 switch 或者责任链模式等等方式来优化。...确实,这是一个小问题,不过我们还是可以整理一下这个小问题的重构方式。 为什么要优化? 你没有看错。这是要放在第一条谈论的。 有许多人会说,叠起来一堆 if-else 分支,代码就不优雅了。...寻找代替分支判断的方式 接下去我们再来考虑怎么样去重构优化过多的 if-else 分支。 程序逻辑最基本的组成就是分支、判断和循环。...而过多 if-else 正是由于在某一个变化的点上,有许多判断条件和结果分支造成的。所以最基本的解决办法就是把多个判断条件合成一个,也就是把若干个分支合成一个。..."com.xxx." + str).newInstance(); int code = iCode.getCode(); 当然,如果仅考虑从 String 转向 int 这样的转换,用这样的方式来简化分支判断逻辑

55910

关于有限状态机(FSM)的一些思考

有限状态机的实现方式 一般来说,状态机有以下几种实现方式: 实现方式 适用场景 优点 缺点 分支逻辑法 适用于条件简单,状态固定,没有新增和扩展的需求 状态机代码直译,简单直接,状态逻辑比较集中,容易查看...,拆分到不同的状态类中,来避免分支判断逻辑 代码结构更清晰,可以规避过多的分支逻辑判断,代码可维护性更高 状态模式会引入很多状态类,如果状态颗粒度控制不好,会导致状态类爆炸问题;另外逻辑比较分散,集中在状态类中...,无法在一个地方整体看出整个状态机的逻辑 逐个解释一下这三种实现方式: 分支逻辑分支逻辑法比较简单,就是在代码中通过if-else或者switch-case来直译状态机,来看看我们的下载器目前是怎么判断状态的...如何解决传统有限状态机「状态爆炸」问题 虽然状态模式能够很好的优化大量的if-else的逻辑分支,但如果面对State类很多的情况,实现状态切换将会变得非常痛苦。...这里可能带来一个问题是,我们既要维护状态转移图,也要维护代码,那我们有没有办法实现状态机代码可视化,帮助我们解决状态机维护的问题。

1K31

为了爱情,我发明了一个算法

张大胖叹了口气:“唉,看来这个求和算法太简单了,我得找到一个算法,得产生足够的混乱性和随机性才行。” 3 又是一个周末,两人见了面,互诉相思之苦以后,张大胖说:“我已经找到办法了,用除法。”...张二妮用同样的除法一计算,核对一下余数是不是相等,就知道数据有没有错误了。...1 xor 0 = 1 1 xor 1 = 0 0 xor 1 = 1 0 xor 0 = 0 简单来说,就是“同性”相斥(结果为0),“异性”相吸(结果为1) 把这个异或运算用到除法中来,是这个效果...张二妮都看傻眼了,她说:“刚才的除法我就做不了,你现在又弄什么XOR,太复杂了,我可算不出来。” 张大胖说:“别担心,我写个程序,会自动实现这个算法,到时候你直接用就行了。”...4 CRC算法运转得还不错,过了两周,张二妮提出了新的问题:“你这个算法只能发现错误,出了错误还得重传,你能不能想个办法,自动地就纠正错误?” 张大胖:“这个..... 你让我想想吧。”

58530

重构:勿以善小而不为

随着操作的逐渐增多,这个Controller就变得越来越庞大,逐渐变得臃肿起来。 每当我需要调用或者修改Controller时,我都在想:“嗯,这个代码太糟糕了,什么时候给它重构一下。”...3 说完了重构的重要性,让我再来粗略地介绍这个重构过程。 我们的测试程序主要针对Message的发送、接收与验证。业务的处理则由部署在JBoss上的应用来处理。...这个检查的逻辑根据不同的消息类型会有不同的处理逻辑(其中,主要逻辑则委派给由MessageCheckFactory创建的MessageChecker对象)。...重构势在必行。一方面,这个分支的处理是不合理的,随着消息类型的增多,这条分支语句会越来越长。关键是这种处理接收消息的逻辑不止存在这一处,这种没有封装的实现方式可能导致出现重复代码,违背了DRY原则。...当然,也有一种取巧的办法,就是将这些代码结合Extract Method与Move Method重构手法,再转移到我们引入的ResponseMessage中,因为在我们之前的分析中,已经明确这些分支判断逻辑应该封装到

31220
领券