java重构学习4:引入解释性变量(Introduce Explaing Variable)

本系列来自《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);
}







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值