教妹学Java:求求你,别再问我为什么要 if-else 走天下了!因为。。。

2023-10-29 09:50

本文主要是介绍教妹学Java:求求你,别再问我为什么要 if-else 走天下了!因为。。。,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

CSDN 的同学们,大家好,我是二哥呀!

在某乎上看到一个接近万赞的高赞回答,一开始看的时候我嘴角是上扬的,还会笑出猪声,随后情绪就急转直下,莫名心酸!题目是这样的:

先来看一下匿名作者的回答,没看过的同学记得以泪洗面哈。

https://www.zhihu.com/question/300975864/answer/524059880

我曾经接手过一份代码,遇到过一个有 30 多个 if-else 嵌套 if-else 的模块。

心里骂骂咧咧,“谁他喵写的这玩意!”然后翻了一遍代码的 history。

大致情况是这样的:第一个程序员写下这段代码时,只有 2 个 if-else;后来需求逐渐增加,先是 1 个、2 个,然后量变引起质变,于是逻辑分支快速扩张。

到这时候已经没有人愿意去重构 switch 或者设计模式了,毕竟复杂度摆在那里,万一崩了还得背锅。

大概三四个程序员接手这段代码后,就编程我现在这种局面了。

第一个程序员绝对没有料到那么简单的逻辑在之后会变得这么复杂,甚至在增加第一个第二个 if-else 时,也只是很随意的加上。

所以我觉得,这锅绝对是甲方的,让他娘的随便改需求。这么一想心里就好受多了,编程嘛,最重要的是看得开!

于是我又追加了两条 if-else,然后测试、提交,下班。


插一句,如果真想重构代码,建议先看看小傅哥的《重学 Java 设计模式》,设计模式是软件设计中常见问题的典型解决方案,它们就像能根据需求进行调整的预制蓝图, 可用于解决代码中反复出现的设计问题,如果不懂设计模式的话,遇到这些问题就只能抓瞎了。

设计模式,牛逼!


看完了作者的回答,二哥强忍着无名的悲伤来说两句。

十多年的编程生涯里,的确有过无数次的冲动,想要把原有的代码重构,想要调优,最后大多数都无疾而终,尤其是随着年龄的增长,反而越来越胆小怕事,有些真的是不敢乱动,只能忍痛让原有的代码更烂一些。

毕竟背锅是大事,嘿嘿。

有时候,不能把代码当做是艺术品,要能够适度忍受不完美,程序能跑起来,bug 数量可控,有啥问题可以解决也是很重要的。

如果重构了,出了问题,自己背锅是注定的,可能还会连累了测试小姐姐。

记得在外企的第二年,由于组里面有个新人的代码写得实在是太烂,我就忍不住前前后后优化了一遍,毕竟作为 Team Leader,要对新人负责,要为团队负责,结果大家猜怎么样?

我被领导臭骂了一顿!

原因很简单,我特么引入了一个 Bug,Code Review 的时候还没有检查出来,测试也没有测试到,结果到了正式环境,刚巧碰到领导在日方出差,领导要给领导的领导展示成果,结果程序出了 bug,然后领导被狠狠地臭骂了一顿。

领导被批了,那自然一通越洋电话打过来,把我直接骂哭!

当时还年轻,那叫一个委屈啊。但能怎么办,自己的锅不背让谁背?

后来回洛阳后,团队规模变小,自己重构的欲望又涌上心头,毕竟这次没人能管得了我,看到谁写的代码烂,就直接一顿操作猛如虎,重构到自己心满意足为止。

即便是引入了新的 Bug 也没关系,毕竟老板也不懂,好忽悠,嘿嘿。

老板虽然不懂代码,但懂得写代码哪能没有 Bug——经过我的不懈努力,成功给老板灌输了这个思想,要想不出 Bug,就增加测试团队的人手,领导可不愿意多发一份工资。

成功洗脑老板后,我真的有一段时间是飘到了极点,狠起来连自己的代码都重构,一遍又一遍,手头最经常看的两本书,一本《代码的整洁之道》,一本《重构·改善既有代码的设计》。

从简单的变量命名、方法命名,到缩减方法的行数,能拆分就拆分,尽量保证每个方法的行数不超过一个小拇指那么长。为了适配设计模式,我当时还买了一本《设计模式之禅》,真的是殚精竭虑。

现在想想那段日子真疯狂,有时候为了修自己重构后带来的新 Bug,真的是熬了不少夜。

但有一说一,那段日子的进步也是肉眼可见的。

不过,话又说回来,对稳定性要求比较高的项目,如果能力没到那份上,还是尽量少重构,搞不好版本更新的日志里就会写下一条:XXX 程序员被祭天了!

最好是等到领导忍不住下了死命令,限尔等多少天之内,务必把这座屎山给搬走!到了那时候,再大展拳脚也不迟。

如果真的是安耐不住,一肚子的重构、调优想法无法得到施展,我给大家推荐一个好办法,就是自己搞一个练手项目,可以是自己开发的,也可以是 GitHub 上成熟的项目,比如说我一直推荐的 vhr、mall、miaosha 等等,把源码 fork 下然后拉下来,在本地跑一跑,尝试去读一读源码,觉得哪里需要重构了,就动手实践一遍,即便是出错了,也谁都影响不到,对吧?

有些同学如果觉得自己比较厉害的话,可以去拿那些顶级的第三方类库做实验,重构完一定要记得测试,并且在提交 PR 的时候附带上自己的测试报告,如果项目的作者认为你重构的有水平,没准你一跃就成为了项目的维护者,简历上也是加分项。

