卫函数要解决什么问题?
卫函数主要解决的是if嵌套太深导致的代码可读性差的问题。实际开发场景中大家都见过类似于下面的代码,我称之为梦幻45度:
有人可能觉得10个嵌套非常夸张,滨少不才,真的见过,**红线看着是真舒服,if里面的代码看着是真累啊。**不说看到10个,看到3个4个,大家的感觉可能都是:
那么什么是卫函数,实际开发中应该如何使用,往下看。
什么是卫函数
卫函数是在函数或方法的开头检查输入参数或对象的状态是否满足函数的预期。如果不满足,函数将立即返回,避免进一步的处理。这样可以提高代码的可读性,减少代码的嵌套层次,并提前处理错误。
大白话就是及时return。
正确使用卫函数的心法
卫函数的核心心法是能不能使函数的控制流程更加清晰。看了很多《别再使用if-else》类似的文章,其实只是授人以鱼。
函数(方法)通常有单入口单出口的最佳实践写法。意思是一个方法最好只有1个return语句,如果函数中有多个return语句,那么函数的分支(退出点)就会变多,那么意味着单元测试也会变多,如果只有1个return我们只需要关注一个出口,当然这只是其中的一个点,本文主要不讨论这个。
那么卫函数的及时return是否就冲突了。我的理解:
- 卫语句确实可能会打破函数的单入口单出口原则,但是这并不一定是坏事。单入口单出口原则的主要目的是为了使函数的控制流程更加清晰和易于理解。然而,在某些情况下,使用卫语句可能会使函数的控制流程更加清晰。
- 卫语句通常用于检查函数的前置条件,如果这些条件不满足,函数会立即返回。这样可以减少函数主体的嵌套层次,使函数的主要逻辑更加突出。因此,即使卫语句打破了单入口单出口原则,但是如果它可以使函数的逻辑更加清晰,那么使用卫语句是合理的。
看完以上你是否对卫函数有新的理解,为了加深理解,有眼前一亮的感觉吗?当初有个叫滨少的人给我说了他的理解,我直接就是
*
卫函数推荐使用场景
卫函数推荐的使用场景推荐是简单的场景,不要有复杂的逻辑,以下是常见使用场景
检查输入参数
在函数开始时使用卫函数检查输入参数是否满足预期的条件。如果不满足,可以立即返回错误或抛出异常,而不是继续执行可能会失败的后续代码。
public void setAge(int age) {if (age < 0) {throw new IllegalArgumentException("Age cannot be negative");}this.age = age;
}
处理特殊情况
如果函数有一些特殊的情况可以立即处理并返回结果,那么使用卫函数可以使代码更清晰。例如,如果一个函数在列表为空时返回一个默认值,可以使用卫语句来处理这种情况。
public int getFirst(List<Integer> list) {if (list == null || list.isEmpty()) {return -1; // default value}return list.get(0);
}
减少嵌套
卫函数可以减少代码的嵌套深度,使主要的逻辑更加突出。如果一个函数有多个条件需要满足才能执行主要的逻辑,那么可以使用卫语句来处理不满足条件的情况。
public void process(Order order) {if (order == null) {return;}if (order.getStatus() != OrderStatus.PENDING) {return;}// main logic
}
卫函数不推荐使用场景示例
假设我们有一个订单处理系统,其中有一个方法用于处理订单。这个方法首先会检查订单的状态,然后根据订单的状态执行不同的操作。如果订单的状态是“待支付”,那么方法会执行支付操作;如果订单的状态是“待发货”,那么方法会执行发货操作;如果订单的状态是“已完成”,那么方法会执行完成操作。在这种情况下,我们不能简单地使用卫语句来检查订单的状态,因为每种状态都需要执行不同的操作。