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

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

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

多少算太多?

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

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

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

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

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

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

(condition) ? isTruthy : isFalsy

IF/ELSE 的替代方案

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

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

Switch  ?

现在我们可以更恰当地将其更改为 switch 语句。它更符合我们正在尝试做的事情的概念;我们有几种想要匹配的字符串情况,如果没有一种情况匹配,则有一个默认值。AiV28资讯网——每日最新资讯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 仍然带有大量我们可以不需要的样板文件和重复代码。AiV28资讯网——每日最新资讯28at.com

Lookup Table  查找表

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

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

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

数据的交易逻辑

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

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

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

if/else 很简单;我们从上到下检查成绩是否高于或等于匹配字母成绩所需的成绩。AiV28资讯网——每日最新资讯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" };};

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

因此,让我们将数据提取到一个数组中(以保留顺序)并将每个等级的可能性表示为一个对象。现在我们只需对对象进行一次 >= 比较,并找到数组中第一个匹配的对象。AiV28资讯网——每日最新资讯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,这样你就可以用语言逐步解决问题。但下一次,请试着思考如何将您的值表示为数据,并通过简化逻辑来解释这些数据。AiV28资讯网——每日最新资讯28at.com

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


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

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

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

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

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

标签:
  • 热门焦点
  • MIX Fold3包装盒泄露 新机本月登场

    小米的全新折叠屏旗舰MIX Fold3将于本月发布,近日该机的真机包装盒在网上泄露。从图上来看,新的MIX Fold3包装盒在外观设计方面延续了之前的方案,变化不大,这也是目前小米旗舰
  • 直屏旗舰来了 iQOO 12和K70 Pro同台竞技

    旗舰机基本上使用的都是双曲面屏幕,这就让很多喜欢直屏的爱好者在苦等一款直屏旗舰,这次,你们等到了。据博主数码闲聊站带来的最新爆料称,Redmi下代旗舰K70 Pro和iQOO 12两款手
  • 6月安卓手机性价比榜:Note 12 Turbo断层式碾压

    6月份有一个618,虽然这是京东周年庆的日子,但别的电商也都不约而同的跟进了,反正促销没坏处,厂商和用户都能满意。618期间一些产品也出现了历史低价,那么各个价位段的产品性价比
  • 小红书1周涨粉49W+,我总结了小白可以用的N条涨粉笔记

    作者:黄河懂运营一条性教育视频,被54万人“珍藏”是什么体验?最近,情感博主@公主是用鲜花做的,火了!仅仅凭借一条视频,光小红书就有超过128万人,为她疯狂点赞!更疯狂的是,这
  • 猿辅导与新东方的两种“归途”

    作者|卓心月 出品|零态LT(ID:LingTai_LT)如何成为一家伟大企业?答案一定是对“势”的把握,这其中最关键的当属对企业战略的制定,且能够站在未来看现在,即使这其中的
  • 华为HarmonyOS 4.0将于8月4日发布 或搭载AI大模型技术

    华为宣布HarmonyOS4.0将于8月4日正式发布。此前,华为已经针对开发者公布了HarmonyOS4.0,以便于开发者提前进行适配,也因此被曝光出了一些新系统的特性
  • 2纳米决战2025

    集微网报道 从三强争霸到四雄逐鹿,2nm的厮杀声已然隐约传来。无论是老牌劲旅台积电、三星,还是誓言重回先进制程领先地位的英特尔,甚至初成立不久的新
  • OPPO K11搭载长寿版100W超级闪充:26分钟充满100%

    据此前官方宣布,OPPO将于7月25日也就是今天下午14:30举办新品发布会,届时全新的OPPO K11将正式与大家见面,将主打旗舰影像,和同档位竞品相比,其最大的卖
  • Counterpoint :OPPO双旗舰战略全面落地 高端产品销量增长22%

    2023年6月30日,全球行业分析机构Counterpoint Research发布的《中国智能手机高端市场白皮书》显示,中国智能手机品牌正在寻求高质量发展,中国高端智能
Top