但对于公司的那堆屎山,动刀子的时候尽量猥琐点,免得把自己埋了。

再说回 if-else 和 switch 这个题目。朋友 @yes 在回答里提到过 Dubbo 源码中的 ChannelEventRunnable 类的 run() 方法,我用 Sourcegraph 插件看了一下 GitHub 上 Dubbo 的源码,还真的是挺有学习价值的。

public void run() {if (state == ChannelState.RECEIVED) {try {handler.received(channel, message);} catch (Exception e) { }} else {switch (state) {case CONNECTED:try {handler.connected(channel);} catch (Exception e) {}break;case DISCONNECTED:try {handler.disconnected(channel);} catch (Exception e) {}break;case SENT:try {handler.sent(channel, message);} catch (Exception e) { }break;case CAUGHT:try {handler.caught(channel, exception);} catch (Exception e) { }break;default:}}
}

看到没,这段代码里先用 if 做了判断,然后才在 else 中使用 switch 做了分支判断。为什么不全部使用 switch 呢?

官方还特意给了个说明。

我把其中关键的一点摘录出来,大家看一下就明白了。

现代 CPU 都支持分支预测(branch prediction)和指令流水线(instruction pipeline),这两个结合可以极大提高 CPU 效率。对于像简单的 if 跳转,CPU 是可以比较好地做分支预测的。但是对于 switch 跳转,CPU 则没有太多的办法。switch 本质上是根据索引,从地址数组里取地址再跳转的。

所以说,不是所有情况下,把 if-else 重构成 switch 就是最好的选择,还是要因地制宜,所以求求你,别再问我为什么要 if-else 走天下了!

这篇关于教妹学Java:求求你,别再问我为什么要 if-else 走天下了!因为。。。的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/299857

相关文章

springboot集成Lucene的详细指南

《springboot集成Lucene的详细指南》这篇文章主要为大家详细介绍了springboot集成Lucene的详细指南,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起... 目录添加依赖创建配置类创建实体类创建索引服务类创建搜索服务类创建控制器类使用示例以下是 Spring

Java调用Python的四种方法小结

《Java调用Python的四种方法小结》在现代开发中,结合不同编程语言的优势往往能达到事半功倍的效果,本文将详细介绍四种在Java中调用Python的方法,并推荐一种最常用且实用的方法,希望对大家有... 目录一、在Java类中直接执行python语句二、在Java中直接调用Python脚本三、使用Run

Java根据IP地址实现归属地获取

《Java根据IP地址实现归属地获取》Ip2region是一个离线IP地址定位库和IP定位数据管理框架,这篇文章主要为大家详细介绍了Java如何使用Ip2region实现根据IP地址获取归属地,感兴趣... 目录一、使用Ip2region离线获取1、Ip2region简介2、导包3、下编程载xdb文件4、J

浅析如何使用xstream实现javaBean与xml互转

《浅析如何使用xstream实现javaBean与xml互转》XStream是一个用于将Java对象与XML之间进行转换的库,它非常简单易用,下面将详细介绍如何使用XStream实现JavaBean与... 目录1. 引入依赖2. 定义 JavaBean3. JavaBean 转 XML4. XML 转 J

SpringBoot中四种AOP实战应用场景及代码实现

《SpringBoot中四种AOP实战应用场景及代码实现》面向切面编程(AOP)是Spring框架的核心功能之一,它通过预编译和运行期动态代理实现程序功能的统一维护,在SpringBoot应用中,AO... 目录引言场景一:日志记录与性能监控业务需求实现方案使用示例扩展:MDC实现请求跟踪场景二:权限控制与

Java NoClassDefFoundError运行时错误分析解决

《JavaNoClassDefFoundError运行时错误分析解决》在Java开发中,NoClassDefFoundError是一种常见的运行时错误,它通常表明Java虚拟机在尝试加载一个类时未能... 目录前言一、问题分析二、报错原因三、解决思路检查类路径配置检查依赖库检查类文件调试类加载器问题四、常见

Java注解之超越Javadoc的元数据利器详解

《Java注解之超越Javadoc的元数据利器详解》本文将深入探讨Java注解的定义、类型、内置注解、自定义注解、保留策略、实际应用场景及最佳实践,无论是初学者还是资深开发者,都能通过本文了解如何利用... 目录什么是注解?注解的类型内置注编程解自定义注解注解的保留策略实际用例最佳实践总结在 Java 编程

Java 实用工具类Spring 的 AnnotationUtils详解

《Java实用工具类Spring的AnnotationUtils详解》Spring框架提供了一个强大的注解工具类org.springframework.core.annotation.Annot... 目录前言一、AnnotationUtils 的常用方法二、常见应用场景三、与 JDK 原生注解 API 的

Java controller接口出入参时间序列化转换操作方法(两种)

《Javacontroller接口出入参时间序列化转换操作方法(两种)》:本文主要介绍Javacontroller接口出入参时间序列化转换操作方法,本文给大家列举两种简单方法,感兴趣的朋友一起看... 目录方式一、使用注解方式二、统一配置场景:在controller编写的接口,在前后端交互过程中一般都会涉及

Java中的StringBuilder之如何高效构建字符串

《Java中的StringBuilder之如何高效构建字符串》本文将深入浅出地介绍StringBuilder的使用方法、性能优势以及相关字符串处理技术,结合代码示例帮助读者更好地理解和应用,希望对大家... 目录关键点什么是 StringBuilder?为什么需要 StringBuilder?如何使用 St