这么用if-else,我差点被辞退!(代码片段)

小鹿动画学编程 小鹿动画学编程     2022-12-06     449

关键词:

记得去年 11 月份,刚入职的时候,领导把我分配到一个翻新老项目的项目组中。


当初,刚进入公司还是蛮激动的,看到这个有点年纪的老项目,打开编辑器,看了看代码,我差点忍不住哭了。


心里暗想,“这是哪位离职的老前辈写的代码,这口锅我真不想背”,功能模块没有任何注释,业务逻辑从头到尾写下来的,没有代码规范,看着这一堆老代码,我无从下手。


这时背后一个人,拍了拍我肩膀,我一下子缓过神来,原来是项目组的负责人。


鹿呀,我们这个老项目,在此基础上,要增加一个功能,这个功能就交给你去做了,项目快到上线了,今天尽快完成吧。然后把大体功能和我说了一通。


没办法,只能硬着头皮去搞,我找到了那个功能页面的代码,正开始屡屡业务逻辑,下面一个代码结构让我眼前一亮。


 1if(type == 'fn1')  // 功能1
 2  let a = 1;
 3  let arr = [];
 4  // 具体功能实现
 5  // ...
 6
 7else if(type == 'fn2') // 功能2
 8  // 具体功能实现
 9  // ...
10
11else if(type == 'fn3') // 功能3
12  // 具体功能实现
13  // ...
14
15else if(type == 'fn4') // 功能4
16  // 具体功能实现
17  // ...
18
19else if(type == 'fn5')  // 功能5
20  // 具体功能实现
21  // ...
22
23else if(type == 'fn6') // 功能6
24  // 具体功能实现
25  // ...
26
27else if(type == 'fn7')  // 功能7
28  // 具体功能实现
29  // ...
30
31else if(type == 'fn8') // 功能8
32  // 具体功能实现
33  // ...
34
35else
36  // 具体功能实现
37  // ...
38

哎呀我的妈呀,这一长串,看的我有点晕,这不是人们传说中的
if-else 调用侠客吗?


而且我又仔细看看了看每个 else if 内部功能代码实现,基本每个功能所有逻辑代码都堆砌在 else-if 中。


而且好像这些功能的实现并不是一个人完成的,而是经过了好几轮前辈的接手,每当增加一个需求,该项目开发者就增加一个 else-if,所以才有了今天我所看到的结果。


原本我也可以轻松增加个 else-if 就完成任务的,但我这个人有强迫症,不想再当一个 if-else 侠客了,好吧,开始写我的新功能。


写完之后的代码如下:

 1function readNewFile(file)
 2  // 具体功能封装
 3  // ...
 4
 5
 6const modelObj = 
 7  fn1(file)  // 功能1
 8    // ... 
 9  ,
10  fn2(file)  // 功能2
11    // ...
12  ,
13  fn3(file)  // 功能3
14    // ...
15  ,
16  readNewFile(file)  // 功能4
17    // 新增加的功能
18    // ...
19  ,
20
21  // 其他功能封装
22  // ...
23
24
25function main(type, file)
26  modelObj[type](file)
27

写完之后,我把代码提交给我的负责人看,看完之后,没错,你们看完可能也会问,你这不是没事给自己找事干嘛,明明可以增加一个 else-if 完事,你却额外增加了这么多代码?


没错,功能我实现了,代码多出了几乎一倍,反倒被要求重新改回原来的 else-if。鹿哥性格你们又不是不知道。我说,对不起,这是我的写代码习惯,正当我解释为什么要这样写的时候,负责人说,行了,先这样吧。


虽然心里有一万句不爽,但是我还是默默的转身离开了。


小结

这就是我刚刚实习的时候,碰到的第一件比较棘手的事情,我很理解负责人的心情,毕竟项目快速上线要紧,但是我认为给别人留条后路,就是给自己留条后路。


鹿哥,此话怎说,怎么感觉你话里有话。而且你还没有说为什么你要这么麻烦的去增加功能?


好吧,不卖关子了,其实这样的写法并不是我自己发明的,而是设计模式中的策略模式,可以说是老前辈在几十年的项目中总结出来,至于为什么这么写,肯定是有它的道理的。


我们先分析一下,上方原始代码的缺陷有哪些?

1、最明显的缺陷就是每个 else-if 中的代码有一堆实现功能的逻辑。一旦 else-if 出现问题,整个 else-if 中的其他功能全都不能用了。

