《重构》虽然是本神作,但是内容过于琐碎,《重构与模式》恰恰能帮助解决心理上和软件上的问题。
之前在班车上陆续读完了,可是忘了,缺少实操,浏览式读书太容易忘记了。
所以我打算换个方式。不按目录读书,而是按照代码坏味道对应的修复模式捋一捋。
图无法下载,倒是百度到一篇好文章,摘录一下啊
侵权即删。
<table bordercolor="#82c1d8" cellspacing="0" cellpadding="2" width="98%" align="center" border="1" unselectable="on" auto?="">
<tbody>
<tr style="font-weight: bold; color: rgba(255, 255, 255, 1); height: 30px; background-color: rgba(73, 164, 199, 1); text-align: center">
<td width="30%">代码的坏味道</td>
<td width="35%">一般重构方法</td>
<td width="35%">使用模式重构</td>
</tr>
<tr>
<td width="30%"><strong>重复代码</strong></td>
<td width="35%">提炼方法
提取类
方法上移
替换算法
链构造方法
</td>
<td width="35%">构造Template Method
以Composite取代一/多之分
引入Null Object
用Adapter统一接口
用Fatory Method引入多态创建</td>
</tr>
<tr>
<td><strong>过长方法</strong></td>
<td>提取方法
组合方法
以查询取代临时变量
引入参数对象
保持对象完整</td>
<td>转移聚集操作到Vistor
以Strategy取代条件逻辑
以Command取代条件调度程序
转移聚集操作到Collecting Parameter</td>
</tr>
<tr>
<td><strong>过长参数列</strong></td>
<td>以方法取代参数
引入参数对象
保持对象完整</td>
<td> </td>
</tr>
<tr>
<td><strong>条件逻辑过度复杂</strong></td>
<td>分解条件式
合并条件式
合并重复的条件片段
移除控制标记
以卫语句取代嵌套条件式
以多态取代条件式
引入断言</td>
<td>以Strategy取代条件逻辑
转移装饰功能到Decorator
以State取代状态改变条件语句
引入Null Object</td>
</tr>
<tr>
<td><strong>分支语句</strong></td>
<td>提取方法
转移方法
以子类取代类型代码
以多态取代条件式
已明确方法取代参数</td>
<td>以State/Strategy取代类型代码
引入Null Object
以Command替换条件调度程序
转移聚集操作到Visitor</td>
</tr>
<tr>
<td><strong>基本类型迷恋
</strong>程序代码过于依赖基本类型(int,string,double,array等低层次语言要素)</td>
<td>以对象取代数据值
以类型取代类型代码
以子类取代类型代码
提取类
引入参数对象
以对象取代数组</td>
<td>以State取代状态改变条件语句
以Strategy取代条件逻辑
以Composite取代隐含树
以Interpreter取代隐式语言
转移装饰功能到Decorator
用Builder封装Composite</td>
</tr>
<tr>
<td><strong>数据泥团</strong>
在类的字段和参数列中,总是一起出现的数据</td>
<td>提取类
引入参数对象
保持对象完整</td>
<td> </td>
</tr>
<tr>
<td><strong>令人迷惑的临时字段</strong></td>
<td>提取类</td>
<td>引入Null Object</td>
</tr>
<tr>
<td><strong>组合爆炸
</strong>许多段代码使用不同种类或数量的数据或对象做同样的事情(例如使用特定条件和数据库查询)</td>
<td> </td>
<td>以Interpreter取代隐式语言</td>
</tr>
<tr>
<td><strong>过大类</strong></td>
<td>提取类
提取子类
提取接口
复制被监视数据</td>
<td>以Command取代条件调度程序
以State取代状态改变条件语句
以Interpreter取代隐式语言</td>
</tr>
<tr>
<td><strong>冗赘类</strong>
不再做很多工作或没有用的类</td>
<td>折叠继承关系
内联Singleton</td>
<td> </td>
</tr>
<tr>
<td><strong>不恰当的暴露
</strong>在客户代码中不应看到类的字段和方法,却是公开可见的</td>
<td>封装字段
封装群集
移除设置方法
隐藏方法</td>
<td>用Factory封装类</td>
</tr>
<tr>
<td><strong>发散式变化</strong>
类经常因为不同的原因在不同方向上发生变化,显然是违反了单一职责原则</td>
<td>提取类</td>
<td> </td>
</tr>
<tr>
<td><strong>霰弹式修改</strong>
如果遇到变化,必须在不同的类中作出相应的修改</td>
<td>转移方法
转移字段
内联类</td>
<td>将创建知识搬移到Factory</td>
</tr>
<tr>
<td><strong>依恋情结
</strong>方法对于某个类的兴趣高过对自己所处的宿主类</td>
<td>转移方法
提取方法</td>
<td>引入Strategy
引入Visitor</td>
</tr>
<tr>
<td><strong>平行继承体系
</strong>当为一个类增加一个子类时,也必须在另一个类中增加一个相应的子类</td>
<td>转移方法
转移字段</td>
<td> </td>
</tr>
<tr>
<td><strong>夸夸其谈未来性</strong></td>
<td>折叠继承关系
内联类
移除参数
移除方法</td>
<td> </td>
</tr>
<tr>
<td><strong>过度耦合的消息连
</strong>不断的向一个对象索求另一个对象</td>
<td>隐藏委托
提取方法
转移方法</td>
<td>使用抽象引入Chain Of Responsibility</td>
</tr>
<tr>
<td><strong>中间转手人
</strong>类接口中有很多方法都委托给其他类</td>
<td>移除中间转手人
内联方法
以继承取代委托</td>
<td> </td>
</tr>
<tr>
<td><strong>狎昵关系
</strong>类之间彼此依赖于其private成员</td>
<td>转移方法
将双向关联改为单向
提取类
隐藏委托
以继承取代委托</td>
<td> </td>
</tr>
<tr>
<td><strong>异曲同工的类</strong></td>
<td>重命名方法
转移方法
提取超类</td>
<td>用Adapter统一接口</td>
</tr>
<tr>
<td><strong>不完善的程序库类</strong></td>
<td>引入外加方法
引入本地扩展</td>
<td>用Adapter统一接口
用Facade封装类</td>
</tr>
<tr>
<td><strong>纯稚的数据类
</strong>只拥有字段的数据类</td>
<td>封装字段
封装集合
移除设置方法
转移方法
隐藏方法</td>
<td> </td>
</tr>
<tr>
<td><strong>被拒绝的遗赠
</strong>继承父类时,子类想要选择继承的成员</td>
<td>以委托取代继承</td>
<td> </td>
</tr>
<tr>
<td><strong>过多的注释
</strong>为糟糕的代码写大量的注释</td>
<td>使用一起重构方法,使方法本身达到自说明的效果,让注释显得多余</td>
<td> </td>
</tr>
<tr>
<td><strong>怪异解决方案
</strong>在同一系统中使用不同的方式解决同一问题</td>
<td>替换算法</td>
<td>用Adapter统一接口</td>
</tr>
</tbody>
</table>
网友评论