在对象之间搬移特性之二 :Move Field(搬移值域)
来源:互联网 发布:淘宝保证金在哪里 编辑:程序博客网 时间:2024/06/10 20:28
你的程序中,某个field(值域〕被其所驻class之外的另一个class更多地用到。
在target class 建立一个new field,修改source field的所有用户,令它们改用此new field。
动机(Motivation)
在classes之间移动状态(states)和行为,是重构过程中必不可少的措施。随着系统发展,你会发现自己需要新的class,并需要将原本的工作责任拖到新的class中。这个星期中合理而正确的设计决策,到了下个星期可能不再正确。这没问题;如果你从来没遇到这种情况,那才有问题。
如果我发现,对于一个field(值域),在其所驻class之外的另一个class中有更多函数使用了它,我就会考虑搬移这个field。上述所谓「使用」可能是通过设值/取值(setting/getting)函数间接进行。我也可能移动该field的用户(某函数),这取决于是否需要保持接口不受变化。如果这些函数看上去很适合待在原地,我就选择搬移field。
使用Extract Class 时,我也可能需要搬移field。此时我会先搬移field,然后再搬移函数。
作法(Mechanics)
范例(Examples)
下面是Account class的部分代码:
class Account...
private AccountType _type;
private double _interestRate;
double interestForAmount_days (double amount, int days) {
return _interestRate * amount * days / 365;
}
我想把表示利率的_interestRate搬移到AccountType class去。目前已有数个函数引用了它,interestForAmount_days() 就是其一。下一步我要在AccountType中建立_interestRate field以及相应的访问函数:
class AccountType...
private double _interestRate;
void setInterestRate (double arg) {
_interestRate = arg;
}
double getInterestRate () {
return _interestRate;
}
这时候我可以编译新的AccountType class。
现在,我需要让Account class中访问此_interestRate field的函数转而使用AccountType对象,然后删除Account class中的_interestRate field。我必须删除source field,才能保证其访问函数的确改变了操作对象,因为编译器会帮我指出未正确获得修改的函数。
private double _interestRate;
double interestForAmount_days (double amount, int days) {
return_type.getInterestRate() * amount * days / 365;
}
范例:使用Self Encapsulate(自我封装)
如果有很多函数已经使用了_interestRate field,我应该先运用Self Encapsulate Field:
class Account...
private AccountType _type;
private double _interestRate;
double interestForAmount_days (double amount, int days) {
returngetInterestRate() * amount * days / 365;
}
private void setInterestRate (double arg) {
_interestRate = arg;
}
private double getInterestRate () {
return _interestRate;
}
这样,在搬移field之后,我就只需要修改访问函数(accessors)就行了 :
double interestForAmountAndDays (double amount, int days) {
return getInterestRate() * amount * days / 365;
}
private void setInterestRate (double arg) {
_type.setInterestRate(arg);
}
private double getInterestRate () {
return_type.getInterestRate();
}
如果以后有必要,我可以修改访问函数(accessors)的用户,让它们使用新对象。 Self Encapsulate Field 使我得以保持小步前进。如果我需要对做许多处理,保持小步前进是有帮助的。特别值得一提的是:首先使用Self Encapsulate Field 使我得以更轻松使用Move Method 将函数搬移到target class中。如果待移函数引用了field的访问函数(accessors),那么那些引用点是无须修 改的。
- 在对象之间搬移特性之二 :Move Field(搬移值域)
- Move Field(搬移值域)
- 在对象之间搬移特性(二)
- 在对象之间搬移特性之一 :Move Method(搬移函数)
- 在对象之间搬移特性---搬移函数
- 在对象之间搬移特性(一)
- 在对象之间搬移特性
- 重构:二、在对象之间搬移特性
- 重构之在对象之间搬移特性
- 重构之在对象之间搬移特性
- 第七章 在对象之间搬移特性
- 3、在对象之间搬移特性
- 第七章 在对象之间搬移特性
- 7. 在对象之间搬移特性
- 《重构改善既有代码的设计》之重构列表--在对象之间搬移特性(二)
- 重构手法(二) —— 在对象之间搬移特性
- 在对象之间搬移特性之三 :Extract Class(提炼类)
- 在对象之间搬移特性之四 :Inline Class(将类内联化)
- 利用WM_GETTEXT消息获取谷歌浏览器地址栏内容。
- TopCoder SRM578 Div.2
- 修改JAVA_HOME无效,java版本保持不变的问题解决
- Perl实现后台守护进程
- Linux 内存管理 -- 线性空间与物理内存
- 在对象之间搬移特性之二 :Move Field(搬移值域)
- 编程之美
- Oracle系统管理员基础:Oracle数据字典
- hdu 1027(数学)
- 重装window后恢复Ubuntu 的 grub启动项。
- 分拆列值
- c++高级---C语言中的类型提升——基础概念,但还有很多人搞不清
- jquery 1.6以上 attr(“checked”)==true 不能使用的原因
- 做为“生意人”应注重的细节