2、如果增加一个功能,需要无限的叠加 else-if。


这两个看起来并没有什么毛病呀?别急,听我慢慢细说。


为什么把每个功能抽离成函数?因为像这种老项目,已经被很多前辈写过,项目很容易出现问题,一旦出现问题,很难定位代码,我们更不可能找到离职的员工询问具体哪出错误了。


如果我们单独抽离成函数,当该函数内部出现问题的时候,我们通过断点调试,可以直接定位问题出现在哪里。而不像以前在if-else 海洋里探索定位问题。


而且每个函数单独封装起来,因为遵循设计模式原则之一,单一功能原则。每个函数只能干一件事,每个功能都是独立分离的,这样尽最大可能实现功能函数之间的解耦。


有关第二点,为什么会设置一个对象映射,而不是继续增加 else-if?


这次我们增加一个功能,可能几年之后,客户需求有变,需要再增加一个功能,而增加功能的人换了,那么这个增加功能的人,不必担心原来的功能逻辑实现,只需要在这个对象中增加一个函数,在函数内部增加一个功能实现就 OK 了。


而且整体看起来,代码规范和整体的代码结构非常的清晰,不止于一旦出现问题,在修改过程中导致其他地方出现问题,从而影响项目的开发进度。


做完之后,我直接把我的代码扔给了我们公司的测试小姐姐,小姐姐对我笑了笑,咳咳,后来…


可想而知,测试小姐姐在测试的时候,不用再把整个 else-if 拿过来测试了,而是直接拿我写的功能函数,只测试增加的功能就完成了。


回到最初那句话,给别人留条后路,就是给自己留条后路。我给测试小姐姐留了一条后路,后来就… (你们懂得)


最后

这件事情,让我产生深刻的感悟。如果能用哲学中老子的“道”去阐述的话,将复杂的问题转化为最简单的哲学思想,然后直至事物的核心与本质。


老子同时将“道”称为“无”和“有”,“因为它没有形象,所以是“无”;因为它真实存在,所以是“有”。


那么实际开发项目中,项目最初的本质就是设计模式的运用,设计模式的核心思想就是「封装变化」。就是变与不变,变化的是扩展,不变的是稳定。变与不变又可相互转化。所谓有形化为无形,有法化为无法。


正所谓,道可道,非常道,名可名,非常名。玄之又玄,众妙之门也。



❤️ 你的三连是我最大的支持,拜谢!

我是小鹿,一个混迹在互联网的分享者,一个喜欢用「动画」分享技术的原创博主。


本文首发于原创公众号:「小鹿动画学编程」

一个三本混出来的一个幽默风趣的程序员,维护着一个既有技术又有温度的原创号,一直认为能把复杂的东西讲明白是一件很牛逼的事情。


被辞退时n+1的说法(代码片段)

“N+1”,指在这家公司工作了N年,赔偿N个月的上年平均工资,再加上1个月“代通知金”。N的上限时12;上年平均工资的上限是工作所在城市平均工资的三倍。StudyFrom知乎所以很明显能够算出来具体的金额。  查看详情

去小公司一定要慎重:上午拿offer,下午被辞退!(代码片段)

...出去大餐一顿。没想到啊,没想到……下午就收到被辞退的消息。 这种事以前我只能在电视里看到, 查看详情

问题解决:当-1>2一直被判定为true的时候,我差点崩溃(代码片段)

文章目录bug复现直达病灶返回值为size_t的函数float、double、int比大小其他bug复现完整代码我就不贴了,带了业务。贴个demo:intdemo(vector<int>vec,inti) while(i<vec.size()) cout<<(i<vec.size()); //这里endl都接不上 cout&l 查看详情

我,android开发,40岁熬到中层月薪15k+,突然接到被辞退消息,怎么办?(代码片段)

尽力做好一件事,实乃人生之首务。——富兰克林但是,如果你倾注半生精力去做的这件事情抛弃你了呢?明天和意外哪个先到?这是我在某乎上面看见的一个热门问题,来自一个走投无路的40岁中年男人的哭... 查看详情

我在公司项目上用了微前端,差点被开除(代码片段)

故事的开头从微前端的qiankun去年开始火的时候,我就注意到了,我们公司的Saas系统是可以用这个去解决UI、体验上的一些问题,以及让技术栈平滑过渡迁移,但是奈何时机不够成熟今年抓住了时机,感觉是时... 查看详情

鹅厂hr从大厂离职后,应聘到一家小厂。四天后被辞退...(代码片段)

