保持对象完整
动机
有时候,你会将来自同一对象的若干项数据作为参数,传递给某个函数
存在的问题:
万一将来被调用函数需要新 的数据项,你就必须查找并修改对此函数的所有调用。
解决办法:
把这些数据所属的整个对象传给函数,会提高代码的可读性,降低重复代码。但参数对象和被调用函数所在的对象之间,就有了依存关系。如果被调用函数使用了来自另外一个对象的许多项数据,应该将整个方法移到另外一个对象中。
做法
- 对函数新添一个表示完整数据项的完整对象参数项
- 编译测试
- 判断哪些参数包含在对象中
- 对该参数,将被调用函数 内对该参数的各个引用,替换为对参数对象对象取值函数的调用
- 删除该项参数
- 编译、测试
- 对所有「可从完整对象中获得」的参数替换
- 删除调用端中那些带有「被删除之参数」的所有代码
范例
class Room ...
boolean withinPlan(HeatingPlan plan) {
int low = daysTempRange().getLow(); // 将其封装进了TempRange类中
int hight = daysTempRange().getHigh();
return plan.withinRange(low, high);
}
class HeatingPlan ...
private TempRange _range;
boolean withinRange (int low, int high) {
return (low >= _range.getLow() && high <= _range.getHigh());
}
}
===========================================>
class TempRange ...
boolean includes (TempRange roomRange) {
return (roomRange.getLow() >= _range.getLow()&&roomRange.getHigh() <= _range.getHigh());
}
class HeatingPlan...
private TempRange _range;
boolean withinRange(TempRange roomRange){
return (_range.includes(roomRange));
}