Replace Temp with Query 以查询取代临时变量

你的程序以一个临时变量保存某一表达式的运算结果。将这个表达式提炼到一个独立函数中。将这个临时变量的所有引用点替换为对新函数的调用。此后,新函数就可被其他函数使用。

动机

临时变景的问题在于:它们是暂时的,而且只能在所属函数内使用。由于临时变量只在所属函数内可见,所以它们会驱使你写出更长的函数,因为只有这样你才能访问到需要的临时变量。如果把临时变量替换为一个査询,那么同一个类中的所有函数都将可以获得这份信息。这将带给你极大帮助,使你能够为这个类编写更清晰的代码。

Replace Temp with Query往往是你运用Extract Method之前必不可少的一个步骤。局部变量会使代码难以被提炼,所以你应该尽可能把它们替换为查询式。

这个重构手法较为简单的情况是:临时变量只被赋值一次,或者赋值给临时变量的表达式不受其他条件影响。其他情况比较棘手,但也有可能发生。你可能需要先运用Spilt Temporary Variable或Seperate Query from Modifier使情况变得简单一些,然后再替换临时变量。如果你想替换的临时变量是用来收集结果的(例如循环中的累加值),就需要将某些程序逻辑(例如循环)复制到查询函数去。

做法

首先是简单情况:

  • 找出只被赋值一次的临变量。
    • 如果某个临时变量被赋值超过一次,考虑使用Spilt Temporary Variable将它分割成多个变量。
  • 将该临时变量声明为final。
  • 编译。
    • 这可确保该临时变量的确只被赋值一次。
  • 将“对该临时变量赋值”之语句的等号右侧部分提炼到一个独立函数中。
    • 首先将函数声明为private。日后你可能会发现有更多类需要使用它,那时放松对它的保护也很容易。
    • 确保提炼出来的函数无任何副作用,也就是说该函数并不修改任何对象内容。如果它有副作用,就对它进行Seperate Query from Modifier。
  • 编译,测试。
  • 在该临时变量身上实施Inline Temp。

我们常常使用临时变量保存循环中的累加信息。在这种情况下,整个循环都可以被提炼为一个独立函数,这也使原本的函数可以少掉几行扰人的循环逻辑。

运用此手法,你可能会担心性能问题。和其他性能问题一样,我们现在不管它,因为它十有八九根本不会造成任何影响。若是性能真的出了问题,你也可以在优化时期解决它。

results matching ""

    No results matching ""