什么是重构

什么是重构

在不改动代码外在行为的前提下,对代码做出修正,以改进程序的内部结构。

重构对功能的影响

重构不是代码优化,重构注重的是进步代码的可了解性与可扩展性,对功能的影响可好可坏。

评价是否需求重构

假如需求给程序增加特性,但因为代码缺少杰出结构而难以更改,那能够先重构使其易于修正。

需求的改动使重构必要,假如代码正常运转,不会再被修正,那彻底能够不去重构。

重构的第一步

保证行将修正的代码具有一组可靠的测验

重构的进程

分小步走,每修正一小步,从头编译、测验、提交。

营地规律

保证你离开时的代码库一定比来时更健康

重构的准则

了解重构

重构(名词):对软件内部结构的一种调整,意图是在不改动软件可调查行为的前提下,进步其可了解性,降低其修正本钱

重构的关键在于运用很多细小且保持软件行为的步骤,一步步达到大规模的修正。

两顶帽子

代码开发进程中两种截然不同的行为,增加新功能重构

不应该常常变换帽子,每次只应该专心于其间一项作业。

为何重构

重构改进软件的规划

假如没有重构,程序的内部规划(或许叫架构)会逐渐腐败蜕变。

当人们只为短期意图而修正代码时,他们常常没有彻底了解架构的整体规划,所以代码逐渐失去了自己的结构。

代码结质量的蜕变具有累计效应、破窗效应

重构使软件更简略了解

合理的重构能让代码**“自解释”**。

比让计算机读懂代码更难的是,让“人”读懂代码。

重构帮忙找到bug

深化了解代码的所作所为,并立即把新的了解反映在代码当中,在这个进程中,bug自然会被发现。

重构进步编程速度

不同质量的规划,随着功能累计,增加新功能所需的时刻。

重构:改善既有代码的设计 读书笔记- 重构的原则

需求增加新功能时,内部质量杰出的软件让我能够很简略找到在哪里修正、怎么修正。杰出的模块区分使我只需求 了解代码库的一小部分,就能够做出修正。假如代码很清晰,我引进bug的可能 性就会变小,即使引进了bug,调试也会简略得多。抱负情况下,我的代码库会逐渐演化成一个渠道,在其上能够很简略地结构与其范畴相关的新功能。

“规划耐久性假说”:经过投入精力改进内部规划,我们增加了软件的耐久性,然后能够更长时刻地保持开发的快速。

何时重构

见机行事的重构

预备性重构:让增加新功能更简略

重构的最佳时机就在增加新功能之前。

帮助了解的重构:使代码更易懂

当代码难以了解,使用重构来帮助了解。

捡废物式重构

在日常开发进程中,对不好的实现,经过重构进行整理。

项目方案上没有专门留给重构的时刻,绝大多数重构都在做其他事(增加新功能或许修正bug)的进程中自然发生。

优异的程序员知道,增加新功能最快的办法往往是先修正现有的代码,使新功能简略被加入。

有方案的重构

问题在某个区域逐渐累积长大,终究需求专门花些时刻来处理。

别离重构和增加新功能的提交是比较有益的作业方式。

大规模的重构只在必要的时分进行,更推荐的办法仍是随时随地重构作业相关的代码。

Branch By Abstraction

假如要替换掉一个正在使用的库,先引进抽象层,兼容新旧两个库的接口

Code Review时重构

和原作者一起结对编程,经过CR进程中提出的重构主张,进步代码的质量。

何时不应该重构

  • 代码不需求被了解和修正时。
  • 重写比重构简略时。

重构的挑战

推迟新功能开发?

重构的仅有意图就是让我们开发更快,用更少的作业量创造更大的价值。

有时分需求取舍,增加的功能很小但是需求做很大规模的重构时,能够先增加新功能。

代码所有权

推荐团队代码所有制,而不是细粒度的强代码所有制。

版本操控问题

怎么处理在阻隔的分支,集成回主线,需求处理很多抵触的问题。

选用继续集成(CI),基于骨干开发的办法,每天至少向主线集成一次,保证主线随时处于健康状况。

测验

“不会改动程序可调查的行为”,要求代码应该有一套齐备的测验套件,而且运转速度要快,能在一步小的重构后,立刻验证程序的正确性

重构、架构和YAGNI

一开始就完结完美的架构规划是不可能的,当具有重构的时分,我们能够做简略规划(也称增量式规划或许YAGNI)

只依据当时的需求来结构软件,一起把软件的规划质量做得很高。随着对用户需求的了解加深,我会对架构进行重构,使其能够应对新的需求。

重构与软件开发进程

灵敏开发的三大实践

  • 自测验代码
  • 继续集成
  • 重构

重构与功能

短期看来,重构的确可能使软件变慢,但它使优化阶段的软件功能调优更简略,终究仍是会得到好的作用。

功能优化的进程:度量->发现功能热门->去除热门

大多数程序的功能都消耗在一小部分的代码上,要先对程序有清楚的了解,不要经过臆想进行功能优化