重新组织函数-Replace Method with Metho

2019-12-19  本文已影响0人  瑾然有昫

有一个大型函数,其中对局部变量的使用是你无法采用Extract Method(提炼函数),将这个函数放进一个单独对象中,如此一来局部变量就成了对象内的字段.然后可以再同一个对象内将这个大型分解为多个小型函数

示例

修改前:

class Order {
  public function price() {
      $primaryBasePrice;
      $secondaryBasePrice;
      $tertiaryBasePrice;
      // long computation
  }
}

修改后:

class Order {
  public function price() {
    return new PriceCalculator(this).compute();
  }
}

class PriceCalculator{
  private  $primaryBasePrice;
  private  $secondaryBasePrice;
  private  $tertiaryBasePrice;

  public function compute() {
  }
}

动机

  1. 如果一个函数之中局部变量泛滥承载,那么想要分解这个函数是非常困难的.Repalce Temp With Query可以帮助你减轻这一负担,但有时候你会发现根本无法拆解一个需要拆解的函数.这个时候就需要使用函数对象这件法宝.这样会将所有的局部变量都编程函数对象的字段.然后你就可以使用这个新对象使用Extract Method 创造出新函数,从而将原本的大型函数拆解变短.

做法

  1. 新建一个类,根据待处理函数的用途,为这个类命名
  2. 在新建类中创建一个字段,用来保存原先大型函数所在的对象.我们将这个字段称之为源对象.同时,针对源函数的每个临时变量和每个参数,在新类中建立一个对应的字段保存.
  3. 在新类中建立一个构造函数,接受源对象及原函数的所有参数作为参数.
  4. 在新类中建立一个compute()函数
  5. 将原函数的代码复制到compute()函数中,如果需要调用源对象的任何函数,请通过源对象字段调用.
  6. 将就函数的函数本体替换为这样一条语句: "创建上述新类的一个新对象,而后调用其中的compute()函数"
上一篇 下一篇

猜你喜欢

热点阅读