重构方法之对象之间搬移特性
来源:互联网 发布:kali linux下载 编辑:程序博客网 时间:2024/06/05 21:40
在对象的设计过程中,“决定把责任放在哪儿”即使不是最重要的事情,也是最重要的事情之一。但是往往在一开始,我们并不能作对,在这种情况下,可以运用重构。
一、Move Method(搬移函数)
程序中,有个函数与其所驻类之外的另外一个类进行更多的交流;调用后者,或者被后者调用。
在该函数最常引用的类中建立一个有着类似行为的新函数。将旧函数变成单纯的委托函数,或者将旧函数移除。
动机
“搬移函数”是重构理论的支柱。如果一个类有太多行为,或如果一个类与另外一个类有太多合作而形成高多耦合,我就会搬移函数;通过这种手段,可以使系统中的类更加简洁,这些类也会更加干净利落的实现系统赋予的任务。
做法:
- 检查源类中被源函数所使用的一切特性(包括字段和函数),考虑它们是否也该被搬走。
- 检查源类的超类和子类,看看是否有该函数的其他声明。
- 在目标类中声明这个函数
- 将源函数的代码复制到目标函数中。调整后者,使其能够在新家中正常运行
- 决定如何从源函数正确引用目标对象
- 如果要移除原函数,请将源类中所有对原函数的调用都替换成对目标函数的调用
示例
class Account...
double overdraftCharge(){
if(_type.isPremium){
double result = 10;
if(_daysOverdrawn > 7) result += (_daysOverdrawn) * 0.85;
return result;
}else
return _daysOverdrawn * 1.75;
}
double bankCharge(){
double result = 4.5;
if(_daysOverdrawn > 0) result += overdraftCharge();
return result;
}
private AccountType _type;
private int _daysOverdrawn;
}
二、Move Field(搬移字段)
程序中,某个字段被其所驻类之外另一个类更多的用到
在目标类中新建一个字段,修改源字段的所有用户,令他们改用新字段
动机
让设计更合理
做法
- 如果字段的访问权限是public,则使用Encapsulate Field将它封装起来
- 在目标类中建立相同的字段,并建立get/set方法
- 决定在源对象中如何引用目标对象
- 删除源字段,且把所有对源对象的调用替换成对目标函数的调用
- 一个类应该十一个清晰的抽象,处理一些明确的责任。
- 另一种情况,在开发的后期出现一个类由于初始化不同而表现不同。
- 决定如何划分分解类的责任
- 建立一个新类,用以表现从旧类中分离出来的责任
- 建立从旧类到新类的访问连接关系
- 使用Move Field 和 Move Method
- 精简类和接口。
- 在新类中声明源类的public协议,并将其中所有的函数委托至源类
- 修改所有源类的引用点,改而引用目标类
- 将源类的所有特性都搬移到新类中
- “封装”即使不是对象的最关键特征,也是最关键特征之一。
- 通过委托函数将委托关系隐藏起来,让客户只和服务对象交互,从而消除客户直接接触委托对象。
- 对于每一个委托中的函数,在服务对象端建立一个简单的委托的函数
- 调整客户,令它只调用服务对象提供的函数
- 将来如果没有任何客户端调用委托行为,就可以删除委托函数
- 重构方法之对象之间搬移特性
- 重构之在对象之间搬移特性
- 重构之在对象之间搬移特性
- 重构系列之对象间的重构:《重构》对象之间搬移特性
- 重构系列4.在对象之间搬移特性
- 重构摘要7_在对象之间搬移特性
- 读书笔记 ------ 重构 -> 在对象之间搬移特性
- 重构:二、在对象之间搬移特性
- 重构手法-在对象之间搬移特性
- PHP 杂谈《重构-改善既有代码的设计》之二 对象之间搬移特性
- PHP 杂谈《重构-改善既有代码的设计》之二 对象之间搬移特性
- 《重构改善既有代码的设计》之重构列表--在对象之间搬移特性(一)
- 《重构改善既有代码的设计》之重构列表--在对象之间搬移特性(二)
- 《重构改善既有代码的设计》之重构列表--在对象之间搬移特性(三)
- 在对象之间搬移特性---搬移函数
- 重构手法(二) —— 在对象之间搬移特性
- 《重构》读书笔记(七)——第七章 在对象之间搬移特性
- 重构改善既有代码的设计--在对象之间搬移特性
- java spring配置文件的头dtd
- 【iOS】真机调试问题总结 错误集合
- Leetcode Binary Tree Preorder Traversal 二叉树先序遍历
- Android platform build guide for Exynos-4412(odroid -X/X2/U2/U3/Q2/Q)
- UIColor,CGColor,CIColor三者的区别和联系
- 重构方法之对象之间搬移特性
- 2.1.14 TrappingRainWater
- 求Fibonacci数列的第n项
- listview的adapter中的一些问题
- [shellcode学习] 绕过条件判断
- leetcode 日经贴,Cpp code -Sudoku Solver
- windows C++ 互相等待线程同步示例
- VS2008一调试就崩溃
- iOS蓝牙4.0开发(一)与外设通讯