让代码重构渐行渐远系列(1)——解除多层嵌套

重构背景及原因

  最近由于项目组的人员在不断扩充,导致项目中代码风格各异,大有百花齐放甚至怒放之势。考虑到团队的生存与发展,经过众人多次舌战之后,最终决定项目组根据业务分成几个小分队,以加强团队管理与提高效率,同时也能培养阶梯人才。各个小分队为了“统一”代码风格,提高成员的代码能力以便最终能提高项目代码质量,减少以后的维护成本,最终决定“每日”进行小组内的代码走查/审查(Code Review),然后进行代码重构。

解除多层嵌套:我所谓的多层嵌套是指的如下代码:

 1  public bool 多层嵌套(string 参数一, string 参数二, string 参数三, string 参数四)
 2         {
 3             if (!string.IsNullOrEmpty(参数一))
 4             {
 5                 //此处省略   参数一的处理代码
 6
 7                 if (!string.IsNullOrEmpty(参数二))
 8                 {
 9                     //此处省略   参数二的处理代码
10
11                     if (!string.IsNullOrEmpty(参数三))
12                     {
13                         //此处省略   参数三的处理代码
14
15                         if (!string.IsNullOrEmpty(参数四))
16                         {
17                             //此处省略   参数四的处理代码
18                             return true;
19                         }
20                     }
21                 }
22             }
23
24             return false;
25         }

  以上代码中一层层的嵌套着不仅增加了复杂度,也不利于阅读,尤其是当if条件下的处理逻辑代码过多时,几层嵌套下来第一层的IF包裹的代码量将相当大,也就增加了阅读的难度不利于以后维护了,尤其是其他人来维护。

  可能有些朋友会说我的业务就如此我能怎么办,难道我要和客户说这个业务太复杂了,你们简单点吧等等........难道就真的没有办法呢吗?其实不然,毕竟办法总是有的,就看你愿不愿意想啦,那么我们该怎么处理这种代码呢?  

  其实根据不同场景我们也有不同的处理方式

场景一: 各个if条件互相不影响,或者说是不互相依赖时,可以像如下方式处理:

 1  public bool 解除多层嵌套方式二(string 参数一, string 参数二, string 参数三, string 参数四)
 2         {
 3             if (string.IsNullOrEmpty(参数一) || string.IsNullOrEmpty(参数二) || string.IsNullOrEmpty(参数三) || string.IsNullOrEmpty(参数四))
 4             {
 5                 return false;
 6             }
 7
 8             //此处省略   参数一,二,三,四的处理代码
 9
10             return false;
11         }

场景二:各个条件语句有先后循序互相依赖时,我们可以如下处理:

 1 public bool 解除多层嵌套方式一(string 参数一, string 参数二, string 参数三, string 参数四)
 2         {
 3             if (string.IsNullOrEmpty(参数一))
 4             {
 5                 return false;
 6             }
 7
 8             //此处省略   参数一的处理代码
 9
10             if (string.IsNullOrEmpty(参数二))
11             {
12                 return false;
13
14             }
15
16             //此处省略   参数二的处理代码
17
18             if (string.IsNullOrEmpty(参数三))
19             {
20                 return false;
21             }
22
23             //此处省略   参数三的处理代码
24
25             if (string.IsNullOrEmpty(参数四))
26             {
27                 return false;
28             }
29
30             //此处省略   参数四的处理代码
31
32             return true;
33
34         }

总结:

  我们在开始写这种业务逻辑的时候,可能会不自觉的就写成了重构前的形式,导致一段时间后我们不得不再次熟悉代码,理解代码然后重构代码,那么我们为何不在写代码的时候,多多考虑下业务场景选择适合的方式呢?

  如果我们在写代码的时候就考虑到了这些我们还需要再花时间做此种重构么?代码重构怎能不渐行渐远呢?

  

时间: 2024-08-03 15:22:41

让代码重构渐行渐远系列(1)——解除多层嵌套的相关文章

让代码重构渐行渐远系列(3)——string.Equals取代直接比较与非比较

重构背景及原因 最近由于项目组的人员在不断扩充,导致项目中代码风格各异,大有百花齐放甚至怒放之势.考虑到团队的生存与发展,经过众人多次舌战之后,最终决定项目组根据业务分成几个小分队,以加强团队管理与提高效率,同时也能培养阶梯人才.各个小分队为了“统一”代码风格,提高成员的代码能力以便最终能提高项目代码质量,减少以后的维护成本,最终决定“每日”进行小组内的代码走查/审查(Code Review),然后进行代码重构. 直接比较与非比较:我所谓的直接比较与非比较是指"=="判断方式与&quo

让代码重构渐行渐远系列(2)——降低代码重复度

