简述
今天主要简单的谈谈重构。重构在项目的开发周期中其实蛮重要的,不过很多小公司并不在乎。多数创业公司和产品都是试验品,有没有明天还不确定,谁在乎你的代码写的怎么样。不管领导和其他部门对此什么态度。做为技术研发人员我觉得是十分有必要进行重构,对代码的负责,也是作为一名程序员对自己的负责。
什么是重构
重构(名词)
对软件内部结构的一种调整,目的是在不改变"软件之可察行为"前提下,提高其可理解性,降低其修改成本.
重构(动词)
使用一系列重构准则(手法),在不改变"软件之可察行为"前提下,调整其结构.
两种定义都强调是在不改变"软件的外部行为"前提下,不改变"软件之可察行为"就是说让修改不影响外部使用程序,在外部来看,程序的行为和结果没有任何的变化.重构只是对程序内部结构进行调整,让代码更加容易理解,然后更容易维护.
重构的重要性
重构改进软件设计
重构和设计是相辅相成的,它和设计彼此互补。有了重构,你仍然必须做预先的设计,但是不必是最优的设计,只需要一个合理的解决方案就够了,如果没有重构、程序设计会逐渐无法控制。重构其实就是整理代码,让所有带着发散倾向的代码回归本位。
软件的生命周期往往需要多批程序员来维护,我们往往忽略了这些后来人。为了使代码容易被他人理解,需要在实现软件功能时做许多额外的事件,如清晰的排版布局,简明扼要的注释,其中命名也是一个重要的方面。
对于那些让人充满迷茫感甚至误导性的命名,需要果决地、大刀阔斧地整容
重构使软件变得更容易理解
重构帮助找到bug
孔子说过:温故而知新。重构代码时逼迫你加深理解原先所写的代码。笔者常有写下程序后,却发生对自己的程序逻辑不甚理解的情景,曾为此惊悚过,后来发现这种症状居然是许多程序员常患的"感冒"。当你也发生这样的情形时,通过重构代码可以加深对原设计的理解,发现其中的问题和隐患,构建出更好的代码。
重构提高编程速度
当你发现解决一个问题变得异常复杂时,往往不是问题本身造成的,而是你用错了方法,拙劣的设计往往导致臃肿的编码。
改善设计、提高可读性、减少缺陷都是为了稳住阵脚。良好的设计是成功的一半,停下来通过重构改进设计,或许会在当前减缓速度,但它带来的后发优势却是不可低估的。
重构与优化的区别
重构的目的是使软件更容易被理解和修改而性能优化使代码比较难理解
何时重构
- 添加功能时重构
- 修补错误时重构
- 复审代码时重构
解决代码的坏味道
在重构环节中,主要是针对不合理的代码进行处理,那么什么是不合理的代码,有没有参考的标准呢?在《重构,改善既有的代码设计》中,确实有参考的标准。那就是代码的坏味道。我们下面来看看有哪些坏味道以及处理方式:
1.Duplicated Code(重复的代码)
将重复的代码提取成为函数,分别调用
2.Long Method(过长方法)
细化步骤,分解成小函数
3.Large Class(过大类)
细化类的职责,分解成职责单一的类
4.Long Parameter List(过长参数列)
将不属于一个对象但有细微联系的数据提成一个对象,然后将这些属于一个对象的数据以对象当参数
5.Divergent Change(发散式变化)
细化类的职责,分解成职责单一的类
6.Shotgun Surgery(霰弹式修改)
将发生变的函数和字段提取到一个类或者新类当中
7.Feature Envy(依恋情结)
拆分函数,将过多引用其它类的变量的函数移过去
8.Data Clumps(数据泥团)
将这些常一起出现的数据提取到一个类当中
9.Primitive Obsession(基本类型偏执)
将应该被放在一起的基本类型字段用对象代替
10.Switch Statements(switch惊悚现身)
利用面向对象的多态性和状态、策略等设计模式来处理
11.Parallel Inheritance Hierarchies(平行继承体系)
让一个继承体系的类引用另一个继承体系的类,然后被引用的类的子类的方法和字段移动到该类的继承类中去
12.Lazy Class(冗赘类)
删掉多余的类
13.Speculative Generality(夸夸其谈未来性)
删掉多余的类
14.Temporary Field(令人迷惑的暂时字段)
为这个变量添加一个新类,并将与这个变量有关的代码封装成函数移到这个类里
15.Message Chains(过度耦合的消息链)
拆函数或者移动函数。
16.Middle Man(中间转手人)
将另一类的函数移动到调用端或者直接变成子类
17.Inappropriate Intimacy(狎昵关系)
移动字段、函数让他们划清界限或者使用代理、把公共属性提到新类等手段
18.Alternative Classes with Different Interfaces(异曲同工的类)
删掉多余的类
19.Incomplete Library Class(不完美的程序库类)
20.Data Class(纯稚的数据类)
封装起来并将相关的数据操作方法移过来
21.Refused Bequest(被拒绝的遗赠)
改继承为代理
22.Comments(过多的注释)
注意变量、函数、类的命名
网友评论