重构读书笔记-8_1-Self_Encapsulate_Fiel
2019-06-22 本文已影响0人
MR_Model
重构第八章
1.Self Encapsulate Field(自封装值域)
你直接访问一个值域(field),但与值域之间的耦合关系逐渐变得笨拙。为这个值域建立取值/设置函数(getting/setting methods),并且只以函数来访问值域
Example:
private int _low, _high;
boolean includes(int arg) {
return arg>=_low &&arg <= _high;
}
Analyse:
直接访问变量:代码容易阅读;
间接访问变量:subclass可以通过覆写一个函数而改变获取数据的途径;或者lazy initlalization(直到使用某值,才初始化)。
可以首先使用直接访问变量,然后等遇到麻烦后使用间接访问变量。
End:
private int _low, _high;
int getLow() {return _low;}
int getHigh() {return _high;}
boolean includes(int arg) {
return arg>=_low &&arg <= _high;
}
Conclusion:
使用本项重构时,你必须小心对待[在构造函数中使用设置函数]的情况。一般说来,设置函数应该在[对象创建后]才使用。所以一般在构造函数中直接访问变量,或者建立另一个独立的初始化函数。
展示
CappedRange extends IntRange {
cappedRange(int low, int high , int cap){
super(low,high);
m_cap = cap;
}
private:
int m_cap;
int getCap() {
return m_cap;
}
int getHigh() {
return Math.min(super.getHigh(),getCap());
}
}
CappedRange继承于IntRange,覆写getHigh()函数后,加入了对cap的考虑,而不用修改IntRange class的任何行为。
注意
重构必须在有单元测试的情况下,保证之前的功能修改后不收影响。切记!!!