代码重构的招式

背景介绍

最近在团队工作中花了不少心思主导建设了测试平台,前期的建设思路是能用就行,随着建设的深入,逐渐需要学习下代码架构设计方面的内容了。于是参加了公司组织的代码重构与模式的培训,通过培训,感觉收获颇丰,故有此文,上一篇是从代码设计原则角度出发内容的总结,本篇是从重构的技术细节出发,进行的总结。

从名字开始规范

避免使用泛泛的名字

例如temp,foo,i,var等,尽量替换成含义相对明确的变

例如下面这段代码,你能想到上面retval是什么吗?是:return value

如果替换成这样的,阅读起来就更加清晰一些

在循环中,i,可以加上循环的前缀来命名

for (int i = 0; i < clubs.size(); i++)for (int j = 0; j < clubs[i].members.size(); j++)for (int k = 0; k < users.size(); k++)if (clubs[i].members[k] == users[j])cout << "user[" << j << "] is in club[" << i << "]" << endl;
if (clubs[ci].members[ui] == users[mi]) // Bugif (clubs[ci].members[mi] == users[ui]) // Ok

为名字附带更多的信息

例如:时间的命名,带上单位;加上形容词等方式。

Start(int delay) #这个延时是秒还是毫秒?Start(int delay_ms) #毫秒延时,很清晰

 

避免让人误解的名称

  1. 例如:Filter的含义。传参:addr="郑州",是要郑州的还是不要郑州的?
  2. 例如:start-end,可以换成first,last,可以清晰边界
  3. 例如给布尔值命名:
    1. bool read_password  = True  这种含义不清,可以加上is  can has should等
    2. 避免使用否定词:例如bool disable_ssl =False

提升代码的可读性

按照杂志的思想组织,而不是报纸的思路组织。

杂志有目录,整体有结构,从哪里开始都可以

提取公共部分

例如下面的修改:

修改前:

修改后:

用函数来整理不规则的代码

修改前:


修改后

把声明按块组织

修改前

修改后:分块添加注释

使用自描述代码替代大量注释

修改前

修改后

关于注释

  1. 好代码 > 坏代码 + 好注释
  2. 避免喃喃式注释。
  3. 注释尽量写背景信息,也就是为什么要有这个。

什么情况下写注释

给常量添加注释

EG:NUM_THREADS = 8 # 只要 >= 2 * num_processors, 就足够了.

给意料之中的提问加注释

// 只有与空vector交换才能真正回收内存

公布可能的陷阱

让注释保持紧凑

可以适当的使用一些符号,不必是纯文字表达。

修改前

修改后

正如下图

优化 条件判断与循环

先处理正向逻辑

反例:

调整为:

只在简单的条件下使用三目运算符

避免使用do……while

通过提前返回减少嵌套

例如:

修改为

较少循环内嵌套

拆分复杂表达式

用解释变量简化表达式

把超长表达式拆分成更容易理解的小块

不要滥用短路逻辑

换个表达的角度

例如:判断重叠的逻辑

正向逻辑的表达:太复杂

反向分析:

通过查表简化逻辑

如何写一个好的Unit Test

提取为统一函数

修改前:

修改后:

 

写在最后

这部分总结是将代码重构细节操作的角度进行了总结,里面有不少例子,看了就能懂,拿来就能用,对于我这种经验不足的人来说,刚刚好。因此这次培训也算是打开了我进行代码重构、代码架构设计的一扇窗,希望之后能继续深入学习、实践!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/444754.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

往年国自然项目信息查看

1 国自然申报系统 进去可以看到摘要。 2 letpub

(1)从 AGP 4.1.2 升级到 7.5.1 我遇到了什么问题

AGP 升级问题 &#xff08;1&#xff09;Could not get unknown property ‘project’ for settings&#xff0c;on project.buildscript 问题 Could not get unknown property ‘project’ for settings ‘AGP1’ of type org.gradle.initialization.DefaultSettings. agp4 …

