OceaBase开发者大会落地上海!4月20日共同探索数据库前沿趋势!报名戳 了解详情
写点什么

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

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

Middle for Mac(触控板和鼠标增强工具) v1.8.4免激活版

iMac小白

FastScripts for Mac(脚本调用工具) v3.3.1激活版

iMac小白

Photomator for mac(照片编辑器) v3.3.2中文版

iMac小白

AnyMP4 iPhone Unlocker mac中文激活版 专业iPhone解锁工具

iMac小白

10个技巧,3分钟教会你高效寻找开源项目

快乐非自愿限量之名

开源 项目开发

体育赛事直播平台,为何能成为2024的一匹黑马

软件开发-梦幻运营部

低代码数智赋能医药行业:开启医药产业数字化转型新篇章

EquatorCoco

低代码 数智化 数智转型 医药行业

不会使用ps怎么办?适用于苹果Mac的最佳Photoshop替代品

Rose

Mellel 6 for Mac(文字处理软件) v6.0.3中文激活版

iMac小白

苹果电脑有哪些好用的修图软件?

Rose

修图 抠图 Mac软件 照片编辑

聊聊 HTTP 性能优化

EquatorCoco

性能优化 网络协议 HTTP

Disk Drill for Mac(数据恢复软件)v5.4.1426中文激活版

iMac小白

Mac延长电池的使用寿命AlDente for Mac电池最大充电限制工具

iMac小白

全栈开发(TS,React,Vue, Java, 移动端flutter)接单

hz

BRC-20铭文发行合约系统开发:深度思考与逻辑性

区块链软件开发推广运营

dapp开发 区块链开发 链游开发 NFT开发 公链开发

苹果电脑新手教程:如何开启任何来源选项

Rose

mac电脑 苹果电脑 任何来源

实时数据驱动:API商品数据接口的三重保证,助力您的业务飞跃

Noah

PullTube for Mac(在线视频下载器) v1.8.5.27中文激活版

iMac小白

NTFS Disk by Omi NTFS for Mac(NTFS 磁盘管理器) v1.1.4激活版

iMac小白

2024-03-02:用go语言,一个句子是由一些单词与它们之间的单个空格组成, 且句子的开头和结尾没有多余空格, 比方说,“Hello World“ ,“HELLO“ ,“hello world h

福大大架构师每日一题

福大大架构师每日一题

安装mac软件时提示已损坏,无法打开,应该移到废纸篓的解决办法

Rose

万字带你走过数据库的这激荡的三年

不在线第一只蜗牛

数据库 开发 数据集

ProPresenter for Mac(现场分屏演示工具) v7.16.1汉化版

iMac小白

AI实战 | 由浅入深,手把手带你实现Java转型学习助手

EquatorCoco

Java 人工智能 AI AI技术

低代码与智慧工地:助力建筑行业数字化转型

不在线第一只蜗牛

低代码 数字化 数字转型

十行代码开发一个AI应用

快乐非自愿限量之名

人工智能 应用开发

AI会夺走程序员的饭碗吗?

算AI

#人工智能

adobe 系列应用出现Error无法继续安装,文件已损坏,无法打开解决方法

Rose

已解决org.springframework.web.bind.MissingRequestHeaderException缺少请求头异常的正确解决方法,亲测有效!!!

小明Java问道之路

面试官:说说SSO单点登录的实现原理?

不在线第一只蜗牛

程序员 面试 SSO 单点登录

“离开”还是“拓展”你的舒适区

Bruce Talk

VUCA 舒适区 反脆弱

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