1、何为重构
重构(名词): 对软件内部结构的一种调整,目的是在不改变软件可观察行为的前提下,提高其可理解性,降低其修改成本。
重构(动词):使用一系列重构手法,在不改变软件可观察行为的前提下,调整其结构。
重构的定义,有两方面:
a.重构的目的是使软件更容易被理解和i需改。
b.重构不会改变软件可观察的行为——重构之后软件功能一如以往。
两顶帽子
添加新功能,以及重构。
在添加新功能的时候,要知道你现在只管添加功能,不要修改既有代码。
在重构的时候,只要修改既有的代码,不要去添加新的功能。
这两种情况可以互相转换,在动手的时候要明确自己是出于哪种状况!
2、为何重构
a.重构改进软件设计
b.重构使软件更容易理解
c.重构帮助找到bug
在进行重构的时候,会深入理解代码的行为,并恰到好处地把新的理解反馈回去。搞清楚程序结构的同时,也清楚自己做的一些假设,想不把bug揪出来都难。
d.重构提高变成速度
3、何时重构
可以采用 三次法则
准则:第一次做某件事时只管去做;第二次做类似的事会产生反感,但无论如何还是可以去做;第三次再做类似的事,你就应该重构。
事不过三,三则重构。
a.添加功能时重构
b.修补错误时重构
c.复审代码时重构(很多公司不一定有复审该环节)
为什么重构有用
有四个原因会让程序难以相与:
a.难以阅读的程序,难以修改;
b.逻辑重复的程序,难以修改;
c.添加新行为时需要修改已有代码的程序,难以修改;
d.带复杂条件逻辑的程序,难以修改。
因此,我们希望程序:1)容易阅读;2)所有逻辑都只在唯一地点指定;3)新的行为不会危机现有行为; 4)尽可能简单表达条件逻辑。
4、怎么和经理说
很多经理嘴巴上说自己“质量驱动”,其实更多的是“进度驱动”。
这种情况下,有一个较有争议的建议:不要告诉经理!
受进度驱动的经理要我尽可能快速完事,至于怎么完成,那就是我的事了。我认为i最快的方式就是重构,所以我就重构。
间接层和重构
计算机科学是这样一门科学:它相信所有问题都可以通过增加一个间接曾来解决。 —— Dennis DeBruler
但是,间接层是一把双刃剑。每次把一个东西分成两份,你就需要多管理一个东西。
间接层的某些价值:
a.运行逻辑共享。比如说一个子函数在两个不同的低点被调用,或超类种得某个函数被所有子类共享。
b.分开解释意图和实现。你可以选择每个类和函数的名字,这给了你一个解释自己意图的机会。
c.隔离变化。很可能我在两个不同地点使用同一对象,其中一个地点我想改变对象行为,但如果修改了它,我就要冒同时影响两处的风险。
d.封装条件逻辑。对象有一种奇妙的机制:多态消息,可以灵活而清晰地表达条件逻辑。将条件逻辑转换为消息形式,往往能降低代码的重复、增加清晰度并提高弹性。
5、重构的难题
a.数据库
重构经常出问题的一个领域就是数据库。绝大多数商用程序都与它们背后的数据结构紧密耦合在一起,这也是数据结构如此难以修改的原因之一。
b.修改接口
关于对象,另一件重要事情是:它们允许你分开修改软件模块的实现和接口。你可以安全地修改对象内部实现而不影响他人,但对于接口要特别谨慎——如果接口被修改了,任何事情都有可能发生。
c.难以通过重构手法完成的设计改动
比如在一个项目中,我们很难(但还是有可能)将不考虑安全性需求时构造起来的系统重构为具备良好安全性系统。
d.何时不该重构
重写(而非重构)的一个清楚讯号就是:现有代码根本不能正常运作。你可能只是试着做点测试,然后就发现代码中满是错误,根本无法稳定运作。记住,重构之前,代码必须起码能够在大部分情况下正常运作。
另外,如果项目已尽最后期限,也应该避免重构。
7、重构与性能
三种编写快速软件的方法:
a.其中最严格的是时间预算法,这通常只用于性能要求极高的实时系统。
b.第二种就是持续关注发。这种方法要求任何程序员都在任何时间做任何事时,都要设法保持系统的高性能。
c.第三种性能提升法就是利用上述的90%统计数据。采用这种方法时,你编写构造良好的程序,不对性能投以特别的关注,直至进入性能优化阶段——那通常是在开发后期。