备战蓝桥杯---数据结构与STL应用(入门4)

本专题主要是关于利用优先队列解决贪心选择上的“反悔”问题 话不多说&#xff0c;直接看题&#xff1a; 下面为分析&#xff1a; 很显然&#xff0c;我们在整体上以s[i]为基准&#xff0c;先把士兵按s[i]排好。然后&#xff0c;我们先求s[i]大的开始&#xff0c;即规定选人数…

牛客——字符串(尺取法与滑动窗口)

链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 题目描述 小N现在有一个字符串S。他把这这个字符串的所有子串都挑了出来。一个S的子串T是合法的&#xff0c;当且仅当T中包含了所有的小写字母。小N希望知道所有的合法的S的子串中&#xff0c…

微信小程序(二十三)获取页面栈及当前页面实例

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1.页面栈的定义 2.获取当前页面实例 页面栈 当我们从A页面跳到B页面再跳到C页面时&#xff0c;页面栈则是由三个页面的实例组成的数组&#xff0c;A在下标为0的数组中&#xff0c;C在下标为2的数组中 当然&#…

基于二值化图像转GCode的螺旋扫描实现

基于二值化图像转GCode的螺旋扫描实现 什么是双向扫描螺旋扫描代码示例 基于二值化图像转GCode的螺旋扫描实现 什么是螺旋扫描 螺旋扫描&#xff08;Spiral Scanning&#xff09;是激光雕刻中一种特殊的扫描方式&#xff0c;其特点是激光头按照螺旋形状逐渐向外移动&#xf…

再讲 Session 和 Token,彻底弄明白

前言 在构建用户身份管理系统时&#xff0c;选择会话&#xff08;Session&#xff09;还是令牌&#xff08;Token&#xff09;是一个关键决策&#xff0c;取决于系统的需求和特定的使用场景。本文将深入探讨何时适合使用会话&#xff0c;何时适合使用令牌&#xff0c;以帮助开发…

国图公考:考公和考编一样吗?

公务员&#xff1a;是指在各级机关中&#xff0c;符合规定&#xff0c;行使职权&#xff0c;执行公务的人员 事业单位&#xff1a;事业单位是指由国家或社会组织举办&#xff0c;从事教育、科学、文化、卫生、体育等社会公益事业的单位。 公务员和事业编都是有编制的&#xf…

制造业工厂实施MES系统带来的价值是什么?

MES系统的应用能给制造业带来哪些价值&#xff1f;制造企业想要获得更大的利润&#xff0c;就要从生产开始着手。生产制造是工厂的核心,是公司最大的成本来源。企业只有通过信息化的管理模式&#xff0c;从而达到节约成本&#xff0c;提高质量&#xff0c;才能为客户提供更满意…

8.DNS域名解析服务器

目录 1. 概述 1.1. 产生原因 1.2. 作用&#xff1a; 1.3. 连接方式 1.4. 因特网的域名结构 1.4.1. 拓扑&#xff1a; 1.4.2. 分类 1.4.3. 域名服务器类型划分 2. DNS域名解析过程 2.1. 分类&#xff1a; 2.2. 解析图&#xff1a; 2.2.1. 图&#xff1a; 2.2.2. 过…

hot100:26环形链表II

题目链接&#xff1a; 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 算法思想&#xff1a; 在环形链表hot100&#xff1a;25环形链表-CSDN博客这篇博客中&#xff0c;我们解决了如何判断一个链表有环&#xff0c;即快慢指针相遇的地方就证明链表…

【机器学习】监督学习算法之:线性回归

线性回归 1、引言2、线性回归2.1 定义2.2 基本原理2.3 公式2.4 实现2.5 代码示例 3、总结 1、引言 小屌丝&#xff1a;鱼哥&#xff0c;最近机器学习的文章写的不少啊。 小鱼&#xff1a;你还挺细心的哦。 小屌丝&#xff1a;那必须的&#xff0c;我要学习&#xff0c;我要成长…