作者丨Joey Colon

译者丨核子可乐

策划丨小智

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 个月吗?”

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

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

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

原文链接:

https://medium.com/better-programming/why-you-need-to-stop-using-else-statements-5b1fd09dea9e

有道无术,术可成;有术无道,止于术

欢迎大家关注Java之道公众号

好文章,我在看❤️

别再用Else语句写代码了!相关推荐

  1. 别以为程序员的工作就是写代码

    大家好,我是鱼皮,今天给大家分享一个开发小经验. 很多没有实际工作过的同学,可能都会认为程序员的工作只有写代码 + 和产品经理 "拉扯",也会习惯性地用代码量来评价一个程序员的工作 ...

  2. 浅谈设计模式 | 先有鸡还是先有蛋?先有代码后有设计模式还是先有设计模式再写代码?

    前言 一.面向对象的三大特性 1. 封装 2.继承 3.多态 二.面向对象七个设计原则 1.单一职责原则 2.开放封闭原则 3.里氏替换原则 4.接口隔离原则 5.依赖倒置原则 6.合成复用原则 7. ...

  3. C语言基础第六课——第二节if语句(if-else格式、不带else的if结构)、借例题简述写代码流程、从键盘上输入三个整数,求出其中的最大数(打擂法、三目运算符、排序)、if语句的嵌套计算个人所得税

    C语言基础第六课--第二节 一.if语句概述 二.标准if-else格式 三.借例题简述写代码流程 四.不带else的if结构 五.例题:从键盘上输入三个整数,求出其中的最大数.(打擂法.三目运算符. ...

  4. 程序员门槛再被“神器”降低:只要会英文,就能写代码!

    近日,OpenAI带着他们最新.最神自动编码神器Codex霸榜各大科技媒体头条,我们知道OpenAI是微软投资的通用人工智能平台,而GitHub是微软旗下的代码托管平台,这样微软出算力.OpenAI出 ...

  5. python怎么换行输入而不执行_关于在IDLE中怎么换行继续敲写代码而不执行语句...

    查看: 44535|回复: 29 [已解决]关于在IDLE中怎么换行继续敲写代码而不执行语句 电梯直达 发表于 2016-9-30 10:05:49 | 只看该作者 |倒序浏览 |阅读模式 马上注册, ...

  6. 腾讯万字Code Review规范出炉!别再乱写代码了

    本文经公众号:腾讯技术工程(ID:Tencent_TEG)授权转载,如需转载请联系出处. 作者:cheaterlin,腾讯 PCG 后台开发工程师 前言 作为公司代码委员会 golang 分会的理事, ...

  7. 如何先梳理业务逻辑再写代码

    1.业务逻辑与代码 代码是需求逻辑的一种展现形式 需求文档是业务逻辑的一种展现形式,而代码不过是业务逻辑的另一种表现形式:如果逻辑本身有问题,那么它的各种展示形式自然也是错的,所以写代码前应该先思考清 ...

  8. Erlang之父去世,忠告程序员:先思考再编程,累的时候不要写代码

    作者:黄哲铿<技术管理之巅>作者.技术领导力特约撰稿人 Erlang之父Joe Armstrong于4月20日去世,享年68岁. Erlang Solutions.Erlang Facto ...

  9. 有赞996反省:男程序员们,别再低头写代码了(上)

    近日,一条"有赞年会亲历"的帖子在知乎刷屏,关于有赞年会上宣布的年后开始执行"996"工作制度的消息,引发了有赞乃至整个互联网员工激烈吐槽. 什么是" ...

最新文章

  1. 2020事业单位转型合同制方向的政策通知
  2. SQL游标(cursor)详细说明及内部循环使用示例
  3. swiftsuspenders Memo
  4. .NET 网站自动登录
  5. 中国液化石油气(LPG)市场销售现状与竞争发展策略分析报告2022-2028年版
  6. 傅里叶变换对噪声进行频谱分析
  7. centos8下搭建gotk3(go语言gtk库) x86_64-w64-mingw32交叉编译环境
  8. anaconda moviepy_Anaconda的安装和Jupyter Notebook使用
  9. Spring : @EnableScheduling注解 @Scheduled
  10. qt 右键显示设置界面 后台运行_1.1安装Qt
  11. 「开源资讯」Apache Storm 2.2.0 发布,分布式实时计算
  12. java看视频可以学会吗,看it教程视频自学Java编程可以学会吗?
  13. c if语句多个条件判断顺序_IF函数和IFS函数的应用对比
  14. 无法找到资源编辑器dll
  15. 使用C#存储数据时excel有Microsoft切换到了wps时的引用
  16. 20162327WJH实验五——数据结构综合应用
  17. 在阿里云云虚拟主机上个人网站的Https访问配置
  18. 操作系统1-6章作业
  19. PMP第四章:项目整合管理
  20. 4330. 非传递骰子

热门文章

  1. python 查看excel 多少行_13行代码实现对Excel自动分表(python)
  2. AVB2 avbtool.py脚本常用命令
  3. python 速度 memmap_从20秒到0.5秒:一个使用Rust语言来优化Python性能的案例
  4. TNN 量化_加量化港美股打新群!
  5. (数据库系统概论|王珊)第四章数据库安全性:习题
  6. 基础编程题之牛客网星际密码
  7. Linux系统编程10:进程入门之系统编程中最重要的概念之进程进程的相关操作使用fork创建进程
  8. ProtoBuf 常用序列化/反序列化API
  9. USACO-Section1.3 Milking Cows (区间问题)
  10. C 控制父、子进程的先后顺序执行