优秀的代码最终选择if else,还是switch case

news2024/11/15 3:54:46

今天我们不讨论哪个写法读起来更优秀,不讨论对于性能而言哪个更完美,也不讨论哪种情况下对于判断语句是常量还是变量的选择,而是单纯从最简单的角度来看一下,为什么很多优秀的项目优秀的代码,最终选择了if else语句,而不是想当然的觉得必然是switch case语句。

目录

 一、需求场景描述

二、实现阶段一 

1.  对于鱼香肉丝的判断

2. 对于酸辣土豆丝的判断

3. 对于锅包肉的判断 

4. 各种各样的菜

三、不得不选择重构

四、持续迭代的需求

1. 菜品不断减少

2. 继续减少

3. 又只剩鱼香肉丝了

4. 一个case的改造 


 

 一、需求场景描述

今天只说一个最直白的场景,判断条件就是一个普通的变量,一个普普通通的字符串。例如你去一家餐厅吃饭,通过判断餐厅有没有你想吃的那道菜来决定你吃什么。

而这个项目历时N年,不止一个开发人员,所以下面我将会用小A 小B 小C 小D 来描述

二、实现阶段一 

1.  对于鱼香肉丝的判断

首先来了一个需求,要求如果餐厅有鱼香肉丝,那么就吃鱼香肉丝,这次由小A来开发

// 这里是一个变量,可能由服务端返回
var food = ''; 
if (food === '鱼香肉丝') {
    // todo 
    console.log('吃鱼香肉丝');
}

 由于最初之后一个判断,所以大多数开发者直接选择一个if else语句了事

2. 对于酸辣土豆丝的判断

过去一段时间了,这个项目代码一直没有碰,来了新需求,要求添加对于酸辣土豆丝的判断,这次还是小A来开发

// 这里是一个变量,可能由服务端返回
var food = ''; 
if (food === '鱼香肉丝') {
    // todo 
    console.log('吃鱼香肉丝');
} else if (food === '酸辣土豆丝') {
    console.log('吃酸辣土豆丝');
}

这个时候,一般人还是会选择继续追加else if 的判断,能简单追加一下就解决的问题,何必大费周章呢。

3. 对于锅包肉的判断 

可能又过了一段时间,又来了新需求,老板要求添加对于锅包肉的判断,而此时,小A已经离职了,新来了程序员小B

// 这里是一个变量,可能由服务端返回
var food = ''; 
if (food === '鱼香肉丝') {
    // todo 
    console.log('吃鱼香肉丝');
} else if (food === '酸辣土豆丝') {
    console.log('吃酸辣土豆丝');
} else if (food === '锅包肉') {
    console.log('吃锅包肉');
}    

如果你是小B,你接受了公司原来老旧的代码,遇到这个需求你会选择怎么做?明明知道这里需要重构一下,采用switch case语句了,但是迫于需求时间的压力,迫于线上正在跑着的需求的压力,你会怎么做? 

4. 各种各样的菜

假如又过去了几个月,甚至一年,我们这个food变量已经不至对于前面3个菜的判断了,而是又新添加了尖椒肉丝,水煮肉片,孜然羊肉,然后小B离职了,小C来了;

然后又是继续的家常豆腐,西红柿鸡蛋。。。。。。小鸡炖蘑菇,烤全羊,大鱼大虾,手抓饼呢?

如果你是小C,你会如何去维护这段代码?

 

三、不得不选择重构

可能这个时候,已经是小D负责开发了,小D觉得不得不重构这段难以维护的代码了,他决定采用switch的先进能力,以case为抓手,再不断梳理以往需求的基础上,评估了所需的工时,预定了可能会出现问题的场景,并且找到项目组进行立项,开始了轰轰烈烈的代码重构工作。

var foodNew = '';
switch(foodNew ) {
    case '鱼香肉丝':
        console.log('吃鱼香肉丝');
        break;
    case '酸辣土豆丝':
        console.log('吃酸辣土豆丝');
        break;
    case '西红柿炒鸡蛋':
        console.log('吃西红柿炒鸡蛋');
        break;
    ......
    ......
    ......
    default:
        console.log('喝自来水');
}

其实可以看出,这次重构为了弥补之前的不足,付出了相当大的代码,耗费人力财力,可能小D也因此而晋升了一下。

四、持续迭代的需求

1. 菜品不断减少

如果由于某种原因,比如疫情餐厅客流量减少,菜品备货必定减少,刚开始只是减少一些,我们将不需要再做荤菜类的判断,以及判断方法体内的代码,而这个时候已经是小E负责开发了,他选择了注释掉代码

