你从某个对象中取出若干值,将它们作为某一次函数调用时的参数。

动机:

有时候,你会将来自同一对象的若干项数据作为参数,传递给某个函数。

这样做的问题在于:万一将来被调用函数需要新的数据项,你就必须查找并修改对此函数的所有调用。

如果你把这些数据所属的整个对象传给函数,可以避免这种尴尬的处境,因为被调用函数可以向那个参数对象请求任何它想要的信息。

如果传入的是数值,被调用函数就只依赖于这些数值,而不依赖它们所属的对象。

但如果传递的是整个对象,被调用函数所在的对象就需要依赖参数对象。

如果这会使你的依赖结构恶化,那么就不该使用preserve whole object。

如果被调用函数使用了来自另一个对象的多项数据,这可能意味该函数实际上应该被定义在那些数据所属的对象中。

调用者将自己的若干数据作为参数,传递给被调用函数。

这种情况下,如果该对象有合适的取值函数,你可以使用this取代这些参数值,并且无需操心对象依赖问题。

做法:

对你的目标函数新添一个参数项,用以代表原数据所在的完整对象。

判断哪些参数可被包含在新添的完整对象中。

选择上述参数之一,将被调用函数中原来引用该参数的地方,改为调用新添参数对象的相应取值函数。

删除该项参数。

针对所有可从完整对象中获得的参数,重复上述过程。

删除调用端中哪些带有被删除参数的代码。

=》如果调用端还在其他地方使用了这些数据,就不要删除它们。

范例:

旧代码

[java] view plain copy
 
  1. class Room...  
  2.     boolean withinPlan(HeatingPlan plan){  
  3.         int low = daysTempRange().getLow();  
  4.         int high = daysTempRange().getHigh();  
  5.         return plan.withinRange(low, high);  
  6. class HeatingPlan...  
  7.     boolean withinRange(int low, int high){  
  8.         return (low >= _range.getLow() && high <= _range.getHigh());  
  9. }  
  10.     private TempRange _range;  
  11. }  

新代码

[java] view plain copy
 
  1.   
[java] view plain copy
 
  1. class Room...  
  2.     boolean withinPlan(HeatingPlan plan){  
  3.         return plan.withinRange(daysTempRange());  
  4.     }  
  5.   
  6. class HeatingPlan...  
  7.     boolean withinRange(TempRange roomRange){  
  8.         return (_range.include(roomRange));  
  9.     }  
  10. class TempRange...  
  11.     boolean include(TempRange arg){  
  12.         return arg.getLow() >= this.getLow() && arg.getHigh() <= this.getHigh();  
  13.     }  
posted on 2018-02-06 14:25  Sharpest  阅读(192)  评论(0)    收藏  举报