本系列来自《java 重构改善既有代码的设计》一书
如果你有一个很复杂的表达式,可以考虑将复杂表达式(或其中的一部分的结果放入到一个临时变量,以此变量名来解释表达式用途)。
if (VodStatusEnum.PASSED.toString().equals(info.getAuditStatus().toString())) {
// 那么如果以前该数据是不是审核通过那么则添加,否则不做操作
if (!VodStatusEnum.PASSED.toString().equals(temp.getAuditStatus().toString())) {
taskService.save((ContentUI) temp, authUser);
}
} else {
// 那么如果以前是审核通过,那么删除该条数据
if (VodStatusEnum.PASSED.toString().equals(temp.getAuditStatus().toString())) {
taskService.saveByDelete((ContentUI) temp, authUser);
}
}
可写成:
final boolean passedOper = VodStatusEnum.PASSED.toString().equals(info.getAuditStatus().toString());
final boolean isPassed = VodStatusEnum.PASSED.toString().equals(temp.getAuditStatus().toString());
// 如果是审核通过
if (passedOper) {
// 那么如果以前该数据是不是审核通过那么则添加,否则不做操作
if (!isPassed) {
taskService.save((ContentUI) temp, authUser);
}
} else {
// 那么如果以前是审核通过,那么删除该条数据
if (isPassed) {
taskService.saveByDelete((ContentUI) temp, authUser);
}
}
如果表达式很复杂,这时利用临时变量可以帮助你将表达式分解成比较容易管理的形式。特别是在条件逻辑中。
但是不常用,因为局部变量只能在这个方法中才能使用,局限性很大,更推荐利用Extract Method处理。只有当Extract Method难处理的时候才使用这种。
做法:
1、声明一个final变量,将复杂表达式的一部分动作的运算结果赋值给它。
2、将表达式中的运算结果这部分替换成申明的变量。
3、编译测试。
例子:
/**
* 描述:底价 = 数量*单价 - 批发折扣 - 运费
* @return
*/
public double getPrice() {
return quantity * itemPrice - Math.max(0, quantity - 500) * itemPrice * 0.05 + Math.min(quantity * itemPrice * 0.1, 100.0);
}
如果利用引入解释性变量可以写成:
/**
* 描述:底价 = 数量*单价 - 批发折扣 - 运费
* @return
*/
public double getPrice() {
final int basePrice = quantity * itemPrice;
// 折扣
final double quantityDiscount = Math.max(0, quantity - 500) * itemPrice * 0.05;
// 运费
final double shipping = Math.min(basePrice * 0.1, 100.0);
return basePrice - quantityDiscount - shipping;
}
如果利用提炼方法可以写成:
public double getPrice() {
return basePrice() - quantityDiscount() - shipping();
}
private int basePrice() {
return itemPrice * quantity;
}
/**
* 描述:折扣
* @return
*/
private double quantityDiscount() {
return Math.max(0, quantity - 500) * itemPrice * 0.05;
}
/**
* 描述:运费
* @return
*/
private double shipping() {
return Math.min(basePrice() * 0.1, 100.0);
}