本文主要介绍代码整洁的方式(重构)。无论什么语言,重构都是软件开发过程中不可或缺的一部分,具有一定的参考价值。感兴趣的朋友可以参考一下。
前言
之前也介绍过,我们团队的前端项目从无到有经历了8个月10万行的迭代业务代码(只有产品长期规划需求的20%),目前还在迭代过程中。
除了设计一个好的架构来管理这个极其复杂的前端应用,团队成员也开始补充设计模式和重构的知识。目的是在不断迭代的过程中优化项目代码,保持代码的新鲜、健壮和可维护性……让后来加入的新团队成员能够快速加入我们的产品开发。
PS:无论对于任何语言,重构都是软件开发过程中不可或缺的一部分。如果你已经知道了重构的基础,你可以直接跳到文章后面的重构案例部分。
重构背景
“尿布臭了就换”。
随着业务需求的不断增加,随着时间的推移,代码变得越来越糟糕。
这可能包括以下不良嗜好(仅举几例):
的重复代码
函数太长
遵循一个原则:每当你觉得需要注释来解释某件事的时候,你可以试着把它写成一个函数。
裁员
当子类做得不够的时候,或者在可见的预期之内,就不会出现新的情况。考虑内联类。
太长的课
这种情况容易产生冗余代码。比如一个类中有多个前缀或后缀相同的变量,就意味着可以考虑把它们细化成一个组件,或者考虑这个组件能否成为子类,通过细化类来重构。
什么是重构
让我们回头看看“什么是重构”
改进软件的内部结构,而不改变其可观察到的行为。
从而提高可理解性,降低改造成本。
摘自《重构 - 改善既有代码的设计》(以下简称《重构》)
何时重构?
我们需要明确一点:重构不是应该搁置一段时间的事情。重构不是目的,但是重构可以帮助你把事情做好。
然而,有三件事是重建的。
重复性工作,当现有代码不能帮助您轻松添加新功能时
修复bug时很难排除逻辑故障。
代码审查允许其他人审查代码是否可读和可理解。
太多代码没有注释,连自己都无法快速理清代码逻辑。
重构的衡量指标
数量:代码的行数。
质量:代码复杂度、耦合度、可读性、架构依赖复杂度等。
成本:花费的时间。
奖励(成就):支持后续功能快速叠加,解决现有因代码设计问题无法优化的矛盾。
抓重点 抓重点啦
说了这么多废话,其实大家都知道,所有不结合实际的理论都是空洞的。
但重构和设计模式一样,也是一个‘学习三三五四,理解三三五四突破’的过程。学习的第一步让你了解基本的重建技术,实践的第二步唤起你对重建技术的记忆并重温其应用,应用和实践的第三步启发你思考、领悟和总结,从而灵活运用。
但是大家总是在不断的学习和复习,从而达到具体场景的具体应用,灵活机动。
重构是一个大话题。《重构》作者经历过N多个项目,重构的技巧是多年经验总结出来的。
重构技巧
《755-79000》一书作者总结的重构方法太多了。只有图片才能显示所有作者总结的重构列表。
具体补充可以看《重构》这本书。
重构的实践
作者推荐的一种做法:
随机选择一个目标。先给自己选择一个目标(比如“去掉一堆不必要的子类”),然后朝着目标前进,每一步都很小但很坚定。
如果你不确定就停下来。当你无法证明你所做的一切能够保证原程序的逻辑和语义时,请停下来想一想:现有的重构是否得到了改进或者没有结果,需要取消?
确保每个重构的测试都能正常运行。
作为开发者,你应该把重构作为开发的一部分,边开发边重构。在快速堆叠代码,实现基本需求的基础上,编写测试用例,保持功能不变,逐步重构。
这也是为什么我们团队要求每个人都要掌握重构的必备技能。优秀的程序员应该尽量避免低质量的代码。
重建案例
故事场景
顾客可以租借三种类型的电影。
租赁规则
价格计算规则:
普通片——起步价2,超过2天的部分每天每片1.3元。
新片——每天每部3元
儿童片—— 2起,超过3天的部分每天每片0.8元。
积分计算规则:
每部电影加1,新电影加2。
原始代码
密码笔
程序:(请确保重构后结果不变~)
类图
如果有兴趣,可以先看看原代码,考虑原对象关系,再考虑如何重构代码。其实原代码中有很多问题是可以挖掘的。下面是我们的讨论:
划分责任,遵循单一责任原则。
对账单打印账单功能承担了很多功能,包括费用计算、积分计算、结果显示等。
1: 6.1提取方法(提取功能)3354最常用的重建技术
2: 9.1分解条件(分解条件表达式)
用户承担了不属于它的责任,包括收费规则和积分规则。这些职责应该属于电影类型。
明确商业逻辑,比如收费规则,积分规则——看故事场景。
不要直接访问对象的数据。其他对象很容易改变这个对象的数据,但是拥有这个数据的对象对此一无所知。
解决方案:8.10封装字段3354使得数据和行为想要分离。
重构不应该被外界察觉,这样测试用例仍然是可行的。
部分重构
这里为了更好的展示重构的方法,根据上面的讨论,使用TS进行部分重构。重构的方式其实取决于业务未来的拓展方向,没有最优解。有兴趣的可以加入我们,抛出你的看法~
代码打开执行结果:
重构类图关系
基本技巧
采取小步骤并经常测试(确保足够的测试来支持你的重构行为)
使用智能开发工具(如VSCode右键可以对过长的功能代码进行反汇编和功能化)。
推荐书籍
《重构》
《代码整洁之道》
《重构 - 改善既有代码的设计》
《修改代码的艺术》
这就是本文的全部内容。希望对大家的学习有帮助,支持我们。