首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

重构-为什么 if-else 不是好代码

平时开发中if-else多吗? 其实这是个再正常不过coding习惯,当我们代码量小时候用来做条件判断是再简单不过了。 但对于优秀程序员来说,这并不是好代码, 为啥?...如何重构掉这段代码 对于这种代码我们重构目标可以有两个深度,看自己强迫症严重程度决定 · 继续用 if-else,只达到剥离执行代码块 · 用工厂模式去耦合 对于这两种其实不是非此即彼关系,而是优化深度不同...进一步优化 在上面的优化之后,如何再用工厂模式来继续重构呢? 从上代码出来,不同条件下,执行逻辑是不同,那么可以把这种执行逻辑抽象出来,用多态概念来定义不同执行方式。...在经过这一轮重构之后,我们之前在一个类里面写那堆代码已经抽离到多个不同类里了, 现在在原来类里代码变成怎样了呢, TargetExecutor executor = ExecutorFactory.getExecutor...(target); executor.process(); 重构之后各个Executor和主类中耦合已经降到很低了, 而且代码整洁度提高了很多,之前那个类一段50+行代码变成了2行,这就是重构意义

1K10

代码重构:用工厂+策略模式优化过多if else代码

在工作中优化了一段冗余if else代码块: 假如写一个针对员工上班不遵守制度做相应惩罚程序,比如,上班迟到:罚100;上班睡觉:罚1000;上班早退:警告;上班玩游戏:严重警告;上班谈恋爱:开除等...("开除"); } } } 可以看到,每增加一种情况都要增加一个if else判断,这样会造成这段代码非常长,可读性差、不易维护。...下面就用静态工厂+策略模式来重构这段代码(对于静态工厂模式和策略模式不知道同学请自行百度哈 先说说思路:1、定义一个处罚接口 ,包含一个执行处罚方法       2、每一种情况处罚都抽象成一个具体处罚类并继承处罚接口...、清晰,后续新增一种情况,只需定义一个相应类即可,根本不需要修改处罚逻辑,完全解耦合,这大大提高了代码可读性和可维护性。...不过,运用静态工厂+策略模式,也存在弊端,那就是会增加很多类;但是,当每种情况逻辑代码很多、很复杂时候,那么这个弊端就可以忽略不计,其优势就完全展示出来了。

52321
您找到你想要的搜索结果了吗?
是的
没有找到

被迫重构代码,这次我干掉了 if-else

传统实现方式 我们看下边代码,大致就是重构前下单逻辑代码,由于来源比较少,简单做if-else逻辑判断足以满足需求。...现在每种订单来源处理逻辑都有几百行代码,看着已经比较臃肿,可我愣是迟迟没动手重构,一方面业务方总像催命鬼一样让你赶工期,想快速实现需求,这样写是最快;另一方面是不敢动,面对古董级代码,还是想求个安稳...但这次来源一下子增加几十个,再用这种方式做已经无法维护了,想象一下那种臃肿if-else代码,别说开发想想都头大!...还有一些小伙伴纠结于性能问题,策略模式性能可能确实不如if-else。 但我觉得吧增加一点复杂度、牺牲一丢丢性能,换代码整洁和可维护性还是值得。...总结 凡事都有他两面性,if-else多层嵌套和也都有其各自优缺点: if-else优点就是简单,想快速迭代功能,逻辑嵌套少且不会持续增加,if-else更好些,缺点也是显而易见,代码臃肿繁琐不便于维护

47030

Java编程细节-重构-为什么 if-else 不是好代码

平时开发中if-else多吗? 其实这是个再正常不过coding习惯,当我们代码量小时候用来做条件判断是再简单不过了。 但对于优秀程序员来说,这并不是好代码, 为啥?...在进阶高级开发路上,应该逐步培养起这种前瞻意识, 即使在代码还在起步阶段,应该要能够看到将来代码发展趋势, 比如上面的代码,当情况越来越多时候,if-else可能会发展出许多个分支: ?...如何重构掉这段代码 对于这种代码我们重构目标可以有两个深度,看自己强迫症严重程度决定 · 继续用 if-else,只达到剥离执行代码块 · 用工厂模式去耦合 对于这两种其实不是非此即彼关系,而是优化深度不同...在经过这一轮重构之后,我们之前在一个类里面写那堆代码已经抽离到多个不同类里了, 现在在原来类里代码变成怎样了呢, ?...重构之后各个Executor和主类中耦合已经降到很低了, 而且代码整洁度提高了很多,之前那个类一段50+行代码变成了2行,这就是重构意义。

69820

高质量代码优化!谈谈重构项目中if-else代码几点建议

switch if - else只适合在3层之内使用 当条件判断较多时,可以首先考虑使用switch interface 当判断条件还可能动态增加时,可以考虑将switch进一步优化,引入接口interface...,将代码与数据分离: 创建一个map: key: switchcase值 value: 对应实体类 抽象出通用方法,变成一个接口,统一入参和返回值 主实现类controller类就是将type值传进去...,获取到对应实现类,然后调用抽象出来方法,这样无论增加多少个case, 都不会改变主逻辑代码 每个类单独实现接口,互不影响 db setting 用db setting表方式加载type对应实体类...解决方案: 将case实现用动态语言完成,并且将代码写在db里 db里保存代码 启动时候初始化所有的实现类,以节省时间 主实现类controller类里主逻辑代码不变,但额外提供一个初始化map...,然后根据不同程度来给出不同方案 不要过度设计: 有方案不代表当前必须做,能把设计提前比需求快一步,就很好了 学会给自己代码分级,是让自己进步最好办法.一个人成长分为几个阶段: 面向功能编程

27620

11个JavaScript代码重构最佳实践

作者:曾探 来源:《JavaScript设计模式与开发实践》 模式和重构之间有着一种与生俱来关系。从某种角度来看,设计模式目的就是为许多重构行为提供目标。...1.提炼函数 在JavaScript开发中,我们大部分时间都在与函数打交道,所以我们希望这些函数有着良好命名,函数体内包含逻辑清晰明了。...如果一个函数过长,不得不加上若干注释才能让这个函数显得易读一些,那这些函数就很有必要进行重构。 如果在函数中有一段代码可以被独立出来,那我们最好把这些代码放进另外一个独立函数中。...} return ret; }; 嵌套条件分支语句绝对是代码维护者噩梦,对于阅读代码的人来说,嵌套if、else语句相比平铺if、else,在阅读和理解上更加困难,有时候一个外层...即使我们假设三目运算符效率真的比if、else高,这点差距也是完全可以忽略不计。在实际开发中,即使把一段代码循环一百万次,使用三目运算符和使用if、else时间开销处在同一个级别里。

