代码重构之逻辑聚集

上一篇文章中写了一个重构数据结构,也就是数据聚集的例子。之前还有过一个经历,是重构一个很长的函数,过程大概就是把相关的逻辑聚集起来。我将其称为逻辑聚集。这是一个重构代码逻辑的过程。

故事是这样的。在我手上的,是一个由几百行代码组成的函数。程序整体上看起来有比较清晰的代码块,有的代码块很相似,但是细节有不同。曾经尝试修改过这个代码。但是,由于一些局部变量贯穿整个函数,在不同的地方发挥作用,而且,不同的代码块之间相互影响。所以,修改这个函数的逻辑很困难,一个小的改动就要改好几个地方。所以,就想着重构一下这段代码。最直接的目标就是,将这个函数变短到几十行的样子,并且使得函数更容易理解。

首先,将几个看起来相似的代码块提取出来,抽象成一个单独的函数。而对于这几个代码块中不同的部分,则以变量的形式表示,作为函数的参数。需要注意的是,在修改过程中,要将只在代码块中起作用的变量作为局部变量,而将前面代码穿过了的参数作为函数参数传入进来,并且将代码块中修改了,而后续代码还有用的变量作为函数的返回参数。

其次,将其他的逻辑相对比较独立的代码块提取出来,抽象成单独的函数。同样要注意上面所提的事项。

最好,很重要的一点,要注意给每个提取出来的函数起一个直观易懂的名字。

经过这样的修改之后,我惊奇的发现整个函数变得很短,也很容易理解,很直观。整个函数看起来可能类似这样

1 void process_data(int* data, int len, int flag) {
2   parse_data(data, len);
3   if (flag) {
4     transform_data_with_method_1(data, len);
5   } else {
6     transform_data_with_method_2(data, len);
7   }
8   compress_data(data, len);
9 }

而且前面提到的那些贯穿整个函数的局部变量也被消除掉了。这时候尝试对代码做一些修改就容易多了。

最后,总结一下逻辑聚集的好处

  • 聚集起来的短小函数更容易重用
  • 聚集起来的短小函数更容易测试
  • 由若干个调用这些短小函数所组成的代码更容易理解,有问题更容易发现,也更容易修改和扩展。
  • 短小的函数使得局部变量的作用域更小,因此程序整体上更容易做并行,所有在有些情况下可以使程序运行效率更高。
时间: 2024-11-05 12:32:44

代码重构之逻辑聚集的相关文章

代码重构实例之数据聚集

敏捷开发强调,要经常重构代码.在开发过程中,往往是开发和重构交替进行.短暂的重构,可以使得后续的开发维护更加容易.我觉得,代码重构可以分为逻辑重构和数据结构重构.数据结构的重构往往需要对代码进行多处改动:但是,数据结构的重构也可以为后续的开发维护带来更大的便利.这里就是一个数据结构重构的例子. 这是以前的一次代码重构经历,今天想起了,就记下来,帮助自己记忆.当然,既然是重构,总得承认自己写的第一版丑陋的代码. 为了方便描述,采用javascript来进行说明. 故事是这样的.刚开始,任务是画一些

代码重构之 —— 一堆if、esle 逻辑的处理

这几天,接手一个同事的代码,关于微信接口开发的,那一堆的 if,看得哥蛋痛了,这个毛病也是很多新手容易犯的,所以特地把这次重构写出来. 下面来我们看看这个代码的问题所在,if else 里面的代码块逻辑,不好改,使得它的重用性为 0,并且难以阅读.当然,如果 if 只有一两个,或者3个,这样写是问题不大的. 但是如果多了,这种代码便会让维护变得困难起来. if (strMsgType == "text") { textContentClient = rootElement.Select

step 1 代码重构

代码重构 代码重构介绍 重构目的 相同的代码最好只出现一次 主次方法 主方法 只包含实现完整逻辑的子方法 思维清楚,便于阅读 次方法 实现具体逻辑功能 测试通过后,后续几乎不用维护 重构的步骤 1  新建一个方法 ?                     新建方法 ?                     把要抽取的代码,直接复制到新方法中 ?                     根据需求调整参数 2  调整旧代码 ?                     注释原代码,给自己一个后悔的

编码规范和代码重构的一些建议

首先推荐两个工具,一个是Resharper 一个是dotcover 代码应在注释较少的前提下能让别人读的懂,而不是只能让机器读的懂 如果自己都觉得自己写的代码丑,那么请您重构 尽可能的避免重复代码 必要的时候可以使用静态变量来保存查询出来的数据,建议将静态变量设置为只读的并且私有的,通过只读属性来访问它 区别对待静态变量和静态属性 静态属性中直接调用方法,不会带来性能的提升,而静态变量可以 谨慎使用可读的.非私有的静态变量或属性 代码的暴露程度尽可能的低(能用internal不用protecte

我的代码重构经验

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

记录一次代码重构的思路(初稿)

本次重构,需要注意: 1.代码的规范,详细的注释 主要集中 在方法和类的描叙 2.目录结构的合理,包名的设计 首先目录的设计: 1.activitiy的目录 (所有的界面) 2.serverice目录 (后台的服务) 3.通用的目录 (通用的方法与常量:譬如时间,字符串操作,定义常量) 4.数据库 目录 (sqlite的方法) 5.网络通信目录(上传数据与更新软件的) 6.文件目录(文件操作的目录) 7.参数配置目录 (配置xml的方法) 最终设计的结果: 文件目录与参赛配置,都放到tools中

代码重构(二):类重构规则(Swift版)

在上篇博客<代码重构(一):函数重构规则(Swift版)>中,详细的介绍了函数的重构规则,其中主要包括:Extract Method, Inline Method, Inline Temp, Replace Temp with Query, Introduce Explaining Variable, Split Temporary Variable, Remove Assignments to Parameters, Replace Method with Method Object等.关于

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

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

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

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