Preserve Whole Object (保持对象完整)

Summary: 

从某个对象中取出若干值,将它们做为某一次函数调用时的参数。改成传递整个对象。 函数

Motivation:

有时候咱们会看到有来自同一对象的若干项数据做为参数,传递给某个函数。这样的问题在于:万一未来被调用函数须要新的数据项,就必须查找并修改对此函数的全部调用。若是把这些数据所属的整个对象传给函数,能够避免这种问题。 性能

除了可使参数列更稳固以外,Preserve Whole Object每每还能提升代码的可读性。过长的参数列很难使用,由于调用者和被调用者都必须记住这些参数的用途。此外,不适用完整对象也会形成重复代码,由于被调用函数没法利用完整对象中的函数来计算某些中间值。 测试

不过事情总有两面。若是传的是数值,被调用函数就只依赖于这些数值,而不依赖它们所属的对象。但若是传递的是整个对象,被调用函数所在的对象就须要依赖参数对象。若是这会使依赖结果恶化,那么就不应使用该重构手法。 this

还有另外一种不适用Preserve Whole Object的理由:若是被调用函数只须要参数对象的其中一项数值,那么只传递那个数值会更好。我并不认同这种观点,由于传递一项数值和传递一个对象,至少在代码清晰度上是等价的(固然对于按值传递的参数来讲,性能上可能有所差别)。更重要的考量应该放在对象之间的依赖关系上。 spa

若是被调用函数使用了来自另外一个对象的不少项数据,这可能意味着该函数实际上应该被定义在那些数据所属的对象中。因此,考虑Preserve Whole Object的同时,也应该考量Move Method。 对象

还有一种常见状况:调用者将本身的若干数据做为参数,传递给被调用函数。这种状况下,若是该对象有合适的取值函数,可使用this取代这些参数值,并没有需操心对象依赖问题。 io

Mechanics: 

1.对目标函数新添一个参数项,用以表明原数据所在的完整对象。 编译

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

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

4.删除该项参数。

5.编译,测试

6.针对全部可从完整对象中得到的参数,重复上述过程。

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

8.编译,测试。

相关文章
相关标签/搜索