61651

11个JavaScript代码重构最佳实践

作者:曾探 来源:《JavaScript设计模式与开发实践》 模式和重构之间有着一种与生俱来关系。从某种角度来看,设计模式目的就是为许多重构行为提供目标。...1.提炼函数 在JavaScript开发中,我们大部分时间都在与函数打交道,所以我们希望这些函数有着良好命名,函数体内包含逻辑清晰明了。...如果一个函数过长,不得不加上若干注释才能让这个函数显得易读一些,那这些函数就很有必要进行重构。 如果在函数中有一段代码可以被独立出来,那我们最好把这些代码放进另外一个独立函数中。...} return ret; }; 嵌套条件分支语句绝对是代码维护者噩梦,对于阅读代码的人来说,嵌套if、else语句相比平铺if、else,在阅读和理解上更加困难,有时候一个外层...即使我们假设三目运算符效率真的比if、else高,这点差距也是完全可以忽略不计。在实际开发中,即使把一段代码循环一百万次,使用三目运算符和使用if、else时间开销处在同一个级别里。

1.1K21

编写精炼JavaScript代码:避免多余Else, 尽早Return

通过用 if/return 替换 if/else来减少过多缩进 尽量减少方法(或函数)中“干或”代码缩进。 错误处理是“噪音”。...(result变量)可能会被错误地修改 (间接)鼓励了一个或多个if/else 示例: if/else 重构 我们来看一下下面这段典型node回调代码: function(err, results)...当 if后面的"happy path"(代码)很长时候,读者就不知道到底处理是什么错误了。 那我们尝试重构一下:将函数要做“正经”事情放在后面。...像上面这种情况就可以重构为如下代码:去掉 else, 减少一层缩进。在 if里直接 return。...综上,最终代码: 方法(或函数)处于最低缩进等级 没有不必要缩进 代码更短小精炼 以上 ---- 往期精选文章 使用虚拟dom和JavaScript构建完全响应式UI框架 扩展 Vue 组件 使用