2. 继续减少

可能需求又有所变动,最近新增了某一爱好的顾客,也就新增了一道水煮鱼,而其他菜品也逐渐减少。小E决定新branch一个分支,将之前的荤菜注释掉,将后来减少的菜品也注释掉,新增的继续加一个case来维护。

3. 又只剩鱼香肉丝了

还记得2015年,我们耗费了大量的成本,将代码重构为switch case,看上去代码可读性强了,有了一个崭新的开始,但一直到了2017年,负责开发的已经变为小H了,中间又经过了小F 小G的接手,代码已经又是乱糟糟了,而且到了这个时候,浩大的switch工程只剩下一个case,就像这样:

var foodNew = '';
switch(foodNew ) {
    case '鱼香肉丝':
        console.log('吃鱼香肉丝');
        break;
}

4. 一个case的改造 

如果某一天你需要出成绩,如果某一天你的PPT没有素材了,你一定要给自己找点事情干,而这个事情还要显得很亮眼,就比如说我们通过if else 的技术栈,通过将原来繁杂的逻辑进行调优,最终使线上代码更加稳健,可读性增强。于是有了这个样子:

var food = ''; 
var eatValue = (food === '鱼香肉丝') ? '吃鱼香肉丝': '西北风';
console.log(`吃${eatValue }`);

记住,没事做的时候,没有素材的时候,就搞重构,往项目里加一个图片也叫项目升级,加两个图片那叫持续性升级,改一行代码也叫项目重构,改两行代码那叫持续性重构,改一段那是颠覆性重构。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/188153.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

惠普Probook450G7电脑开机总是卡死蓝屏怎么重装系统?

惠普Probook450G7电脑开机总是卡死蓝屏怎么重装系统?有用户在使用惠普Probook450G7电脑的时候,电脑一开机的时候总是会卡死无法操作,然后就变成蓝屏了。那么遇到这个问题怎么去进行系统的重新安装呢?一起来看看重装系统的具体操作…

中国电子学会2021年06月份青少年软件编程Python等级考试试卷一级真题(含答案)

青少年软件编程(Python)等级考试试卷(一级) 分数:100.00 题数:37 一、单选题(共25题,每题2分,共50分) 1. 下列程序运行的结果是?&am…

python 环境安装

时隔 将近一年了, 我又重新追寻我的理想了。 趁着2023年刚到,先写一点 python 打个基础。 还是老样子,学到及输出,所以继续写文章。 本文章主要介绍 python 的环境搭建 和 输出 HelloWorld 用于测试搭试好的环境。 本专栏主要…

【ArcGIS微课1000例】0062:标准样式世界地图制作方法

本文基于世界行政区轮廓矢量数据,讲解标准地图的样式(形状)的世界矢量图制作方法。 文章目录 一、加载世界数据二、修改地图投影三、地图布局整饰一、加载世界数据 首先我们将世界行政数据(配套实验数据包中的0062.rar)加载到ArcMap,我们可以看到地图形状接近于矩形形状…

在线 OJ 项目(三) · 处理项目异常 · UUID · 校验代码的安全性 · 阶段性总结

一、处理异常二、区分不同请求的工作目录UUID对 Task 类进行重构三、校验代码的安全性四、阶段性总结书接上回,我们自己测试没问题,是因为使用了正常数据;万一用户输入的是非法的请求,该咋办? 我们需要处理异常请求&a…

内网服务器结合vxlan和iptables-snat实现内网服务器上网——筑梦之路

之前通过其他方式实现 CentOS搭建NAT和DHCP服务,实现共享上网_筑梦之路的博客-CSDN博客_vsphere 创建dhcp CentOS 7 firewalld实现共享上网和搭建本地yum仓库——筑梦之路_筑梦之路的博客-CSDN博客 如上图,有这样一种场景,我们经常遇到&…

【以音视频开发进阶指南为基础】音视频基础概念

一、数字音频 数字音频可以粗糙的理解为将本质是模拟信号的声音音频数字化,那么如何数字化呢,需要经过三个步骤:采样、量化和编码。 采样:将声音的振动信息转化为电信号,再对电信号进行放大处理得到声音的模拟信号&a…

POE交换机常见问题解答

POE交换机通过网线供电的方式为标准的POE终端设备供电,可以免去额外的电源布线,在为一些基于IP的终端(如IP电话机、无线局域网接入点AP、网络摄像机等)传输数据信号的同时,还能为此类设备提供直流供电的技术。POE技术能…

Windows10安装java环境

