2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

别再用 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:067693

评论 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
回复
没有更多了
发现更多内容

mac多媒体影音库:Emby for Mac 中文版下载

你的猪会飞吗

mac软件下载 mac破解软件下载

项目管理新利器!Project Office Pro助您精准规划,高效执行,项目成功不是梦

Rose

Serato DJ Pro mac(专业DJ软件) v3.0.3中文激活版

Rose

mesa LLVMpipe ORCJIT 上游化:一场历时两年的后端合并马拉松,幕后英雄竟是TA!

nn-30

Linux 开源 操作系统 risc-v 桌面

减少停机时间的最简单方法 — 避免单点故障

通明湖

鞋服品牌飞跃新纪元 智能商品管理软件五大颠覆性优势

第七在线

阿里云 EMR Serverless StarRocks OLAP 数据分析场景解析

阿里云大数据AI技术

大数据 数据分析 OLAP EMR

法律服务机构启用电子签章网上签署法律文书,省时省力提效率

数字工具研究

MATLAB R2023a中文版安装教程 MATLAB许可证密钥分享 Mac/win

Rose

数学软件 MATLAB R2023b破解版 MATLAB 密钥 MATLAB 安装教程

macOS 14 Sonoma系统下载安装 苹果最新14系统离线安装包

Rose

Perfectly Clear Workbench(图片编辑软件) v4.6.1.2678永久激活版

Rose

实战攻略:如何用 TDengine 轻松搞定时序数据建模

TDengine

户外LED显示屏具备哪些性能?

Dylan

广告 LED显示屏 全彩LED显示屏 户外LED显示屏 led显示屏厂家

【最新LR2023安装包】lightroom classic 2023-一键安装-永久使用-中文简体

Rose

Supersonic 推出游戏创意生成器,AI 助力激发开发者创作灵感

极客天地

Glyphs 3 for Mac字体设计编辑工具下载安装

Rose

Mac 软件 字体设计 Glyphs 3 mac

竖版H5摸鱼挂机游戏来啦!新版雷霆传奇详细图文架设教程

echeverra

雷霆传奇

瑞能半导体携多元成果打造全新“品牌基石” 驭领可持续篇章 为功率器件注入强劲动力

新消费日报

中英人寿呈现“ACE 中英事业家”优增品牌,谱写事业与生活共益共生绚丽华章

新消费日报

设备指纹市场分析及未来展望

芯盾时代

终端安全 移动安全 风控系统

DataBuilder2.3.2重磅发布,核心功能全面升级,引领数据治理新高度!

数造万象

数据治理 数据资产 数据开发 DataOps 版本升级

Mac虚拟机VMware Fusion Pro 13永久密钥 VM虚拟机 mac版下载安装教程

Rose

VMware Fusion Pro 13 Mac虚拟机 VM虚拟机密钥

性能测试概念

霍格沃兹测试开发学社

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