重构-读书笔记一
按照本书的说法,我们当前仅限于单个应用,针对分布式应用(跨多个应用的重构不讨论)
重构:对软件内部结构的一种调整,目的是在不改变软件可观察行为的前提下,提高其可理解性,降低其修改成本。
目的很明确,其实就是降低后续的维护成本,如果生命周期比较短,我不推荐进行大规模的重构动作。同时这里面就有一个非常大的前提,不改变软件的可观察行为,如果不改名,怎么判定,这个就是需要我们为软件构筑测试体系。
影响重构发生的几大障碍:
1、自动化测试体系,没有自动化测试的保障进行重构每一个程序员心里都没有底,比如我们的持续集成调度类,这个类当初是我编写的,现在经过大量的修改我自己都不敢去做大规模重构了,因为没有测试的保障。
2、作用域设置,因为需要重构,而且我在提供团队内部基础组件的过程中发现了这个问题很严重,和书上说的很一致:作用域的问题。我自己现在总结也没有什么好的办法,就是一定要缩小作用域,能多小就多小,只要开放出去了,想对此进行重构都是非常麻烦易出错的事情。
3、一些编码习惯,比如反射,反射这种问题导致在重构发生后编译器无法自动识别错误,导致重构会导致一部分的遗漏,举几个我们自己的例子,我们老的系统中:
a、我们flex的amf绑定关系中使用了类名和方法名,而这种指定是通过类似反射的方式
b、我们的DAOFactory中运用反射来创建DAO
c、我们的任务配置中在数据库中,针对不同的执行计划我们反射加载具体的执行计划任务类
这一些列的动作在我们重构改变类名、方法名、方法参数化的过程中现代的IDE都无法通过编译来告警。
重构方法
提炼函数(extract method)
提炼方法最重要的关注点
有没有局部变量,具体变量后续有没有被使用
a、有后续没有被使用,直接作为方法参数化传递即可
b、有后续会被使用,被使用一般情况下返回参数化即可,同时有可能是多个变量
方法,把多个变量包装成一个对象,使用出参对象作为返回,方法内改变参数的值,比如:
这里有一个关键的问题,java的值传递,我们来看两种类型的例子,基本类型,对象
基本类型:
结果:
这个很好理解,我们来看对象,看代码:
输出对象地址信息:
输出对象详情:
大家可以看到replace的情况,为什么这样,我画个图演示下: