重构——重构组织函数(3)

Replace Method with Method Object

你有一个大型函数,其中对局部变量的使用使你无法采用“Extract Method”这种重构手法。将这个函数放进一个单独对象中,这样,局部变量就成了对象的字段,然后就可以在同一个对象中将这个大型函数分解为多个小型函数。

//重构前
class Order....
	double price(){
		double basePrice;
		double secondaryPrice;
		double thirdaryPrice;
		//compute()
		......
}

?

//重构后
class Order...
	double price(){
		return new PriceCalculator(this).compute();
}
 
class PriceCalculator{
	double basePrice;
	double secondaryPrice;
	double thirdaryPrice;
	
	double compute(){
		//...
	}
}

在这里插入图片描述
动机
在前面的文章中一直在强调小型函数的优美动人。只要将相对独立的代码从大函数提炼出来,就可以大大提高代码的可读性。
但是,局部变量的存在会增加函数分解的难度。如果一个函数中的局部变量泛滥成灾,那么想分解这个函数是非常困难的。“以查询替换临时变量”手法可以帮助减轻负担,但有时候还是会发现根本无法拆解一个需要拆解的函数。这种情况就应该考虑使用函数对象来解决。本文的重构方法会将所有的局部变量都变成函数对象的字段。然后就可以使用“提炼函数”创造新的函数,从而将原来的大型函数拆解变小。

Substitute Algorithm

你想要把某个算法替换为另一个更清晰的算法。
将函数本体替换为另一个算法。

//重构前
	String foundPerson(String[] people){
		for (int i = 0; i < people.length; i++) {
			if(people[i].equals("Don")){
				return "Don";
			}
			
			if(people[i].equals("John")){
				return "John";
			}
			
			if(people[i].equals("Dave")){
				return "Dave";
			}
		}
		return "";
	}

?

//重构后
	String foundPerson(String[] people){
		List<String> candidates = Arrays.asList(new String[]{"Don","John","Dave"});
		for (int i = 0; i < people.length; i++) {
			if(candidates.contains(people[i])){
				return people[i];
			}
		}
		return "";
	}

动机
解决问题的方法往往会有很多种,但是其中总会有一些方法比另一些简单。算法也是如此。如果你发现做一件事可以有更加清晰的方式,就应该以清晰的方式取代复杂的方式。“重构”可以把一些复杂东西分解为较简单的小块,当有时候你就必须删除整个算法,待之以简单的算法。
随着对问题有了更多了解,你往往会发现,在原先的做法之外,有更简单的解决方案,此时,你就需要改变原先的算法,使之变得更加清晰、简洁。
在使用这项重构手法之前,你需要确定自己已经尽可能分解原先函数。替换一个巨大而复杂的算法是非常困难的,只有先将它分解为较简单的小型函数,然后你才能很有把握地进行算法替换工作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值