1、何谓重构
对软件内部结构的一种调整,目的是在不改变软件可观察行为的前提下,提高其可理解性,降低其修改成本。
重构的目的是使软件更容易被理解和修改。
越难看出代码所代表的设计意图,就越难保护其中的设计,经常性的重构可以帮助代码保持自己该有的形态。完成同一件事,设计不良的程序往往需要更多的代码,这常常是因为代码在不同的地方使用完全相同的语句做同样的事情。因此改进设计的一个重要方向就是消除重复代码,这个动作的重要性在于方便未来的修改。代码量减少并不会使系统运行更快,因为这对程序运行轨迹几乎没有任何明显影响。然而代码量减少将使未来可能的程序修改动作容易得多。
2、重构使软件更容易理解
让review的人更容易理解,让下一个接手你代码的人,更容易理解。也许下一个接手你代码的人就是你自己。有的时候,一段代码拿过来,是不是你自己写的,你都确定不了,对吧/p>
-
重构的好处
-
重构帮助找到bug
-
重构提高编程速度
3、重构的时机
-
事不过三,三则重构
-
添加功能时重构
-
修改错误时重构
-
复审代码时重构
4、为什么重构有用
-
难以阅读的程序,难以修改;
-
逻辑重复的程序,难以修改;
-
添加新行为时需要修改已有代码的程序,难以修改;
-
带复杂条件逻辑的程序,难以修改;
因此,我们希望程序:
-
容易阅读;
-
所有逻辑都只在唯一地点指定;
-
新的改动不会危及现有行为;
-
尽可能简单表达条件逻辑;
间接层和重构
间接层的价值:
-
允许逻辑共享;
-
分开解释意图和实现;
-
隔离变化;
-
封装条件逻辑;
5、重构的难题
(1)数据库
数据迁移
(2)修改接口
不要过早发布接口,请修改你的代码所有权政策,使重构更顺畅。
(3)难以通过重构手法完成的设计改动
(4)何时不该重构
6、重构和设计
很多人都把设计看做软件开发的关键环节,而把编程看做只是机械式的低级劳动。他们认为设计就像画工程图而编码就像施工。
哪怕你完全了解系统,也请实际度量它的性能,不要臆测。臆测会让你学到一些东西,但十有八九你是错的。
7、重构和性能
首先写出可调的软件,然后调整它以获得足够的速度。
三种编写快速软件的方法:
(1)时间预算法
通常用于性能要求极高的实时系统。
分解设计时要做好预算,给每个组件预先分配一定的资源,包括时间和执行轨迹。每个组件决不能超出自己的预算,就算拥有组件之间的调度预配时间的机制也不行。
这种方法高度重视性能,对于心率调节器一类的系统是必须的,因为这样的系统中迟来数据就是错误的。但对一些管理系统来说,如此追求性能就有点过分了。
(2)持续关注法
这种方法要求任何程序员在任何时间做任何事情时,都要设法保证系统的高性能。
这种方法看起来很常见,感觉上很有吸引力,但通常不会起太大作用。
(3)性能优化阶段
编写程序时,不用将过多的精力关注在性能上,在代码开发完毕之后,会有一个性能优化阶段,一旦进入该阶段,就按照某个特定程序来调整程序性能。
在性能优化阶段,首先应该用一个度量工具来监控程序的运行,让它告诉你程序中哪些地方大量消耗时间和空间。这样就可以找出性能热点所在的一小段代码。然后应该集中关注这些热点代码,并使用持续关注法中的优化手段来优化它们。每走一步都需要编译、测试、再次度量。
8、重构起源何处
第三章 代码的坏味道
1、重复代码
同一个类中两个函数含有相同的表达式时,就要提炼出重复的代码,然后让这两个地点都调用被提炼出来的那一段代码。
2、过长函数
间接层所带来的全部利益,解释能力、共享能力、选择能力。
应该更积极的分解函数,每当感觉需要注释来说明点什么的时候,我们就把需要说明的东西写进一个独立函数中,并以其用途(而非实现手法)命名,我们甚至可以对一组甚至一行代码做这件事。哪怕替换后的函数调用动作比函数自身还长,只要函数名称能够解释其用途,我们也该毫不犹豫的这么做。关键不在于函数的长度,而在于函数“做什么”和“如何做”之间的语义距离。
(1)提炼函数
(2)以查询取代临时变量
(3)引入参数对象或保持对象完整
(4)以函数对象取代函数
将这个特函数放进一个单独对象中,如此一来局部变量就变成了了对象内的字段,然后你可以在同一个对象中将这个大型函数分解成多个小型函数。
本书在不断强调小型函数的优美动人。
(5)条件表达式和循环常常也是提炼的信 。
分解条件表达式;
将循环和其内的代码提炼到一根独立函数中。
3、过大的类
如果想利用单个类做太多事情,其内就会出现太多实例变量。一旦如此,重复代码也就接踵而至了。
可以利用提炼类将几个变量一起提炼至新类中。
4、过长参数列
5、发散式变化
6、散弹式修改
如果遇到某种变化,都必须在很多不同的类中做一些小修改的时候,你就可以将这些一起变化的代码提炼到一个新的类中。
7、依恋情节
最后
更多Java进阶学习资料、2021大厂面试真题、视频资料可以**点击这里获取到免费下载方式!**
学习视频:
文章知识点与官方知识档案匹配,可进一步学习相关知识Java技能树首页概览91536 人正在系统学习中
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!