当前位置:首页 > 科技  > 软件

我们一起聊聊如何简化多个 if 的判断结构

来源: 责编: 时间:2024-03-29 17:16:57 302观看
导读多少算太多?有些人认为数字就是一,你应该总是用至少一个三元运算符来代替任何单个 if 语句。我并不这样认为,但我想强调一些摆脱常见的 if/else 意大利面条代码的方法。我相信很多开发人员很容易陷入 if/else 陷阱,不是因

多少算太多?

有些人认为数字就是一,你应该总是用至少一个三元运算符来代替任何单个 if 语句。我并不这样认为,但我想强调一些摆脱常见的 if/else 意大利面条代码的方法。OTR28资讯网——每日最新资讯28at.com

我相信很多开发人员很容易陷入 if/else 陷阱,不是因为其他解决方案的复杂性,而是因为它遵循这样的自然语言模式:if 执行此操作, else 执行此操作。OTR28资讯网——每日最新资讯28at.com

等等,什么是三元运算符?

三元运算符与 if/else 并没有革命性的区别,因为它们都是条件操作,但三元运算符会返回一个值,因此可以直接用于赋值。OTR28资讯网——每日最新资讯28at.com

const greaterThanFive = (8 > 5) ? 'yep' : 'nope';console.log(greaterThanFive); // 'yep'

基本模式只是一个条件,如果为真则返回一个值,如果为假则返回另一个值。OTR28资讯网——每日最新资讯28at.com

(condition) ? isTruthy : isFalsy

IF/ELSE 的替代方案

让我们从一个场景开始,逐步了解不同解决方案的示例。OTR28资讯网——每日最新资讯28at.com

我们将从用户输入中获取颜色,并需要将它们转换为一些预设的颜色代码来匹配,以便我们可以更改背景颜色。因此,我们将检查颜色名称字符串,并在匹配时设置颜色代码。OTR28资讯网——每日最新资讯28at.com

const setBackgroundColor = (colorName) => { let colorCode = ''; if(colorName === 'blue') {  colorCode = '#2196F3'; } else if(colorName === 'green') {  colorCode = '#4CAF50'; } else if(colorName === 'orange') {  colorCode = '#FF9800'; } else if(colorName === 'pink') {  colorCode = '#E91E63'; } else {  colorCode = '#F44336'; }; document.body.style.backgroundColor = colorCode;};

这个 if/else 就完成了工作。但是我们背负着大量重复逻辑比较 colorName 和重复赋值 colorCode。OTR28资讯网——每日最新资讯28at.com

Switch  ?

现在我们可以更恰当地将其更改为 switch 语句。它更符合我们正在尝试做的事情的概念;我们有几种想要匹配的字符串情况,如果没有一种情况匹配,则有一个默认值。OTR28资讯网——每日最新资讯28at.com

const setBackgroundColor = (colorName) => { let colorCode = ''; switch(colorName) {  case 'blue':   colorCode = '#2196F3';   break;  case 'green':   colorCode = '#4CAF50';   break;  case 'orange':   colorCode = '#FF9800';   break;  case 'pink':   colorCode = '#E91E63';   break;  default:   colorCode = '#f44336'; }; document.body.style.backgroundColor = colorCode;};

但是 switch 仍然带有大量我们可以不需要的样板文件和重复代码。OTR28资讯网——每日最新资讯28at.com

Lookup Table  查找表

那么我们真正想要实现什么目标呢?我们需要将十六进制颜色代码分配给颜色名称,因此让我们创建一个将颜色名称作为键、将颜色代码作为值的对象。然后我们可以使用 object[key] 通过颜色名称查找颜色代码。我们需要一个默认值,因此如果没有找到键,则返回默认值的短三元运算符将在创建对象的默认部分时执行此操作。OTR28资讯网——每日最新资讯28at.com

const colorCodes = { 'blue'   : '#2196F3', 'green'  : '#4CAF50', 'orange' : '#FF9800', 'pink'   : '#E91E63', 'default': '#F44336'};const setBackgroundColor = (colorName) => { document.body.style.backgroundColor = colorCodes[colorName]  ? colorCodes[colorName]  : colorCodes['default'];};

现在我们有了一个查找表,可以整齐地列出我们的输入和可能的输出。OTR28资讯网——每日最新资讯28at.com

这并不是奇迹般地减少了“代码行数”(LOC)(我们从 15 行减少到 20 行,再减少到 12 行)。事实上,其中一些解决方案可能会增加您的 LOC,但我们提高了可维护性、易读性,并且实际上通过仅对默认回退进行一次逻辑检查来降低复杂性。OTR28资讯网——每日最新资讯28at.com

数据的交易逻辑

在 if/else 或 switch 上使用查找表的最重要成就是我们将比较逻辑的多个实例转换为数据。代码更具表现力;它将逻辑显示为操作。代码更具可测试性;逻辑被减少了。而且我们的比较更容易维护;它们被合并为纯数据。OTR28资讯网——每日最新资讯28at.com