1.2K10

代码组件 | 我代码没有else

嗯,我代码没有else系列,一个设计模式业务真实使用golang系列。 ? 前言 本系列主要分享,如何在我们真实业务场景中使用设计模式。...关于怎么用,完全可以生搬硬套我总结使用设计模式四个步骤: 业务梳理 业务流程图 代码建模 代码demo 业务梳理 按照如上某东订单结算页面的示例,我们得到了如下订单结算页面模块组成图: ?...----------------------- //我代码没有`else`系列 //组合模式 //@auhtor TIGERB //-------...我代码没有`else`,只是一个在代码合理设计情况下自然而然无限接近或者达到结果,并不是一个硬性目标,务必较真。 2....---- 我代码没有else系列 更多文章 代码模板 | 我代码没有else 链式调用 | 我代码没有else 点击https://github.com/TIGERB/easy-tips/tree

1.1K10

代码模板 | 我代码没有else

嗯,我代码没有else系列,一个设计模式业务真实使用golang系列。 ? 前言 本系列主要分享,如何在我们真实业务场景中使用设计模式。...关于怎么用,完全可以生搬硬套我总结使用设计模式四个步骤: 业务梳理 业务流程图 代码建模 代码demo 业务梳理 我通过历史上接触过各种抽奖场景(红包雨、糖果雨、打地鼠、大转盘(九宫格)、考眼力、...------------ //我代码没有`else`系列 //模板模式 //@auhtor TIGERB //------------------...//------------------------------------------------------------ //我代码没有`else`系列 //模板模式 //@auhtor TIGERB...我代码没有`else`,只是一个在代码合理设计情况下自然而然无限接近或者达到结果,并不是一个硬性目标,务必较真。 2.

1K30

代码重构艺术

原文出自:https://juejin.cn/post/6903054491273625614 什么是重构 所谓重构是这样一个过程:在不改变代码外在行为前提下,对源代码做出修改,以改进程序内部结构...本质上来说重构就是在代码写好之后改进它设计。 重构目的是什么 首先,重构是时刻保证代码质量一个极其有效手段,不至于让代码腐化到无可救药地步。项目在演进,代码不停地在堆砌。...这段代码可能是别人写,也可能时自己写,但无论如何,当你觉得这段代码逻辑糟糕,需要花费几分钟才能明白其中含义时,你就要想着如何去重构才可以使代码更加简洁直观 有计划代码重构 「找寻重构和开发进度中适合自己平衡点...何时不应该重构 「有所为,有所不为。」 并非所有的糟糕代码都需要重构,如果你不需要使用到这段代码,那么就不必花心思去重构它。只有你需要理解其中工作原理时,对其重构才有价值。...学会只编写够用注释,过犹不及,应当重视质量而不是数量 多层if语句嵌套 ? if-else在程序设计中是不可避免,作为程序员能做就是减少嵌套,提升代码可阅读性和质量 很酷却不宜理解代码 ?

78620

重构代码Tricks

重构代码就是依赖于设计模式而实现一个必要手段,可以说设计模式就是重构代码目标,但他手段却不仅仅只有设计模式这些大而全,同样存在小而精,我们随处可以使用。...封装功能块代码 我们通常在写代码时候,一开始,并不需要考虑太多。在后期可以进行修改和提炼。...我们可以使用命令模式进行重构。 这就涉及到另外一个tip. 将分支转化为函数 上面代码里面的分支完全可以使用函数来进行代替。...这就是通过命令模式,来重构代码,完成性能和阅读优化。 但有时候,使用分支,会比这样更简洁,那当然可以使用分支啦。 而使用分支还要主意一个tip就是....大部分重构小技巧差不多介绍完了(智商有限),如果,大家有什么更好建议欢迎留言反馈. 原文出处:IVWEB社区 未经同意,禁止转载

1.2K10

.NET重构—单元测试代码重构

重构能有今天风光影响力完全少不了单元测试功劳;最近一段时间写单元测试用例时间远超过我写逻辑代码时间和多代码量,这是为什么?...,那么一旦被测试代码发生一点点变化都会很大程度上影响测试代码,毕竟测试代码都是步步依赖; 那么我们应该最大程度限制由于被测试代码变动而引起测试代码变动,这个时候我们应该将重构应用到测试代码中...; 2.1】单元测试继承体系(利用超类来减少Mock对象使用) 将多个相关测试用例代码通过超类方式关联起来统一管理将大大减少重复代码构建;就跟我们重构普通代码一样,将多个类之间共享逻辑代码或者对象提取出来放到基类中...,因为我们项目中是需要迭代重构,我们需要重构来为我们项目保证最高质量; 所以单元测试修改次数和重构次数应该是成1:0这样比例,修改范围那就不是1:10了,有时候甚至是几何倍数; OrderService...,将规则对象化后就能随便控制他们,当然这里是提取出方法,如果是大型企业级项目对这些易变化点是需要抽取出来; 总之遇到这样情况就使用简单提取方法方式将复杂逻辑提取出来,这也是《重构》中重构策略首要模式

1.2K60

重构-改善既有代码设计:大型重构

大型重构 1. Tease apart Inheritance 梳理并分解继承体系 某个继承体系同时承担两项责任 ,建立两个继承体系,并通过委托关系让其中一个可以调用另一个 . 2....Convert Procedural design to Objects 将过程化设计转化为对象设计 你手上有一些传统过程佛冈可选择代码 , 将数据记录变成对象,将大块行为分成小块,并将行为移入相关对象之中...Separate Domain from from Presention 将领域和表述/显示分离 某些GUI类之中饮食了领域逻辑 , 将领域逻辑分离出来,为它们建立独立领域类 4....Extract Hierarchy 提炼继承体系 你有某个类做了太多工作,其中一部分工作是以大量条件表达式完成 , 建立继承体系,以一个子类表示一种特殊情况

39910

不要再用Vue2思维写Vue3了

, 逻辑关注点是指表达同一个业务代码内聚到一起,这也是单一职责指导思想,我们内聚不应该技术类型,而是业务逻辑,因为触发代码变更往往是业务需求,因此把相同变更理由代码放在一起,这才不会导致散弹式修改...问题三:新语法让Vue失去简单性,导致"意大利面条代码"出现,降低项目维护性。 尤雨溪: 正好相反,新API就是为了提高项目长期维护性。...如果我们查看任何javascript项目,都会从入口文件开始阅读,该文件本质是你应用启动时被隐式调用"main"函数。...如果只有一个函数入口,会导致意大利面条代码,那所有的js项目都是意大利面条代码。显然不是的,因为开发人员通过代码模块化或者较小函数来组织代码。 另外,我同意新API理论上会降低代码质量最低门槛。...但是我们可以使用以往防止代码变成意大利面条手段缓解这种情况。另一方面,新API可以提升代码质量最高上限,相比option api,你可以重构为质量更高代码

33410

如何正确学习vue3.0源码

SFC 就是按功能组织代码方法,但讽刺是当首次引入 SFC 时,许多人也是拒绝,认为它违反了关注点分离。问题三:新语法让 Vue 失去简单性,导致"意大利面条代码"出现,降低项目维护性。...尤雨溪: 正好相反,新 API 就是为了提高项目长期维护性。如果我们查看任何 javascript 项目,都会从入口文件开始阅读,该文件本质是你应用启动时被隐式调用"main"函数。...如果只有一个函数入口,会导致意大利面条代码,那所有的 js 项目都是意大利面条代码。显然不是的,因为开发人员通过代码模块化或者较小函数来组织代码。...另外,我同意新 API 理论上会降低代码质量最低门槛。但是我们可以使用以往防止代码变成意大利面条手段缓解这种情况。...另一方面,新 API 可以提升代码质量最高上限,相比 option api,你可以重构为质量更高代码。而且,基于 Option api 你还得解决类似 mixins 问题。

44420
领券