有一个大型函数,其中对局部变量的使用是你无法采用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() {
}
}
动机
- 如果一个函数之中局部变量泛滥承载,那么想要分解这个函数是非常困难的.Repalce Temp With Query可以帮助你减轻这一负担,但有时候你会发现根本无法拆解一个需要拆解的函数.这个时候就需要使用函数对象这件法宝.这样会将所有的局部变量都编程函数对象的字段.然后你就可以使用这个新对象使用Extract Method 创造出新函数,从而将原本的大型函数拆解变短.
做法
- 新建一个类,根据待处理函数的用途,为这个类命名
- 在新建类中创建一个字段,用来保存原先大型函数所在的对象.我们将这个字段称之为源对象.同时,针对源函数的每个临时变量和每个参数,在新类中建立一个对应的字段保存.
- 在新类中建立一个构造函数,接受源对象及原函数的所有参数作为参数.
- 在新类中建立一个compute()函数
- 将原函数的代码复制到compute()函数中,如果需要调用源对象的任何函数,请通过源对象字段调用.
- 将就函数的函数本体替换为这样一条语句: "创建上述新类的一个新对象,而后调用其中的compute()函数"
网友评论