让我们将五个比较逻辑运算减少为一个,并将我们的值转换为数据。OTR28资讯网——每日最新资讯28at.com

场景:我们需要将成绩百分比转换为对应的字母成绩。OTR28资讯网——每日最新资讯28at.com

if/else 很简单;我们从上到下检查成绩是否高于或等于匹配字母成绩所需的成绩。OTR28资讯网——每日最新资讯28at.com

const getLetterGrade = (gradeAsPercent) => { if(gradeAsPercent >= 90) {  return "A"; } else if(gradeAsPercent >= 80) {  return "B"; } else if(gradeAsPercent >= 70) {  return "C"; } else if(gradeAsPercent >= 60) {  return "D"; } else {  return "F" };};

但我们一遍又一遍地重复相同的逻辑运算。OTR28资讯网——每日最新资讯28at.com

因此,让我们将数据提取到一个数组中(以保留顺序)并将每个等级的可能性表示为一个对象。现在我们只需对对象进行一次 >= 比较,并找到数组中第一个匹配的对象。OTR28资讯网——每日最新资讯28at.com

const gradeChart = [ {minpercent: 90, letter: 'A'}, {minpercent: 80, letter: 'B'}, {minpercent: 70, letter: 'C'}, {minpercent: 60, letter: 'D'}, {minpercent: 0,  letter: 'F'}];const getLetterGrade = (gradeAsPercent) => { const grade = gradeChart.find(  (grade) => gradeAsPercent >= grade.minpercent ); return grade.letter;};

开始将您的比较想象为数据

当你需要比较或“检查”数值时,很自然地会想到 if/else,这样你就可以用语言逐步解决问题。但下一次,请试着思考如何将您的值表示为数据,并通过简化逻辑来解释这些数据。OTR28资讯网——每日最新资讯28at.com

您的代码最终将变得更具可读性、可维护性和目的性,并且其所代表的概念清晰分离。OTR28资讯网——每日最新资讯28at.com


原文:https://dreith.com/blog/theres-such-a-thing-as-using-too-many-ifs/OTR28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-80517-0.html我们一起聊聊如何简化多个 if 的判断结构

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 深入理解Java虚拟机:堆详解

下一篇: []byte与string的两种转换方式和底层实现

标签:
  • 热门焦点
  • 6月iOS设备好评榜:第一蝉联榜首近一年

    作为安兔兔各种榜单里变化最小的那个,2023年6月的iOS好评榜和上个月相比没有任何排名上的变化,仅仅是部分设备好评率的下降,长年累月的用户评价和逐渐退出市场的老款机器让这
  • 6月安卓手机性价比榜:Note 12 Turbo断层式碾压

    6月份有一个618,虽然这是京东周年庆的日子,但别的电商也都不约而同的跟进了,反正促销没坏处,厂商和用户都能满意。618期间一些产品也出现了历史低价,那么各个价位段的产品性价比
  • 28个SpringBoot项目中常用注解,日常开发、求职面试不再懵圈

    前言在使用SpringBoot开发中或者在求职面试中都会使用到很多注解或者问到注解相关的知识。本文主要对一些常用的注解进行了总结,同时也会举出具体例子,供大家学习和参考。注解
  • Automa-通过连接块来自动化你的浏览器

    1、前言通过浏览器插件可实现自动化脚本的录制与编写,具有代表性的工具就是:Selenium IDE、Katalon Recorder,对于简单的业务来说可快速实现自动化的上手工作。Selenium IDEKat
  • K8S | Service服务发现

    一、背景在微服务架构中,这里以开发环境「Dev」为基础来描述,在K8S集群中通常会开放:路由网关、注册中心、配置中心等相关服务,可以被集群外部访问;图片对于测试「Tes」环境或者
  • 三言两语说透设计模式的艺术-单例模式

    写在前面单例模式是一种常用的软件设计模式,它所创建的对象只有一个实例,且该实例易于被外界访问。单例对象由于只有一个实例,所以它可以方便地被系统中的其他对象共享,从而减少
  • 联想小新Pad Pro 12.6将要推出,搭载高通骁龙 870 处理器

    联想小新Pad Pro 12.6将于秋季新品会上推出,官方按照惯例直接在发布会前给出了机型的所有参数。联想小新 Pad Pro 12.6 将搭载高通骁龙 870 处理器,重量为 5
  • 与兆芯合作 联想推出全新旗舰版笔记本电脑开天N7系列

    联想与兆芯合作推出全新联想旗舰版笔记本电脑开天 N7系列。这个系列采用兆芯KX-6640MA处理器平台,KX-6640MA 处理器是采用了陆家嘴架构,16nm 工艺,4 核 4 线
  • 利用职权私自解除被封帐号 Meta开除20多名员工

    11月18日消息,据外媒援引知情人士表示,过去一年时间内,Facebook母公司Meta解雇或处罚了20多名员工以及合同工,指控这些人通过内部系统以不当方式重置用户帐号,其
Top