网站的色调,做网站的怎么赚钱,免费源码资源分享网,wordpress登录不上去文章目录重构的概念及意义代码味道代码味道分类1.类内味道1.1 可度量的味道-Measured Smells1.1.1 过长函数-Long Method1.1.2 过大类-Large Class1.1.3 过长参数列-Long Parameter List1.1.4 过多的注释-Comments1.2 不必要的复杂性-Unnecessary Complexity1.2.1 夸夸其谈的未…
文章目录重构的概念及意义代码味道代码味道分类1.类内味道1.1 可度量的味道-Measured Smells1.1.1 过长函数-Long Method1.1.2 过大类-Large Class1.1.3 过长参数列-Long Parameter List1.1.4 过多的注释-Comments1.2 不必要的复杂性-Unnecessary Complexity1.2.1 夸夸其谈的未来性-Speculative Generality1.3 重复-Duplication1.3.1 重复代码-Duplicated Code1.3.2 异曲同工的类-Alternative Classes with Different Interfaces1.4条件逻辑-Conditional Logic1.4.1 Switch惊悚现身-Switch Statements2.类间味道2.1 数据-Data2.1.1 基本类型偏执-Primitive Obsession2.1.2 纯稚的数据类-Data Class2.1.3 数据泥团-Data Clumps2.1.4 令人迷惑的暂时字段-Temporary Field2.2 继承-Inheritance2.2.1 被拒绝的遗赠-Refused Bequest2.2.2 狎昵关系-Inappropriate Intimacy2.2.3 冗赘类-Lazy Class2.3 职责-Responsibility2.3.1 依恋情结-Feature Envy2.3.2 过度耦合的消息链-Message Chains2.3.3 中间人-Middle Man2.4 协调变化-Accommodating Change2.4.1 发散式变化-Divergent Change2.4.2 霰弹式修改-Shotgun Surgery2.4.3 平行继承体系-Parallel Inheritance Hierarchies2.5 库类-Library Classes2.5.1 不完善的程序库类-Incomplete Library Class重构的概念及意义
重构是使用一系列重构手法在不改变软件可观察行为的前提下调整其结构。提高其可理解性降低修改成本。 重构可以改进软件设计、使软件更加容易理解、帮助找到软件缺陷、提高变成速度。
代码味道
指程序中存在的一些不良的编程或设计方案。可以作为重构的指示。
代码味道分类
1.类内味道
1.1 可度量的味道-Measured Smells
1.1.1 过长函数-Long Method
方法太长。 手段
把函数变小提炼函数函数内有大量参数和临时变量以查询代替临时变量参数太多引入参数对象太多临时变量和注释以函数对象取代函数条件表达式和循环分解条件表达式
1.1.2 过大类-Large Class
一个类职责过多拥有过多的实例变量。 手段
太多实例变量或太多代码提炼类、提炼子类确定客户端如何使用提炼接口把数据和行为移到一个独立的领域对象但保留一些重复数据复制“被监视的数据”。
1.1.3 过长参数列-Long Parameter List
一个方法需要传递太多的参数。 手段
向已有对象发出一条请求就可以取代一个参数以函数取代参数参数缺乏合理的对象归属引入参数对象将来自一个对象的参数收集起来保持对象完整
1.1.4 过多的注释-Comments
在非必要时不要写注释优先重构代码以使代码具有自解释性。 手段
需要注释来解释一块代码做了什么提炼函数函数已经提炼出来但仍需注释函数改名需要注释来说明系统的需求规格引入断言
1.2 不必要的复杂性-Unnecessary Complexity
1.2.1 夸夸其谈的未来性-Speculative Generality
当程序中过量的使用设计模式导致在代码的阅读过程中很难找到主要的逻辑走向。放置过量的钩子或特殊情况来处理一些非必要的事情可能在代码的编写调试过程中加深跟踪Bug的难度。 手段
某个抽象类没有太大作用折叠继承体系不必要的委托将类内联化函数的某些参数未被使用移除参数函数名称带有多余的抽象含义函数改名无用函数内联函数、移除函数
1.3 重复-Duplication
1.3.1 重复代码-Duplicated Code
在多个地方发现相似代码结构 手段
同一个类含有相同代码提炼函数两个兄弟类有相同代码提炼函数、函数上移、塑造模板函数两个不相干类有相同代码提炼类
1.3.2 异曲同工的类-Alternative Classes with Different Interfaces
不同的类完成相同的任务但有不同的签名主要指方法签名。 手段
两个函数做同一件事但有不同签名函数改名将某些行为移入类直到两者协议相同搬移函数必须重复而冗赘移入代码才能实现上述重构提炼超类
1.4条件逻辑-Conditional Logic
1.4.1 Switch惊悚现身-Switch Statements
Switch语句包括if-else通常会导致代码重复。 手段
与类型码相关的函数或类提炼函数、搬移函数、以多态取代条件表达式、以子类取代类型码、以状态模式或策略模式取代类型码。只在单一函数中有一些选择事件以明确函数取代参数选择条件之一是null引入null对象。
2.类间味道
2.1 数据-Data
2.1.1 基本类型偏执-Primitive Obsession
基本类型被过度使用。 手段
将原本单独存在的数据值替换成对象以对象代替数据值如果想替换的是类型码而类型码不影响行为以类取代类型码如果有与类型码相关的条件表达式以子类取代类型码、以状态模式、策略模式取代类型码如果有一组应该总是被放在一起的字段提炼类如果在参数列中看到基本类型的数据引入参数对象发现自己正从数组中挑选数据以对象取代数组
2.1.2 纯稚的数据类-Data Class
类只拥有成员变量和对应的setter和getter方法。 手段
对于public字段封装字段如果一个容器的字段没有得到恰当的封装封装集合对于那些不该被其他类修改的字段移除设值函数找出getter和setter被其他类运用的地点搬移函数如果无法搬移整个函数提炼函数将getter和setter隐藏起来隐藏函数
2.1.3 数据泥团-Data Clumps
一些数据项同时出现在多个地方如一对内的成员变量、多个方法签名的参数等。 手段
两个类有相同的字段或许多函数签名中的参数相同提炼类缩短参数列表、简化函数调用引入参数对象、保持对象完整
2.1.4 令人迷惑的暂时字段-Temporary Field
一个对象中某个变量仅为某些特定场合而设导致代码难以理解。 手段
一个对象中某个实例对象仅为某种特定情况而定提炼类在“变量不合法”的情况下创建一个null对象从而避免写出条件式代码引入null对象
2.2 继承-Inheritance
2.2.1 被拒绝的遗赠-Refused Bequest
子类继承父类的方法和数据但仅使用其中一部分。 手段
子类不想或不需要继承超类先为子类新建一个兄弟类提炼子类、函数下移、字段下移子类复用了超类的行为却又不愿意支持超类的接口拒绝继承超类的实现以委托代替继承
2.2.2 狎昵关系-Inappropriate Intimacy
类之间的关系变得过于紧密。 手段
类之间的关系过于紧密搬移函数、搬移字段、将双向关联改为单向关联如果两个类存在共同点提炼类、隐藏“委托关系”从继承体系中分离子类以委托取代继承
2.2.3 冗赘类-Lazy Class
如果一个类不值其身价它就应该消失。 手段
对于几乎没用的组件将类内联化如果某些子类没有做足够的工作折叠继承体系
2.3 职责-Responsibility
2.3.1 依恋情结-Feature Envy
一个方法对别的类的兴趣高于它本身所在的类。 手段
函数对某个类的兴趣高过对自身所处类的兴趣搬移函数、搬移字段函数中只有一部分对其他类更感兴趣提炼函数、搬移函数
2.3.2 过度耦合的消息链-Message Chains
一个对象请求另一个后者在请求下一个对象…这就是消息链【a.getB().getC().getD()】。采取这种方式意味客户代码将与查找过程中的导航结构紧密耦合一旦对象间的关系发生任何变化客户端就不得不做出相应修改。 手段
隐藏“委托关系”
2.3.3 中间人-Middle Man
一个类的接口中一半的方法都委托给了其他类。 手段
过度运用委托移除中间人如果“不干实事”的函数只有几个内联函数如果中间人还有其他行为需要对原对象的行为进行扩展以继承取代委托
2.4 协调变化-Accommodating Change
2.4.1 发散式变化-Divergent Change
一个类拥有多个引起它变化的原因。 手段
找出某特定原因而造成的所有变化提炼类
2.4.2 霰弹式修改-Shotgun Surgery
进行某种修改时必须对多个不同的类进行对应的小修改。 手段
把所有需要修改的代码放进同一个类中搬移函数、搬移字段如果眼下没有合适的类可以安置这些代码就创造一个把一系列相关行为放进同一个类中将类内联化
2.4.3 平行继承体系-Parallel Inheritance Hierarchies
当为某个类增加子类时不得不为另一个类也增加一个子类。 手段
让一个继承体系的实例引用另一个继承体系的实例搬移函数、搬移字段
2.5 库类-Library Classes
2.5.1 不完善的程序库类-Incomplete Library Class
手段
如果只想修改库类的一两个函数引入外加函数如果想添加大量额外行为引入本地扩展