Windows10安装java环境 文章目录Windows10安装java环境下载解压配置下载 Java8 https://www.oracle.com/java/technologies/downloads/#java8-windows Java11 https://www.oracle.com/java/technologies/downloads/#java11-windows Java17 https://www.oracle.com/java/techno…

12.日期与时间

目录 一.Date类 1.1 什么是Date类 1.2 Date类的构造器和常用方法 1.2.1 常用构造器 1.2.2 常用方法 二.SimpleDateFormat 2.1 什么是SimpleDateFormat 2.2 SimpleDateFormat的作用 2.3 SimpleDateFormat的构造器和方法 2.3.1 构造器 2.3.2 方法 2.3.3 例子 2.4 Sim…

[论文笔记] XRP: In-Kernel Storage Functions with eBPF

XRP: In-Kernel Storage Functions with eBPF XRP: 利用 eBPF 的核内存储函数 [Paper] [Slides] [Code] OSDI’22 摘要 提出了 XRP, 一个允许应用程序从 NVMe 驱动程序中的 eBPF 钩子(hook)执行用户定义的存储函数(例如索引查找或聚合)的框架, 可以安全地绕过大部分内核的存…

中国电子学会2022年09月份青少年软件编程Python等级考试试卷一级真题(含答案)

分数:100 题数:37 测试时长:60min 一、单选题(共25题,共50分) 1.表达式len("学史明理增信 ,读史终生受益") > len(" reading history will benefit you ")的结果是?(…

vue3全局组件自动注册

前言:本文主要讲述vue3的全局公共组件的自动注册第一步:建文件需要在src/components 下创建一个文件夹用于存放封装的公共组件(这里我起名叫coms)需要在src/components 下创建一个js文件用于存放引入组件并注册(这里我…

前端经典面试500题【下】

面试 一、vue 说说vue动态权限绑定渲染列表&#xff08;权限列表渲染&#xff09; 首先请求服务器,获取当前用户的权限数据,比如请求 this.$http.get(“rights/list”); 获取到权限数据之后,在列表中使用v-if v-if-else的组合来展示不同的内容 <template><div>&…

JavaScript基础复盘3

流程控制 在一个程序执行的过程中&#xff0c;各条代码的执行顺序怼程序的结果是有直接影响的。很多时候我们药通过控制代码的执行顺序来实现我们药完成的功能。 简单理解&#xff1a;流程控制就是来控制我们的代码按照什么结构顺序来执行 JavaScript作为一门程序语言&#x…

JDBC-Mysql数据库连接池

传统数据库连接的弊端 一个java程序多个正常要开启多个mysql连接-正常开发中次数在1w次往上&#xff08;还可能有多个java程序-并发编程&#xff09;&#xff0c;但是如果很多歌连接的话&#xff0c;数据库可能就瘫痪了 测试一个程序连接5000次 抛出一个&#xff0c;太多连接的…

离校毕业生刚去新的陌生城市,需要提高警惕的几点

很多大学毕业生其实阅历还不是特别的多&#xff0c;从小在自己熟悉的环境长大&#xff0c;即便是读了大学&#xff0c;可能也是在自己熟悉的学校附近活动&#xff0c;同学们集体出去逛个街&#xff0c;放假了就回家了。 但一旦大学毕业要离校&#xff0c;可能你会去一个陌生的新…

论文笔记:Learning Disentangled Representations of Video with Missing Data

2020 Neurips 1 intro & abstract 视频表征的一个挑战是高维、动态、各个像素之间多模态分布 最近的一些研究通过探索视频的inductive bias&#xff0c;并将高维数据映射到低微数据中—>这种方法通过将视频的各帧分解成语义上有意义的因子&#xff0c;来获得视频的解耦…

Maven初级(二)

目录 四.第一个Maven项目&#xff08;手工制作&#xff09; 4.1 Maven工程目录结构 4.2 手工制作Maven项目的步骤 4.2.1 手工制作项目的目录结构或使用插件创建项目的目录结构 4.2.2 在项目的src同层目录下创建pom.xml文件 4.2.3 在cmd中使用Maven项目构建命令 四.第一个…

自动驾驶感知——物体检测与跟踪算法|4D毫米波雷达

文章目录1. 物体检测与跟踪算法1.1 DBSCAN1.2 卡尔曼滤波2. 毫米波雷达公开数据库的未来发展方向3. 4D毫米波雷达特点及发展趋势3.1 4D毫米波雷达特点3.1.1 FMCW雷达角度分辨率3.1.2 MIMO ( Multiple Input Multiple Output)技术3.2 4D毫米波雷达发展趋势3.2.1 芯片级联3.2.2 专…