共计 3267 个字符,预计需要花费 9 分钟才能阅读完成。
咱们始终在寻找各种办法来清理代码、升高复杂性和改善性能。而重构为咱们指明了后退的方向。
1、什么是重构?
Martin Fowler 曾出版了两本无关重构的书籍,他认为:
重构指的是,在不扭转代码的内部行为,只改善其内部结构的形式下,批改软件系统的过程。重构是一种有条理的清理代码的形式,能够最大水平地缩小引入 bug 的机会。实质上,重构意味着在代码编写实现后,改良代码的设计。
2、 重构有什么益处?
重构源代码有数不清的益处。首先,重构能够将凌乱、不正确和 / 或反复的代码转换成整洁的代码。它能够解决多位开发人员协同工作时可能引发的代码标准化问题。重构能够进步可读性,改善源代码的可维护性以及整体构造和性能。重构能够使代码更易于扩大和增加新性能。删除不必要的代码(比方反复代码)能够缩小代码所应用的内存,并放慢执行速度。
例如,在 2014 年,Kickstarter 的工程师面临着一个微小的挑战:因为用户数量呈指迅速增长,导致查问性能降落。为此,他们将 MySQL 查问重构为 Redis,缩小了 100 毫秒的加载工夫,从而缩小了加载工夫的差别并进步了网站的整体速度。
3、 技术负债与重构
简而言之,重构是打消或缩小技术负债的一种形式。
重构对于长期维持的代码品质、安全性和性能至关重要。如果没有定期的重构,开发人员就会接受微小的技术负债。重构代码的机会越少,技术负债就会越多,开发新性能也会变得越来越难。
4、 重构的指标
咱们能够通过各种指标,掂量重构代码的优先级。在指标的帮忙下,咱们能够井井有条地打算重构,每一次都分心实现最重要的工作。
此外,你须要通过指标来掂量重构的成果。咱们不仅须要重构低效的代码,而且还能够通过批改低效代码减少价值。为了取得真正的价值,你须要进行测试,包含单元测试和功能测试。除此之外,还有一些其余方面的指标,比方发现的 bug 数缩小,以及升高循环复杂性(重构的指标是升高复杂性)。高度简单的办法或性能(比方超过 350 行的办法或性能)就是良好的重构对象。
此外,咱们还须要思考,如何将重构交融到更宽泛的团队指标或无关工作流和工作的里程碑中。
5、 代码重构示例
代码重构的示例十分多,为了简洁起见,咱们介绍以下几种:
红色,绿色和重构
重构与单元测试非亲非故。最常见的模式之一就是麻利办法固有的测试驱动开发(Test-Driven Development,即 TDD)。你能够在编写代码之前先编写测试。从实质上来说,应该由测试来驱动程序,阐明代码应该执行的操作。
红色,绿色和重构是测试驱动开发的一个示例:
- 红色:编写没有实现代码的测试套件,必然会失败。
- 绿色:编写实现代码,刚刚好能够通过测试套件。
- 重构:寻找优化和改良代码的办法。
提取办法(又名提取函数)
将代码片段从现有办法移到新办法中,而新办法的名称明确阐明了其性能。这种技术有助于升高复杂性并进步代码的可读性。
提取变量
如果遇到难以了解的表达式,或者该表达式在整个代码中反复了屡次,则能够通过提取变量重构,将表达式或其中一部分放入一个复杂度较低且更易于了解的变量中。这样能够缩小复杂性和代码反复。
按形象建设分支
按形象建设分支能够逐渐对软件系统进行大规模地批改,而你则能够一边批改代码,一边定期公布零碎。这种办法能够升高在分支上重构代码的复杂性,防止在合并代码时呈现问题。
办法组合
代码过长不便于了解,而且也不不便批改。办法组合指的是一系列的操作,将办法改成程序构造并删除反复的代码。这些操作包含内联办法、内联模板、用查问代替模板、拆分长期变量以及删除对参数的赋值等。
6、 重构代码的工具
你须要业余的重构工具吗?Martin Fowler 示意,自动化的工具有帮忙但不是必须的。他指出:
“许多语言都有 IDE,能够主动执行许多常见的重构。这些是十分有价值的工具,能够帮忙我更快地重构代码。然而,这些工具不是必不可少的,我常常在没有工具反对的状况下编写程序,每次只迈出一小步,并通过频繁的测试来发现错误。”
许多开发环境都能够自动化重构,一些常见的重构工具包含:
- Visual studio intellicode
- Eclipse IDE
- Spring Tool Suite 4
- Rider
- IntelliJ IDEA
- SonarQube
7、 重构与工程经理的难题
为了解决引发重构需要的问题,首先咱们须要弄清楚公司的经营形式。在着手重构之前,请先答复下列几个问题:
- 哪些工作最优先?
- 开发的速度如何?
- 开发人员是否感觉到了疾速交付代码的压力?
- 解决技术负债的流程都有哪些?
- 施行了哪些类型的代码审核?
- 团队成员是否具备适当的重构技能?
- 公司的文档规范是什么?
如果不解决引发重构需要的基本问题,那么问题只会愈演愈糟。
8、 高级管理层对重构的反对
你们公司可能并没有在基础设施和保护上投入太多资金。
可能会有人说,应该将破费在重构上的工夫投入到新性能开发上。
然而,咱们依然应该看一看重构的益处,以及它们与工作流程、客户、支出和业务增长的关系。重构切当能够改善代码,交付无效更新以及急需的性能,从而吸引新客户和回头客。即便在胜利公布产品之后,软件公司也能够通过这种形式放弃竞争力。
为了获取高层治理的反对,还有一个更好的办法,即量化团队以后破费在修复原始代码中的谬误或 bug 上的工夫。具体一点,比方每天一个小时?每天两个小时?继续记录一个星期,你就会诧异地发现原来团队每年须要破费数周或数月工夫来修复遗留的代码。
9、 团队反对与重构:一个 Sprint 还是马拉松?
很难在团队外部发展重构工作?提及重构就会哀声载道?顺利开展重构的最重要的标记就是有打算、有指标以及有文档记录的口头。Ron Jeffries(极限编程的三大创始人之一)将重构比喻为清道:
“花些工夫清出一条道来,那么下一次咱们就能够直奔咱们要构建的下一个性能,而无需绕过杂草和灌木丛。”
然而,他强调指出,蹩脚的代码须要破费很长的工夫来清理,而且重构应该通过三思而行:
“如果咱们只改良手头的代码,而疏忽目前不波及的代码,那么当前必然会走回头路。”
在同一个 Sprint 中,咱们常常发现前面的性能用到了咱们之前清理过的代码。咱们就会立刻享受重构的益处。如果咱们等积攒了一堆技术负债,再开始重构,那么咱们享受的益处会提早,甚至可能会在一些没大有用的中央节约精力。
产品工程师兼首席技术官 Andreas Klinger 是 Fix-it Friday 的粉丝,他示意:
“Fix-it Friday 的规定很简略:除非以后的我的项目兵临城下,否则周五的工作就应该是重构。让工程师抉择他们的工作。咱们不应该因为宏观治理而抹杀这种乐趣。有些人会尝试新的库。有些人会修复积压的 bug。这两种工作都很好。咱们尝试激励大家均衡这些工作。”
无论采纳哪种办法,你都须要谨慎思考,询问团队哪些代码最影响他们的效率。
- 修复哪些代码对你的其余代码产生的影响最大?
- 解决哪些问题失去的回报最多?
你不太可能找到一整块专门的工夫来重构代码,重构代码必然会就义你破费在其余我的项目上的工夫,但请不要低估定期保持发展小范畴的重构带来的影响。聚沙成塔,积少成多,最终你会取得丰富的回报。
10、 文档与重构
标准化命名约定之类的文档能够让每个人都达成共识。Xerox 的高级开发人员的钻研发现,不足文档是重构最大的难题之一。
记录重构的工作内容不仅能够记录破费的工夫,而且还能够为未来的团队成员提供阐明。
最初,你还通过文档记录下本人的胜利:重构带来的最大胜利是什么?这些能够成为代码审核的思考因素吗?
作者 | Alex Omeyer
译者 | 弯月
出品 | CSDN(ID:CSDNnews)
原文链接:https://medium.com/swlh/the-u…
近期热文举荐:
1.1,000+ 道 Java 面试题及答案整顿 (2021 最新版)
2. 终于靠开源我的项目弄到 IntelliJ IDEA 激活码了,真香!
3. 阿里 Mock 工具正式开源,干掉市面上所有 Mock 工具!
4.Spring Cloud 2020.0.0 正式公布,全新颠覆性版本!
5.《Java 开发手册(嵩山版)》最新公布,速速下载!
感觉不错,别忘了顺手点赞 + 转发哦!