软件设计重构秘笈10式-09提取方法
概念
本文中的把某些计算复杂的过程按照功能提取成各个小方法,这样就可以使代码的可读性、维护性得到提高。
意图
提取方法可以使代码的可读性、维护性得到提高 如下代码所示,calculateGrandTotal方法里面包含了多个逻辑,第一计算subTotal 的总和, 第二subTotal 要循环减去discount,也就是计算Discounts,第三就是计算Tax。 所以我们可以根据功能把他们拆分成三个小方法。
案例
public class Receipt {
private List<Integer> discounts;
private List<Integer> itemTotals;
public int calculateGrandTotal() {
Integer subTotal = 0;
for (Integer i:itemTotals) {
subTotal+=i;
}
if (!discounts.isEmpty() && discounts != null) {
for (Integer i:discounts) {
subTotal-=i;
}
}
Integer tax = subTotal * 1;
return subTotal.intValue()+tax.intValue();
}
}
重构
重构后的代码如下,然后calculateGrandTotal方法就直接调用calculateSubTotal、calculateDiscounts、calculateTax, 从而是整个逻辑看起来更加清晰,并且可读性和维护性也得到了大大提高。
public class Receipt {
private List<Integer> discounts;
private List<Integer> itemTotals;
public int calculateGrandTotal() {
int subTotal = calculateSubTotal();
subTotal = calculateDiscounts(subTotal);
subTotal = calculateTax(subTotal);
return subTotal;
}
private int calculateTax(Integer subTotal)
{
Integer tax = subTotal * 1;
return subTotal.intValue()+tax.intValue();
}
private int calculateDiscounts(Integer subTotal)
{
if (!discounts.isEmpty() && discounts != null)
{
for (Integer i:discounts) {
subTotal-=i;
}
}
return subTotal;
}
private int calculateSubTotal() {
Integer subTotal = 0;
for (Integer i:itemTotals) {
subTotal+=i;
}
return subTotal;
}
}
总结
这个重构在很多公司都有一些的代码规范作为参考,比如一个类不能超过多少行代码,一个方法里面不能超过多少行代码, 这在一定程度上也能使程序员把这些复杂的逻辑剥离成意义很清楚的小方法。