👇👇关注后回复 “进群” ,拉你进程序员交流群👇👇来源丨蚂蚁大喇叭https://mp.weixin.qq.com/s/PjPE6yfkxMYgFi2YfrRk_g背景从鹅厂离职后,我应聘到一家软件开发公司,规模不大,七、八个公司加起来... 查看详情

新来个p7被辞退了,因为写代码从来不打日志……(代码片段)

👇👇关注后回复 “进群” ,拉你进程序员交流群👇👇作者丨了不起的程序员来源丨了不起的程序员(ID:great_developer)-作为一名新生代农民工的我,在对这一官方认证称号领旨谢恩的同时&... 查看详情

如何优雅的用策略模式,取代臃肿的if-else嵌套,看这篇就够了(代码片段)

...type))return"处理促销订单";returnnull;为什么非得写的这么臃肿?很多同事会说:“哎呀,没办法呀,业务催的紧,这样开发效率快省事”。的确是句大实话,很多时候业务方确实像催命鬼一样的让你赶工期,想快速实现功能... 查看详情

上午拿offer,下午被辞退(代码片段)

...出去大餐一顿。没想到啊,没想到……下午就收到被辞退的消息。这种事以前我只能在电视里看到,没想到竟然发生到粉丝的头上。我想这位粉丝的朋友心情应该比做过山车还刺激。这篇就和大家聊聊什么样的公司不能... 查看详情

上午拿offer,下午被辞退(代码片段)

...出去大餐一顿。没想到啊,没想到……下午就收到被辞退的消息。这种事以前我只能在电视里看到,没想到竟然发生到粉丝的头上。我想这位粉丝的朋友心情应该比做过山车还刺激。这篇就和大家聊聊什么样的公司不能... 查看详情

优化if-else的想法(代码片段)

在日常代码中,总是不能避开if-else,虽然它很好,可是需要至少三行代码,真的很丑,而且业务代码里,动辄十几个if-else,实在不方便代码阅读。所以我有一个不成熟的想法,在有限的业务范围内,用Dictionary<K,V>代替。首先... 查看详情

if-else深度优化:巧用状态变更枚举(代码片段)

If-else过多,代码不易读,后人也不敢轻易修改。个人觉得有如下几种优化方式,网上不胜枚举,可以自行百度,但是小编说的这个方法《if-else深度优化:巧用状态变更枚举》,网上例子不多。    业务场景:例如... 查看详情

if-else和三目运算符?:的对比(代码片段)

...判断语句,感觉判断条件或者两条支路语句复杂就本能地if-else。遇到一些数值,字符的按条件赋值输出,就感觉if-else与这些简短语句气质不符,于是就用了三目运算符,使代码更简洁舒服。那么为什么有了if-else还要用?:呢,... 查看详情

为了一个http请求问题,差点和ios干起来(代码片段)

本次斗殴事件起因全部归iOS,为啥这么说,http请求都不会发,瞎写的什么玩意(ps:他应该不会看到...)。在处理本次冲突中,意外发现了另外一个存在已久的bug,我们先说说这个玩意,再说我们之间的恩怨。因为这是息息相关... 查看详情

线上慎用bigdecimal,坑的差点被开了.....(代码片段)

点击关注公众号,实用技术文章及时了解一、BigDecimal概述Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数,但在实际应用中,可能需要... 查看详情

写js逻辑判断,不要只知道用if-else和switch(代码片段)

原文:写JS逻辑判断,不要只知道用if-else和switch我们在编写JS代码时,经常会遇到逻辑判断复杂的情况。一般情况下,可以用if/else或switch来实现多个条件判断,但会出现一个问题:随着逻辑复杂度的增加,代码中的if/else和switch会... 查看详情

写js逻辑判断,不要只知道用if-else和switch(代码片段)

原文:写JS逻辑判断,不要只知道用if-else和switch我们在编写JS代码时,经常会遇到逻辑判断复杂的情况。一般情况下,可以用if/else或switch来实现多个条件判断,但会出现一个问题:随着逻辑复杂度的增加,代码中的if/else和switch会... 查看详情

if-else案例–开关灯(代码片段)

首先,在创建一个html页面,创建一个div盒子,用css设置相应的样式,用js获取盒子的元素,通过点击事件,设置body的背景颜色,用if..else来判断当什么状态设置相应的颜色,(swith...case同理) break:跳出当前循环continue:结束本... 查看详情