重构(名词):对软件内部结构的一种调整,目的是在不改变软件可观察行为的前提下。提升其可理解性,下降维护成本。数据库
重构(动词):使用一系列重构手法,在不改变软件可观察行为的前提下,调整期结构编程
重构的优势:性能优化
- 改进软件设计
- 使软件更容易理解
- 帮助找到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(提炼子类):创建一个子类,将相关的字段和函数从父类搬移到子类