# 重构~改善既有代码的设计 #
1、介绍
何为重构:对软件内部结构的一种调整,
重构目的:调整程序代码改善软件的质量、性能,使其程序的设计模式和架构更趋合理,提高软件的扩展性和维护性。
软件随需求而变。“实用”是软件压倒一切的要素。
重构时机:
1. 在添加新功能时;
2. 在修改bug时
3. 在代码复审时
*注:到了最后的交付期限,不进行重构*
重构常用:
1、间接层
2、接口修改时,尽量增加,而不是修改
重构的第一步:
为即将修改的代码*建立一组可靠的测试环境*。好的测试是重构的根本。
重构技术就是以微小的步伐修改程序,所以应该是很容易发现错误。
重构的节奏:
测试、小修改、测试、小修改、测试....
重构与性能:
1、虽然重构可能使软件运行更慢,但它也使软件的性能优化更容易;
2、一般的非实时系统,编写快速软件的秘密就是:首先写出可调的软件,然后调整它以求获得足够速度;
3、找到优化点,而不盲目优化所有代码,因为程序大半时间都是只耗费在一小段代码身上;
常思考的点
类:是否有本类无关的函数,移动函数
函数:函数应该放在它所使用的数据的所属对象内
2、坏代码的味道
1、Duplicated Code重复代码
如果你在一个以上的地点看到相同的程序结构,那么可以肯定:设法将它们和而为一,程序会变得更好。最常见的“重复代码”就是一个类内的两个函数含有相同的表达式。另一种常见情况就是两个互为兄弟的子类内含有相同的表达式。
采用Extract Method(提炼函数)提炼出重复的代码。
2、Long Method 过长函数
函数中的代码行数原则上不要多于100行。
我们遵循这样一条原则:每当感觉需要以注释来说明点什么的时候,我们就需要把说明的东西写进一个独立的函数中,并以其用途(而非实现手法)命名。
如果函数内有大量的参数和临时变量,它们会对你的函数提炼形成障碍。你可以经常运用Replace Temp with Query (以查询取代临时变量),来消除这些临时元素。Introduce Parameter Object (引入参数对象),PreserveWhole Object (保持对象完整)则可以将过长的参数列变得简洁一些。
如果已经这么做了,仍然有太多的临时变量和参数,就应该使用 Replace Method with Method Object (以函数对象取代函数)。如何确定提炼哪一段代码呢?一个很好的技巧是:寻找注释。它们通常指出代码用途和实现手法之间的语义距离。如果代码前方有一行注释,就是在提醒你:可以将这段代码替换成一个函数,而且可以在注释的基础上给这个函数命名。就算只有一行代码,如果它需要以注释来说明,那也值得将它提炼到独立函数中。
3、Large Class 过大的类
类不要负责超越本类的职责,即前面提到的单一原则:
运用ExtractClass (提炼类)将几个变量一起提炼到新类里。技巧:先确定客户端如何使用它们,然后运用 Extract Interface(提炼接口)为每个使用方式提炼出一个接口。可帮助你看清楚如何分解这个类。
4、Long Parameter List 过长参数列
过长参数不易理解和维护,太长的参数列难以理解,而且会造成前后不一致,不易使用。而且一旦你需要更多数据,就不得不修改它。如果将对象传递给函数,大多数修改都没有必要。
5、Switch Statement (switch 惊悚现身)
面向对象程序的一个最明显特征就是:少用switch或(case)语句。从本质上说,switch语句的问题在于重复。你常会发现switch语句散布于不同地点。如果要为它添加一个新的case子句,就必须找到所有switch语句并修改它们。面向对象中的多态概念可为此带来优雅的解决办法。
待完善...