写点什么

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

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

SpringBoot 实战:在 RequestBody 中优雅的使用枚举参数(原理篇)

看山

Java Spring Boot Effective Spring 10月月更

IM系统消息丢失问题排查反思

轻口味

IM Android; 10月月更

keytool生成keystore、truststore、证书

黄敏

智能运维之日志语义异常检测

云智慧AIOps社区

日志 数据处理 异常检测 智能运维 算法实践

青岛敏捷之旅,来了!

禅道项目管理

敏捷 敏捷教练 青岛

Facebook宕机事故,暴露了上云不是唯一的答案

脑极体

【LeetCode】Fizz Buzz Java题解

Albert

算法 LeetCode 10月月更

实践篇 -- Redis客户端缓存在SpringBoot应用的探究

binecy

缓存 springboot redis sentinel

python 数据库编程,这篇是针对 mysql 的,滚雪球学Python第4季第13篇

梦想橡皮擦

10月月更

015云原生之大数据技术

穿过生命散发芬芳

云原生 10月月更

《沸腾新十年》背后的N重空间

博文视点Broadview

SSRF漏洞实例分析

网络安全学海

网络安全 信息安全 渗透测试 WEB安全 漏洞分析

直播分发选低延迟 RTC 还是 CDN?

融云 RongCloud

CDN 直播 RTC

Leetcode 题目解析:279. 完全平方数

程序员架构进阶

算法 LeetCode 动态规划 10月月更

”微博评论“的高性能高可用计算架构

缘分呐

架构设计实战

快速配置浏览器 https 访问 Kibana(qbit)

qbit

elasticsearch TLS Kibana ssl

小知识系列:查询数据库数据的元信息

程序那些事

Java 数据库 元数据 程序那些事

技术分享| RTC通讯中常用的图像格式

anyRTC开发者

音视频 RTC 图像格式 rgb yuv

喜大普奔!焱融科技正式推出 SaaS 数据服务平台

焱融科技

云计算 高性能 公有云 文件存储 分布式,

存量时代会员深度运营逻辑

boshi

深度思考 运营

在线下划线转驼峰,驼峰转下划线工具

入门小站

工具

CSS架构之Components层

Augus

CSS 10月月更

【Flutter 专题】30 图解自定义底部状态栏 ACEBottomNavigationBar (二)

阿策小和尚

Flutter 小菜 0 基础学习 Flutter Android 小菜鸟 10月月更

Vue进阶(幺叁肆):npm查看包版本信息

No Silver Bullet

Vue 表单校验 10月月更

第 16 章 -《Linux 一学就会》- Linux计划任务与日志的管理

学神来啦

Linux linux运维 linux学习 linux一学就会

并发相关的性质学习笔记

风翱

并发 10月月更

粪菌移植的背后,肠道菌那些你不知道的事儿

脑极体

linux中vi,vim操作技巧

入门小站

Linux

Prometheus 基础查询(一)

耳东@Erdong

Prometheus 10月月更

阿里架构师总结Go语言和java语言之间的对比联系

hanaper

【Vuex 源码学习】第十二篇 - Vuex 插件机制的实现

Brave

源码 vuex 10月月更

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