【云驻共创】代码重构:进阶编程高手的必修秘笈
1. 为什么要进行软件重构
从商业的角度看软件研发,利润大概可以表示为软件价值减去研发和维护成本。以下图为例,在发现商机的初始阶段,软件价值为零,而随着软件版本的迭代,其价值呈线性增长。与此同时,软件的复杂度也呈曲线上涨,那么随之带来的就是利润的下滑。
2. 代码重构的好处
华为代码重构团队以某公共组件以及某地理信息系统为例,讲述了其在华为内部的成功案例。
针对某公共组件,在代码改造之前,其代码量大、安装包厚重、部署时间长以及性能存在瓶颈等短板拖慢了团队的研发进程。而在改造后,其代码量减少了65%,安装包大小减少了74%,安装时间减少了75%以及网络性能提升了三倍。
针对某地理信息系统,在代码改造之前,需求与开发速度完全不匹配,从而导致开发停滞,除此之外,其单体架构导致性能瓶颈不易定位,且难以扩展。而在改造完之后,形成了从单体架构到微服务架构的眼睛,支持水平扩展与组件化发布,在代码方面、并发性能以及需求响应速度方面也有较大改善,分别减少了30%、提升了10倍以及提升了5倍。
总结上述成功经验,其成功要素即为:代码重构。
华为主营电信业务,其对代码质量的要求是非常高的,华为的代码规模以10亿级计算,以此为背景,华为公司内部孵化了此代码重构课程。
3. 重构是什么
当需求来到程序员手中,一百个程序员有一百种实现方式,即便是一个程序员,在不同时期可能也有不同的实现方法。下图对比了同一个功能的两种不同实现方式,从软件的内部结构来看,模块内的内聚性以及模块间的耦合性可用于衡量软件内部的好坏。如果说我们的代码如下图左下角所示,那么下图中间部分的代码结构则是我们应该学习的。于是,我们可以给重构一个定义,对软件的内部结构进行调整,在不改变软件可观测行为的前提下提高其可理解性,降低修改成本。
在进入重构之前,我们先来看一下什么是代码坏味道。从粗略的角度来说,违反编码原则、编写不易维护的代码都是属于代码坏味道。经典的坏味道有24钟,具体可见《重构 改善既有代码的设计(第二版)》。
从代码范围的角度来说,代码重构分为局部以及广泛两种,前者针对代码片段,多用于日常开发与小步迭代;而后者则是代码架构级别的重构,需要专家投入以及统一的代码规划。
4. 一段代码的恶化过程
以下图为例,我们来看看一段代码的恶化过程:
1. 我们有一个电话的类定义,其字段的访问修饰符为default,也就是外部可对其进行修改,与此同时,类中只含有字段,那么可将其归纳为可变数据类。
2. 我们还有个拥有电话的人,那么我们在Person类中除了定义其name字段外还定义了phone字段。
3. 为了得到直接用于拨号的号码,可以写成,如上图中序号3所示。由于getPhoneNumber访问了phone内部的变量,就产生了特性依恋问题。
4. 假如有家公司也装了电话,那么我们写法如上图中序号4所示,其getPhoneNumber方法与序号3一样,很明显两个类产生了重复代码。
5. 当需求方要求拨号方时本地区号时不加区号,那么我们针对将上图中序号3改为序号5所示。
6. 而如果将Person表示为POJO,那么加个get方法也是顺理成章,那么就产生了如图序号6所示的冗余。
7. 为了给用户设置phone,新增set即出现了如上图序号7所示。
8. 在需求方加了区号之外,又想要添加国家码,那么就导致了需要进行一系列修改。
而如果我们的代码一开始是如最后一个小图所示,改访问修饰符、加final、加内置方法,那么就可以避免上述的特性依恋,杜绝了消息链和内幕交易,较少了重复代码以及避免了控制逃逸问题。
当然,如果说Phone只是个VO,原来的写法也是没问题的。
5. 课程定位
在本次重构课程,其定位如下图所示。
具体来说可以概括为以下几点:
● 充分考虑时间约束、讲解直观性、时间成本、语言和工具障碍
● 基本的重构手法普及为小目标
● 以Java编程语言、IDEA编程工具为例的小范围重构
● 利用碎片化时间学习
● 针对代码坏味道进行讲解
● 在理念上,抓住重点、简化问题、追求实效以及串联知识。
6. 课程形式
针对每种坏味道,老师们精心准备了短视频和课件、坏味道代码库、练习与测试题目以及关联信息速查技能。
下图为课程样例:
针对过长参数列表代码坏味道,首先开门见山讲述该代码坏味道的形式,进而引入案例以及代码,接着讲述如何改良坏味道代码以及将坏味道代码与改良后的代码进行对比,然后讲述详细的操作步骤,紧接着讲述如何在IDEA中进行实际操作,在讲完上述坏味道代码改良之后,有针对地进行知识拓展,最后总结代码坏味道起因、描述、改进方法等。
7. 基础演示介绍
本次课程需要预装的软件如下图所示:
在下载项目之后,需要先进行编译,当然可通过命令行的方式,也可通过IDEA直接进行编译,其下图所示:
以01.mysterious-name为例,其中包括三个部分,mysterious-name-init表示重构之前含有坏味道代码的项目,mysterious-name-refactor-reference表示重构后的代码,而Refactoring Actions.md表示重构的过程。
IDEA的快捷键可有效增加代码开发效率,例如:
● 将光标放置到单词中间,使用shift + F6可对相关代码进行重命名
● 使用ctrl + w(w按1次、2次、3次...)可扩大代码范围选择
● 使用ctrl + shift + w(w按1次、2次、3次...)可减小代码范围选择
● 使用ctrl + shift + 向上箭头 可整体向上移动代码块
● 使用alt + shift + 向上箭头 可将本行向上移动
● 使用ctrl + tab + 上下箭头 进行窗口切换
● 使用ctrl + n 或者两次shift 用于查看某个类
● 使用ctrl + shift + alt + t进行快速代码重构
为了更好地了解快捷键,还可以通过如下方式进行导出:
8. 代码重构的时机
由于各种原因,代码的腐化经常是无法避免的,那么什么时候才要开始重构呢?在日常开发中,可进行局部范围内的小步迭代与代码提交,而当产品遇到难以演进的问题时,则需要统一规划,实施架构级别的重构。那么在这种坚持重构的情况下,利润率往往也是会稳定上升的。
但是,重构也是有一定的先决条件的,重构需要保证业务在重构前后行为一致。也就是需要有有效的测试防护和高效的工具链,比如代码托管、流水线以及代码检查等,更多也可参考华为云软件开发平台DevCloud。
当然,重构也是有章可循的,从经验看,可分为以下几步:
● 测试防护
● 重构计划
● 实施重构
● 门禁检查
● Code Review
9. 补充信息
关于坏味道与快捷键,有以下两种建议:
● 关于坏味道,没有统一的度量方式,需要培养自己的判断能力;
● 关于快捷键,一定要使用快捷键,它可以极大提高你的开发效率;
10. 总结
本文为华为代码重构课程的开篇,整体讲述了代码重构带来的价值以及代码恶化带来的影响;继而介绍了华为代码重构课程的定位与形式,并以基础演示为例讲述了课程内容的丰富性与实操性;最后阐述了代码重构的时机以及补充了开发人员需要培养的代码坏味道识别能力与对开发工具快捷键的熟练使用能力。
11. 参考资料
本文参与华为云社区【内容共创】活动第16期。
https://bbs.huaweicloud.com/blogs/352652
任务15:代码重构:进阶编程高手的必修秘笈
- 点赞
- 收藏
- 关注作者
评论(0)