首页 > 技术文章 > 《重构》读书笔记

peterYong 2019-09-16 09:41 原文

# 重构~改善既有代码的设计 #

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语句并修改它们。面向对象中的多态概念可为此带来优雅的解决办法。

待完善...

 

推荐阅读