下一节 读书笔记 -《重构-改善既有代码的设计》Part2
什么是重构
重构是这样一个过程:在不改变代码外在行为的前提下,对代码做出修改,以改进程序的内部结构。
为什么编码后还需要改进程序内部结构,不是先设计而后编码吗?
在软件版本迭代的过程中,随着特性的增加,开发人员的流动等客观原因,软件代码质量会逐渐下降,而不断的”重构“正是改善软件代码质量的手段。
面向对象机制对于”重构“有很大的作用
重构 - 第一个案例
-
如果程序需要添加一个功能,但是代码结构无法方便的达成目的,那就需要考虑重构代码,而后再方便的添加特性
-
当我们进行重构的时候,第一步需要考虑的是构建一组可靠的测试环境。
好的测试是重构的根本,是必要的安全保障。
-
代码块越小,代码的功能就越容易管理,代码的处理和移动就越轻松。
-
重构技术就是以微小的步骤修改程序,一步一步演进。
-
好的代码应该清楚表达出自己的功能,变量名称是代码清晰的关键。-- 命名规则对于好的代码是重要的
第一个案例给我们最大的启发是重构的节奏:测试,小修改,测试,小修改,测试,小修改…正式这种节奏让重构得以快速而安全的前进。
重构原则
重构的两种定义
重构(名词)
对软件内部结构的一种调整,目的是在不改变软件可观察行为的前提下,提高其可理解性,降低其修改成本。
重构(动词)
使用一系列重构手法,在不改变软件可观察行为的前提下,调整其结构。
Kent Beck 两顶帽子
比喻两种代码行为,一是添加新功能,二是重构
添加新功能时不应该修改既有代码,重构时不应该添加新功能,重构一般不必修改测试
为何重构
-
重构改进软件设计
没有重构,程序的设计会逐渐腐败变质
-
重构使软件更容易理解
Johnson 把 “早期重构” 描述为 “擦掉窗户上的污垢,是你看的更远”
重构让代码看起来更轻松
-
重构帮助找到 bug
在理解代码的基础上,找到 bug 不是一件痛苦的事情
Kent Beck: “我不是一个伟大的程序员,我只是个有着一些优秀习惯的好程序员。”
-
重构提高编程速度
何时重构
我们从不为重构而重构
重构不是一件应该特别拨出时间做的事情,而是应该随时随地进行的。
三次法则
Don Roberts 给了一条准则:事不过三,三则重构
添加功能时重构
最常见的重构时机就是我想给软件添加新特性的时候。
更快速的厘清代码结构,便于理解;更轻松的添加功能,便于扩展。
修补错误时重构
调试过程中运用重构,多半是为了让代码更具可读性。
检视代码时重构
Code Review 过程中,可以发现很多代码问题,这种活动能够改善代码开发状态,优化代码结构演进。
何时不该重构
- 当你需要考虑重新编写所有代码的时候,重构没有意义,因为这成了一个新的项目
- 重构前代码应该是绝大多数情况下稳定的,如果做不到,应该考虑重写
- 如果项目接近最后期限,应该避免重构;但反过来说,如果最后你没有足够时间,通常表示你其实早该进行重构
为什么重构有用 - Kent Beck
引起程序难以处理需求的原因
-
难以阅读的程序,难以修改;
-
逻辑重复的程序,难以修改;
-
添加新行为时需要修改已有代码的程序,难以修改;
-
带复杂条件逻辑的程序,难以修改
我们希望程序
- 容易阅读
- 所有逻辑都只在唯一地点指定
- 新的改动不会危及下现有行为
- 尽可能简单表达条件逻辑
如何与产品经理沟通重构的事情
如果产品经理懂技术,推动重构不会有太大阻力;
如果他对产品质量感兴趣,可以从产品质量入手;
如果重构切实可行,而产品经理要求进度,那么可以重构,重构让程序更容易快速的满足产品要求。
间接层和重构
Kent Beck : 计算机科学是这样一门科学:它相信所有问题都可以通过增加一个间接层来解决
间接层的价值
-
允许逻辑共享
一个子函数在两个不同地点被调用,或超类中的某个函数被所有子类共享
-
分开解释意图和实现
类和函数名解释意图,其内部就是实现意图
-
隔离变化
很有可能我在两个不同的地点使用统一对象,其中一个地点我想改变对象行为,但如果修改了它,我就要冒同时影响两处的风险。为此我做出一个子类,并在需要修改处引用这个子类,现在,我可以修改这个子类而不必承担无意中影响另一处的风险。
-
封装条件逻辑
对象有一种奇妙机制:多态
如果间接层已经没有价值,可以直接拿掉。
重构与设计
重构与设计是互补的关系,而非相互取代的关系。
软件设计是前提,重构是软件开发过程的代码改善手段。
重构可以带来更简单的设计,同时又不损失灵活性,这也降低了设计过程的难度,减轻了设计压力。
重构与性能
重构可以对程序的性能造成怎样的影响?
如何关注性能:
-
时间与算法
分解设计时就需要预算时间复杂度和空间复杂度,对于性能要求很高的实时系统是十分必要的
-
持续关注性能提升
这取决于程序员的根本素质,需要在算法/数据结构/设计模式上有一定造诣
-
性能优化阶段优化
开发过程中不特别关注,直至进入性能优化阶段(通常是在开发后期)
统计哪些地方大量消耗时间和空间,针对性的优化,结构良好的代码会帮助程序员更快更好的调优性能