降低代码重复度:我所谓的代码重复指的不仅仅是多行一模一样的代码,同时也包括一些重复复制或是没必要的一些代码,如以下下代码: 1 public void 重复代码示例(int? 参数一) 2 { 3 if (参数一 != null) 4 { 5 //处理代码.... 6 } 7 else 8 { 9 参数一 = null; 10 //处理代码..... 11 } 12 13 //处理代码..... 14 15 } 可能有的朋友在第一眼看到这段代码时会说,这个没什么问题啊 ,哪有什么重复呀?真的就没

CSS代码重构

CSS代码重构的目的 我们写CSS代码时,不仅仅只是完成页面设计的效果,还应该让CSS代码易于管理,维护.我们对CSS代码重构主要有两个目的:1.提高代码性能2.提高代码的可维护性 提高代码性能 提高CSS代码性能主要有两个点:1.提高页面的加载性能提高页面的加载性能,简单说就是减小CSS文件的大小,提高页面的加载速度,尽可以的利用http缓存2.提高CSS代码性能不同的CSS代码,浏览器对其解析的速度也是不一样的,如何提高浏览器解析CSS代码的速度也是我们要考虑的 提高代码的可维护性 提高CS

CSS代码重构与优化之路

写CSS的同学们往往会体会到,随着项目规模的增加,项目中的CSS代码也会越来越多,如果没有及时对CSS代码进行维护,CSS代码不断会越来越多.CSS代码交错复杂,像一张庞大的蜘蛛网分布在网站的各个位置,你不知道修改这行代码会有什么影响,所以如果有修改或增加新功能时,开发人员往往不敢去删除旧的冗余的代码,而保险地增加新代码,最终的坏处就是项目中的CSS会越来越多,最终陷入无底洞. CSS代码重构的目的 我们写CSS代码时,不仅仅只是完成页面设计的效果,还应该让CSS代码易于管理,维护.我们对CSS

我的代码重构经验

说明 本文在<MDU某产品OMCI模块代码质量现状分析>一文的基础上,分享作者对该模块进行重构时的实践经验. 具体的重构手段可参考<代码大全2>或<重构:改善既有代码的设计>,本文不再班门弄斧,而侧重重构时一些粗浅的“方法论”,旨在提高重构效率. 作者未采用重量级的重构工具,仅用到Source Insight的”Smart Rename”功能.也未使用CUnit等单元测试工具,而是通过在线调测和自动化测试保证代码的正确性. 一 背景 MDU系列产品从他处接手,OMCI模

移动前端重构实战系列

移动前端重构实战系列:5-7章 2016-07-16 07:16 (本文系来自腾讯imweb团队 结一大大 关于移动端重构经验以及思想的实战系列,推荐点击左下角的阅读原文.) ”本系列教程为实战教程,是自己移动端重构经验及思想的一次总结,也是对sheral UI的一次全方位剖析,首发在imweb和w3cplus两大站点及“前端Talk”微信公众号,其余所有标注或没有标注来源的均为转载.“ ——imweb 结一 5.Form form 大概要实现的效果如下图(具体demo可见sheral form

ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(十一) 代码重构使用反射工厂解耦

前言 自从此博客发表以及代码开源以来,得到了许多人的关注.也没许多吧,反正在我意料之外的.包括几位大牛帮我做订阅号推广,真的很感谢他们.另外,还有几个高手给我提了一些架构上的问题.其实本身这个项目是没有做什么架构设计的.只是简单分了分层.不过我在经过仔细思考之后决定对项目架构做些调整,当然在我的技术范围之内,我相信还会有第二次,第三次甚至更多重构,我希望把他变得更加完美. 重构思路 对于重构思路,我首先想到的是,让程序能够支持多种数据库,比如我现在用的是SQLServer,而好多朋友用MySQL

关于代码重构:是微修还是全部推倒重来

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 虽然不是很切题但还是放在Cocos2D的学习系列博文中吧,因为这是我写cocos2D代码中体会到的. RPG游戏码代码到现在已经写了不少行代码了. 最近在加入新功能的时候发现以前遗留的人物对话问题一直没有解决,游戏对话逻辑是RPG中重要的逻辑,而我的代码问题具体表现在: 对话代码逻辑及其复杂.因为以前从来没有写过类似的代码,要想支持游戏剧情的复杂性,必须将对话

设计模式与代码重构——ios篇

有一阵子没写技术分享文了,最近每个月写一篇个人空间日记.主要是觉得自己技术比较一般写不出有质量的东西,误人子弟.互联网信息膨胀,让我们获取信息更加便捷,然而获取个人所需的正确信息,却需要每个人具备更强的搜索能力.搜索能力作为代码,就需要更优的算法.算法就像是程序的CPU,决定着程序的运行效率. 与其说电脑改变了世界,不如说是电脑改变了人类改变世界的效率.电脑其实是根据人脑设计的,而程序思想和人的思想相通,所以一个程序员在学会一门语言后,学习第二门语言会来的容易很多,因为编程思想是相通的.我认为,