重构(名词):对软件内部结构的一种调整,目的是在不改变软件可观察行为的前提下。提高其可理解性,降低维护成本。
重构(动词):使用一系列重构手法,在不改变软件可观察行为的前提下,调整期结构
重构的优点:
- 改进软件设计
- 使软件更容易理解
- 帮助找到bug
- 提高编程速度
重构应该随时随地进行,事不过三,三则重构:
- 添加功能时重构
- 修补错误时重构
- 复审代码时重构
重构的难题:
- 数据库:经常会遇到数据库与应用紧耦合,非面向对象型数据库可以添加分隔层,如使用Hibernate之类的ORM框架;面向对象型数据库
- 修改接口:对于已发布接口修改是,应保留老接口,是老接口调用新接口,尽量减少发布接口
一个项目开始时候应该考虑好各个模块的灵活性,但实现这种灵活性往往会需要花更多时间,并增加代码的复杂度,同时并不是所有模块的灵活性都有用,所以在时间有限时考虑好通过重构将代码变得灵活的难度,如果不难可以先做非灵活实现,当有需要时在重构。
重构和性能:
重构是代码更易于维护理解的同时,往往会牺牲性能。如果在一个性能要求极高的系统中,应该以性能为优先;对于大多数程序进行分析,会发现它吧大半时间都耗费在一小半代码上,一视同仁的性能优化,90%的努力都是收效甚微的,所以这时可以考虑,这90%的代码用重构获得代码的可读性优先。
代码的坏味道
- Duplicated Code(重复代码):Extract Method抽出重复代码,放在合适的地方
- Long Methods(过长函数):分解函数,遵循原则:每当感觉需要以注释来说明点什么的时候,我们就把需要说明的东西写进一个独立函数中,并以其用途命名,可能用到Extract Method;
- 如果有大量的临时变量,可以用Inline Temp和Replace Temp With Query;
- 用过参数过长,可以用Introduce Parameter Object和Preserve Whole Object;
- 当临时变量的使用使你无法采用Extract Method可以使用Replace Method with Method Object;
- 当条件语句过长,循环逻辑难以理解,也应该考虑提出单独的函数,可以用Decompose Conditional
- Large Class(过大的类):想利用单个类做太多的事情,内部往往就会出现太多实例变量;
- 可以使用Extract Class将几个变量一起提炼到新类中
- 如果提出的类适合作为一个子类,可以使用Extract Subclass
重构手法:
- Extract Method(提炼方法):将一段代码放进一个独立函数,函数名以用途命名
- Inline Method(内联函数):当某个方法只有一行,而且很好理解时,可以提出方法体直接使用
- Inline Temp(内联临时变量):将对临时变量的应用,替换成复制给临时变量的表达式
- Replace Temp With Query(以查询取代临时变量):降临时变量提出称为一个方法返回值
- Introduce Parameter Object(引入参数对象):以一个对象取代大量参数
- Preserve Whole Object(保持对象完整):当参数都是某对象的属性时,改为传递对象本身
- Replace Method with Method Object(以函数对象取代函数):将这个函数放进一个单独对象中,如此一来局部变量就成了对象内的字段。然后可以在同一个对象内将大型函数分解成多个小型函数
- Decompose Conditional(分解条件表达式):从if-then-else中分别提出独立的函数
- Extract Class(提炼类):建立一个新类,将相关的字段和函数从旧类搬移到新类
- Extract Subclass(提炼子类):建立一个子类,将相关的字段和函数从父类搬移到子类
来源:oschina
链接:https://my.oschina.net/u/1413049/blog/718607