写点什么

别再用 Else 语句写代码了?

  • 2019-09-17
  • 本文字数:1573 字

    阅读完需:约 5 分钟

别再用Else语句写代码了?

if…else 语句是许多程序员在写代码时最常用的方式之一。你甚至可以看到许多程序员的代码中嵌套着无数 else 语句。可这样,真的好吗? 一篇关于卫语句的实用介绍。


在刚开始接触编程时,我多希望能有人在我摸索着开发第一个网站的过程中,给我分享一点中肯的人生经验……


那会儿我犯下的第一个大错误,就是在编写条件时过度使用 else 关键字。不只是我,后来我发现很多开发者朋友都有这个问题,所以我打算在今天的文章里好好聊聊这件事。


免责声明:本文纯粹是我自己的主观感受。


在某些情况下,我们可能没办法在代码里使用这类方法。有时候,使用 else 关键字确实是最好的解决方案。这些我都承认,本文只是想给大家提供一点关于构建逻辑的新思路。



缩进波动拳!

卫语句

根据维基百科的介绍,卫语句是对完整性前提条件检查。用于避免在执行期间发生错误。


望之不似人言,下面我就用普通话翻译翻译。我们首先得先对前提条件(在代码开头)进行完整性检查,这样才能避免主逻辑流程当中出现错误。


在理想的流程中(当验证正确时),我们希望程序的主逻辑在验证之后才开始运行。


现在让我们假设自己在运营一个网站,其中包含一个高级购买区域,仅限付费客户在每天夜里 12 点之后访问。


