1、初识重构
1.重构是什么?
代码重构是在不修改软件功能的状况下,对软件内部进行调整优化。数据库
2.为何要进行重构?设计模式
- 项目中的代码有明显的难以理解、难以修改的问题
- 在复杂度、重复率方面有严重的问题
- 重构能够把一些效率低的代码,从新调整成效率更高的代码
- 能够将重复提交的代码,为独立的函数
- 统一和规范变量名
3.重构的目标缓存
- 经过更优秀更合理的架构来知足系统高性能、高并发、高可用的需求
- 经过重构来提升代码质量
- 引入新的技术和框架来升级整个系统
- 经过重构来优化业务流程,实现原来实现不了的需求
4.重构的范围服务器
平台级别重构。针对总体平台的重构,如阿里早期是LAMP架构,后来总体迁移到了Java平台。架构
系统级别重构。针对业务系统的重构,如经过引入微服务架构或者SOA架构,分解单体应用。并发
架构级别重构。如经过架构的调整和从新设计,改善原有架构的不合理之处。如经过分层使业务解耦,引入缓存设计提高系统高并发等。框架
业务级别重构。常见为某些业务需求由于系统设计的不合理性致使没法知足或有缺陷知足,须要经过业务系统的重构调整或数据库的重构来解决。tcp
模块/代码级别重构。这是最多见的重构。一般指使用设计模式、封装继承、优化拆解代码,使得代码的结构更良好,运行效率更高。函数
5.常见的项目重构的方法:
(1)梳理而且分解继承体系
继承是面向对象设计语言中一个很重要的特性,它能够减小子类的代码量。同时继承也会被误用。今天为了一个功能添加了一个小类,也许明天还会为了另一个功能添加另一个类。时间一长你就会发现,这个类简直就是惨不忍睹。代码会出现大量的重复,并且修改也会变得很困难。
要修改这个类就要把这个类中相关的变量或者功能梳理清楚,分别给它们创建相应的父类,而后再继承下去。它们分别属于不一样的功能体系,必需要有相应的继承体系。微服务
(2)将过程化的代码转化为对象设计
将数据记录编成对象,将大块的行为分红效块而且将行为移入相关的对象之中。常见的场景,类中有很长很长的函数和不多的数据。咱们要作的是将这个很长的函数提炼出来放到一个单独的类中来处理。
(3)将程序分层,将数据、界面、逻辑分开
这个就要提到经典的MVC模型,这个模型的价值就在于:它将用户界面和逻辑处理分开了。即界面只包含展现所用的东西;逻辑层只包含逻辑代码而不包含界面的内容。
(4)提炼继承体系
一个类作了不少的事情,其中有些事情是以大量的表达式来完成的,咱们应该考虑为这个状况创建起相应的继承体系,使每个子类包含一种特殊状况。刚开始时,咱们设计的时候,是一个类实现一种功能或者一个概念,可是随着时间的推移、方案的改进,可能这个类添加了另一个概念,变成了两个概念,包含两种功能,随后变成三个四个五个等。最后这个类变得就会完成陌生了,失去了原来咱们设计这个类的初衷了。
备注:重构须要对旧系统业务进行梳理,并分批重构。
因此重构是一个解耦的过程?
2、重构性项目如何测试
1.质量标准
TDD或单元测试引入
2.效率标准
(1)方法一:对比测试
测试用例,简单说,就是给定一个场景(输入),验证在这个场景下软件的行为(输出)。因此定义测试用例就须要定义测试时的输入输出和验证规则。
但在代码重构中,由于软件的功能并未增长,一次也就没有增长新的测试用例。而且,重构前的老系统自己就提供了大量的测试用例。为何这么说,由于重构以后的新系统的各项业务行为只要和老系统保持一致,那就能够说是正确的。
因此,对于代码重构工做,测试用例的编写就被大大简化:只需定义输入,无需定义输出,将老系统的输出做为输出便可。同时,验证规则也简化了不少,各项数据一般只需和老系统保持一致,少数的不能彻底一致的数据,只需验证其知足必定规则便可。
具体方法:
定义测试用例输入,分别调用新(重构后的系统)、老系统。用老系统的结果校验新系统,从而下降测试的工做量,提升测试效率。
目前可依赖脚本自动化对比数据,可是脚本编写成本与提高的效率是个须要商榷的问题。
(2)方法二:导流测试方法一能够帮助简化对测试结果的验证,可是测试输入仍是要想办法丰富起来,不然漏掉一个场景就有可能放过一个bug。对于老功能,需求早已丢失,当年设计开发它的人也已不在,那如何为这样缺失需求的功能设计测试用例。有一个方法是直接使用线上的请求测试。具体方法:经过使用Nginx的ngx_http_miror_module模块(或其余技术,如tcpcopy),复制一份线上的请求,而后将这份复制的真实请求导向部署了重构版本应用的服务器。而后再经过方法一介绍的对比测试方式,比较线上应用和重构后应用的输出结果(返回值、数据库记录等等),从而验证代码重构的正确与否。可是这种测试方法有必定的局限性。简单来讲,这种方式适合测试读接口,不太适合或者说是难以测试写接口。由于测试请求来自线上,若是被测服务器一样部署在线上环境,那写接口就会对用户数据形成应用。若是被测服务器部署在测试环境,须要在测试环境完整同步一份线上数据,这须要至关的基础测试设施的支持。