重构&原则
- 如果程序需要添加功能时,代码结构无法是你很方便的达成目的,请先重构程序代码。
- 重构第一步:为即将取代的代码建立一套可靠的测试环境。
- IDEA EXTRACT METHOD快捷键CTRL+ALT+M。
- 任何一个傻瓜都能写出计算机可以理解的代码。唯有写出人类容易理解的代码,才是优秀的程序员。
- 临时变量往往会助长冗长而复杂的函数,尽量出去多余的临时变量。有时去除临时变量需要付出性能上的代价,但这是优化时的问题。
- 方法应该被放在合适的类中。
- state模式(Gang of four)
- 重构(名词):对软件内部结构的一种调整,目的是在不改变软件可观察行为的前提下,提高其可理解性,降低其修改成本。
- 重构(动词):使用一系列重构手法,在不改变软件可观察行为的前提下,调整其结构。
- 为何重构:改进软件设计 使软件更容易理解 帮助找到bug 提高编程速度。
- 何时重构:三次法则,第三次写类似的代码则进行重构。
- 重构接口时:让旧接口调用新接口。修改函数名时,让旧函数调用新函数。
- 编写快速软件:首先写出可调的软件,然后调整他以求获得足够速度(更高性能)。
代码的坏味道
-
Duplicated Code
Extract Method(110)提炼重复代码
Pull Up Method(332)推入超类
Form Template Method(345)
Substitude Algorithm(139)选择清晰的方法替换其他相同功能的方法。
Extract Class(149) -
Long Method
在早期编程语言中子程序调用需要额外开销,但现在Object-Oriented语言中几乎已经完全免除了进程内的函数调用开销。
尽管小函数需要我们经常转换上下文查看子程序在做什么,但只需给每一个小函数起一个好名字就会事半功倍。我们应该更积极的分解函数。
Extract Method根据用途提炼新函数。
Replace Temp with Query消除小函数中的参数和临时变量。
Introduce Parameter Object(295) Preserve Whole Object (288)将过长的参数列变得简洁。
Replace Method with Method Object(135)
如何该确定提炼哪一段代码:寻找注释。注释后的代码往往可以提取成一个函数。
条件表达式和循环常常也是提炼的信号 Decompose Conditional(238)处理条件表达式。 -
Large Class
Extract Class
Extract Subclass
Extract Interface -
Long Parameter List
太长的参数列难以理解,太多参数会造成前后不一致,不宜使用。
Replace Parameter with Method(292)。
Preserve Whole Object(288) 用对象替换参数队列。
Introduce Parameter Object(295)制造一个参数对象。 -
Divergent Change(发散式变化)
Extract Class找出某特定原因引起的所有变化提炼到同一个类中。 -
Shotgun Surgery(散弹式修改)
Move method&Move FIled将所有需要更改的代码放进同一个类。 -
Feature Envy(依恋情结)
对象技术的全部要点在于:将数据和对数据的操作行为包装在一起。
但是当函数对某个类的兴趣高于对自己所处类的兴趣时,则需要Move method。 -
Data Clumps
Introduce Paramter Object
Preserve Whole Object
简化参数列表,不用在乎函数只用上新对象的一部分参数,只要以新对象取代两个字段就值回票价了。 -
Primitive Obsession
-
Switch Statements
利用多态可以解决swich语句带来的问题