编程最佳实践-卫函数

devtools/2024/10/18 3:22:12/

文章目录

卫函数要解决什么问题?

卫函数主要解决的是if嵌套太深导致的代码可读性差的问题。实际开发场景中大家都见过类似于下面的代码,我称之为梦幻45度:
image.png
有人可能觉得10个嵌套非常夸张,滨少不才,真的见过,**红线看着是真舒服,if里面的代码看着是真累啊。**不说看到10个,看到3个4个,大家的感觉可能都是:
image.png
那么什么是卫函数,实际开发中应该如何使用,往下看。

什么是卫函数

卫函数是在函数或方法的开头检查输入参数或对象的状态是否满足函数的预期。如果不满足,函数将立即返回,避免进一步的处理。这样可以提高代码的可读性,减少代码的嵌套层次,并提前处理错误。
大白话就是及时return。

正确使用卫函数的心法

卫函数的核心心法是能不能使函数的控制流程更加清晰。看了很多《别再使用if-else》类似的文章,其实只是授人以鱼。
函数(方法)通常有单入口单出口的最佳实践写法。意思是一个方法最好只有1个return语句,如果函数中有多个return语句,那么函数的分支(退出点)就会变多,那么意味着单元测试也会变多,如果只有1个return我们只需要关注一个出口,当然这只是其中的一个点,本文主要不讨论这个。
那么卫函数的及时return是否就冲突了。我的理解:

  1. 卫语句确实可能会打破函数的单入口单出口原则,但是这并不一定是坏事。单入口单出口原则的主要目的是为了使函数的控制流程更加清晰和易于理解。然而,在某些情况下,使用卫语句可能会使函数的控制流程更加清晰。
  2. 卫语句通常用于检查函数的前置条件,如果这些条件不满足,函数会立即返回。这样可以减少函数主体的嵌套层次,使函数的主要逻辑更加突出。因此,即使卫语句打破了单入口单出口原则,但是如果它可以使函数的逻辑更加清晰,那么使用卫语句是合理的。

看完以上你是否对卫函数有新的理解,为了加深理解,有眼前一亮的感觉吗?当初有个叫滨少的人给我说了他的理解,我直接就是
*image.png

卫函数推荐使用场景

卫函数推荐的使用场景推荐是简单的场景,不要有复杂的逻辑,以下是常见使用场景

检查输入参数

在函数开始时使用卫函数检查输入参数是否满足预期的条件。如果不满足,可以立即返回错误或抛出异常,而不是继续执行可能会失败的后续代码。

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
}

卫函数不推荐使用场景示例

假设我们有一个订单处理系统,其中有一个方法用于处理订单。这个方法首先会检查订单的状态,然后根据订单的状态执行不同的操作。如果订单的状态是“待支付”,那么方法会执行支付操作;如果订单的状态是“待发货”,那么方法会执行发货操作;如果订单的状态是“已完成”,那么方法会执行完成操作。在这种情况下,我们不能简单地使用卫语句来检查订单的状态,因为每种状态都需要执行不同的操作。


http://www.ppmy.cn/devtools/41199.html

相关文章

RK3588 usb adb调试

问题&#xff1a;2路usb3.0 otg&#xff0c;在使用其中一路typeC1作用adb功能使用后&#xff0c;将这路设置成host模式后&#xff0c;另外一路typeC0设置device&#xff0c;这路还是无法当做usb adb来使用。 查看usb typeC1当前模式 cat /sys/kernel/debug/usb/fc400000.usb/m…

uniapp引入vant组件库

在 UniApp 中引入 Vant 组件库的完整步骤通常如下&#xff1a; 安装 Vant&#xff1a; 首先&#xff0c;你需要通过 npm 或 yarn 安装 Vant。打开项目的根目录&#xff0c;然后在命令行中执行以下命令&#xff1a; 使用 npm&#xff1a; npm install vant 或者使用 yarn&…

docker 和 docker-compose

Docker是一种开源的容器化平台&#xff0c;它可以帮助开发人员将应用程序及其所有依赖项打包到一个独立的、可移植的容器中。这意味着您可以在任何地方运行Docker容器&#xff0c;而不需要担心环境差异或依赖项的问题。 Docker Compose是Docker官方提供的一个工具&#xff0c;…

Kubernetes中的RBAC

目录 1. Role2. ClusterRole3. RoleBinding4. ClusterRoleBinding5.启用 RBAC Kubernetes中的RBAC&#xff08;Role-Based Access Control&#xff0c;基于角色的访问控制&#xff09;是一种机制&#xff0c;用于控制集群内资源的访问权限。RBAC允许管理员通过定义角色&#xf…

杰发科技AC7801——ADC之Bandgap和内部温度计算

0. 参考 电流模架构Bandgap设计与仿真 bandgap的理解&#xff08;内部带隙电压基准&#xff09; ​ ​ 虽然看不懂这些公式&#xff0c;但是比较重要的一句应该是这个&#xff1a;因为传统带隙基准的输出值为1.2V ​ 1. 使用 参考示例代码。 40002000是falsh控制器寄…

JDK的串行收集器介绍与优化指南-02

对象的生命周期 对象的生命周期 在Java中,对象的生命周期通常包括以下几个阶段,这些阶段与JVM的内存管理和垃圾收集机制密切相关。 创建阶段 (1)为对象分配存储空间:当使用new关键字或其他方式(如反射、克隆、反序列化等)创建一个对象时,JVM首先会在堆内存中为其分配…

ListView[new]

activity_main.xml <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_height"match_parent"android:layout_width"match_parent"…

打开IE浏览器自动跳转微软的edge浏览器,取消自动跳转

打开IE浏览器会自动跳转微软的edge浏览器 不想跳转的解决办法 1.Win Q 输入 Internet&#xff0c;点击Internet 选项 2.去掉勾选 启用第三方浏览器扩展&#xff0c;然后就不自动跳转了 3. 完成