<?php
if ($user != null) { if (time() >= strtotime('12 pm')) { if ($user->hasAccess(UserType.PREMIUM)) { if ($store->hasItemsInStock()) { // the content a premium user user should be able to see when the store is in stock // after 12pm. } else { return 'We are completely sold out.'; } } else { return 'You do not have premium access to our website.'; } } else { return 'This section is not opened before 12PM'; }} else { return 'You are not signed in.';}
复制代码


在实际应用中,我们可能会返回某种形式的异常。


虽然这是一种条件流方案,但即使其中只包含少量 else 关键字,我们也很难跟上这样的条件思路。


这还只是条件逻辑的一个简单示例。在实际场景当中,大家肯定遇到过对逻辑极为复杂的类进行导航的状况。在我看来,这样的编码方式缺乏可持续性,我们应该采取更好的办法。


使用卫语句,我们可以遵循以下框架:


<?php
if (condition1()) { return ...;}
if (condition2()) { return ...;}
// Input is valid.doSomething();
复制代码


利用这套框架,我们可以重构以前的代码,具体如下所示:


<?php
if ($user == null) { return 'You are not signed in.';}
if (time() < strtotime('12 pm')) { return 'This section is not opened before 12PM';}
if (!$user->hasAccess(UserType.PREMIUM)) { return 'You do not have premium access to our website';}
if (!$store->hasItemsInStock()) { return 'We are completely sold out.';}
// the content a premium user user should be able to see when the store is in stock // after 12pm.
复制代码


在卫语句中,我们通常将布尔表达式反转为我们想要 assert 的内容。如果我们希望用户在登录之后才能查看此页面,那么首先就得检查他们是否已经登录。


这种方法实现了相同的精确逻辑流程,但在我看来,这体现出了更为清晰的条件逻辑处理方法。

总结

在编程时,我们应该始终牢记这样一个问题:“这些代码能够稳定执行至少 6 个月吗?”


就当下来讲,这些代码也许能够很好地解决问题。但是未来呢?在编写代码时不考虑后续需求,显然是种愚蠢的行为。


考虑到这一点,我果断放弃了那些已经修复过无数次的代码,从零开始编写功能。是的,这样才能彻底解决掉技术债务。


适当运用卫语句,大家将能够为自己乃至团队的开发成果奠定坚实的基础,从而在未来需要时随时满足种种新增需求。

原文链接

Stop Using Else in Your Programs


2019-09-17 14:067660

评论 3 条评论

发布
用户头像
赞,再推荐耗子叔一篇类似的文章:
https://coolshell.cn/articles/17757.html
2019-09-18 07:59
回复
用户头像
Guard 这个单词翻译成 卫 ?是否有些……?
2019-09-17 21:49
回复
用户头像
这会带来另一个问题,多个返回语句让其他人更加难以理解数据的流转过程。用模式匹配(pattern matching)或者把这个负载的类的判断逻辑抽象成多个小的函数的方式来做可能会更好。
2019-09-17 14:38
回复
没有更多了
发现更多内容

使用华为开发者空间搭建WordPress博客平台

华为云开发者联盟

华为云 华为开发者空间

我定制的通义灵码 Project Rules,用 AI 写出“更懂我”的代码

阿里巴巴云原生

阿里云 云原生 通义灵码

如何基于 Kestrel 实现 socks5 代理

八苦-瞿昙

C# Proxy

防火墙事件日志及日志分析

运维有小邓

日志管理工具 IT运维服务

MySQL的高可用解决方案

陈一之

MySQL 高可用架构

Studio 3T 2025.7 发布 - MongoDB 的终极 GUI、IDE 和 客户端

sysin

mongodb

Acunetix v25.4 - Web 应用程序安全测试

sysin

Acunetix

金仓数据库KingbaseES如何通过Hint影响执行计划

金仓技术

KingbaseES 金仓数据库

通义灵码入选 “2025 年值得关注的 AIGC 产品”,是唯一入选的 AI 编程产品

阿里巴巴云原生

阿里云 云原生 通义灵码

飞算 JavaAI “智能引导” 功能:小白一天也能成为 Java 高手

飞算JavaAI开发助手

域名状态异常是怎么回事?怎么解决?(国科云)

国科云

MyBatis中的 10 个宝藏技巧!

量贩潮汐·WholesaleTide

Java 数据库 mybatis

从重复编码到设计:飞算 JavaAI 助力程序员跳出「低阶陷阱」

飞算JavaAI开发助手

企业im有哪些? 哪款更适合你的即时通讯需求?

BeeWorks

即时通讯 IM 私有化部署 企业级应用

Kubernetes弹性扩容:助力AI大模型部署与运维的云原生实践

inBuilder低代码平台

我定制的通义灵码 Project Rules,用 AI 写出“更懂我”的代码

阿里云云效

阿里云 云原生 通义灵码

当KES高可用共享集群部署遇到文件系统损坏,该如何解决?

金仓技术

KingBase 金仓数据库

从一棵树到一片森林:Mint Forest V3 正式上线!

NFT Research

blockchain web3

搞定 XLSX 预览?别瞎找了,这几个库(尤其最后一个)真香!

Immerse

SpecterInsight 4 - 基于 .NET 的跨平台后渗透指挥与控制 (C2) 框架

sysin

渗透

金仓数据库KingbaseES PAKCAGE的使用

金仓技术

KingBase 数据库· 金仓数据库

通义灵码入选 “2025 年值得关注的 AIGC 产品”,是唯一入选的 AI 编程产品

阿里云云效

阿里云 云原生 通义灵码

从编码执行者到系统指挥官:AI时代程序员的价值跃迁之路

飞算JavaAI开发助手

k8s中资源限制 limit 和 request 的关系

陈德伟

k8s JVM Request Resource limit

VMware Cloud Director Availability 4.7.1 - 灾难恢复和迁移 (DRaaS 解决方案)

sysin

vmware

即时编译助力金仓数据库KingbaseES分析能力飞跃

金仓技术

JIT 金仓数据库

聊聊SpringAI流式输出的底层实现?

王磊

QT 实现 C++ 数据类与 json 的转换

电子尖叫食人鱼

c++ qt

Kubelet 可观测性最佳实践

观测云

Kubernetes

飞算 JavaAI 的 “高并发处理” 方案:如何应对流量高峰

飞算JavaAI开发助手

SANnav Management Portal 2.2.1 for ESXi - SAN 可视化管理软件

sysin

SANnav

别再用Else语句写代码了?_语言 & 开发_Joey Colon_InfoQ精选文章