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

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

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

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

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

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

 1if(type == 'fn1'){  // 功能12  let a = 1;3  let arr = [];4  // 具体功能实现5  // ...67}else if(type == 'fn2'){ // 功能28  // 具体功能实现9  // ...
10
11}else if(type == 'fn3'){ // 功能3
12  // 具体功能实现
13  // ...
14
15}else if(type == 'fn4'){ // 功能4
16  // 具体功能实现
17  // ...
18
19}else if(type == 'fn5'){  // 功能5
20  // 具体功能实现
21  // ...
22
23}else if(type == 'fn6'){ // 功能6
24  // 具体功能实现
25  // ...
26
27}else if(type == 'fn7'){  // 功能7
28  // 具体功能实现
29  // ...
30
31}else if(type == 'fn8'){ // 功能8
32  // 具体功能实现
33  // ...
34
35}else{
36  // 具体功能实现
37  // ...
38}
哎呀我的妈呀,这一长串,看的我有点晕,这不是人们传说中的
 if-else 调用侠客吗?

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

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

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

写完之后的代码如下:

 1function readNewFile(file){2  // 具体功能封装3  // ...4}56const modelObj = {7  fn1(file){  // 功能18    // ... 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 拿过来测试了,而是直接拿我写的功能函数,只测试增加的功能就完成了。

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

最后

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

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

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

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

《javascript 设计模式核心原理与应用实战》

《设计模式》

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

这么用 if-else,小鹿差点被辞退!相关推荐

  1. 这么用 if-else,我差点被辞退!

    记得去年 11 月份,刚入职的时候,领导把我分配到一个翻新老项目的项目组中. 当初,刚进入公司还是蛮激动的,看到这个有点年纪的老项目,打开编辑器,看了看代码,我差点忍不住哭了. 心里暗想," ...

  2. 秒杀商品超卖了,差点被辞退...

    「 关注"石杉的架构笔记",大厂架构经验倾囊相授 」  儒猿技术团队最新出品 <基于ShardingSphere的分库分表实战> 文章来源:[公众号:微观技术] 随着中 ...

  3. webpack打包路径更改_扫盲: Webpack 从扫盲到手撸(上)

    鹿哥,作为前端初学者,能不能给扫盲一下 webpack,毕竟这东西在学校项目中用到的少,还是特别想了解一下的. 说起 webpack,小鹿会专门出一个系列,从简单的扫盲到手撸,这是一个过程,只要能踏实 ...

  4. 你真的会给领导发微信吗?三发三不发,不懂这6招,必被敲打

    微信,已经成为最为普及的即时通讯工具.我们在生活和工作中,大量应用微信沟通.但是,你真的会给领导发微信吗?前不久,出了几件芝麻绿豆大的"糗事": 比如,某员工回复领导"嗯 ...

  5. 差点死掉3次,被兄弟骗进传销组织,北漂反转... | 人生如戏,全靠运气!

    有人说"人生如戏,全靠演技",我个人觉得"人生如戏,全靠运气". 1 小时候活了下来 最近回想起来,自己一路走来能有这样的成绩,除过个人努力之外,也有非常大的运 ...

  6. 40岁好不容易熬到中层月薪15000,才被辞退,是你的福气

    前几天浏览某乎,然后推送了我一条信息: 中年了40岁,公司里熬到中层月薪15000,突然接到被辞退消息,应该怎么办? 然后我回答了一句:40岁还不被辞退?真是你的福气,过了35岁很多公司都不要了,所以 ...

  7. 身限辞退风波,Google AI 掌门人 Jeff Dean 不误折桂 IEEE 冯诺依曼奖

    [CSDN 编者按]在 AI 圈,除了平常说的"人工智障","机器学习不学习"之类的,就数 Jeff Dean 的段子流传最多最广了.像什么"编译器从 ...

  8. 微信的Bug差点让我被老板炒鱿鱼!

    作者 | 屠敏 转载自CSDN(ID:CSDNnews) 1 月 24 日上午 10:30 左右,10 亿用户量的国民应用微信疑似出现大 Bug.据网友反馈,自己一直使用的微信号突然显示被删除,登也登 ...

  9. 一个Bug能有多大影响:亏损30亿、致6人死亡、甚至差点毁灭世界...

    欢迎关注方志朋的博客,回复"666"获面试宝典 作者:博雯   来源:量子位(QbitAI) 一个Bug就地蒸发5亿美元: 软件设计层面出Bug致6人死亡: DeBug不成功直接世 ...

  10. 程序员被公司辞退12天,领导要求回公司讲代码

    以下文章来源方志朋的博客,回复"666"获面试宝典 首发:顶级程序员 在大部分情况下,如果一个员工已经离职了,那么与原来公司是没有任何关系.而员工在离职前,只需要做的一件事就是把工 ...

最新文章

  1. 老赵的自然数分解——少侠之对象解
  2. php allowoverride,Apache之AllowOverride参数详解
  3. 【OpenSSL】OpenSSL之SHA
  4. 5d4的白平衡模式_佳能5D4/5D3/6D2系列中高端单反相机和全画幅微单EOS R专题系列课程...
  5. 一些最近发现的小问题
  6. 微信小程序开发学习笔记001--认识微信小程序,第一个微信小程序
  7. linux不同内核驱动移植问题,基于tiny4412的Linux内核移植 -- MMA7660驱动移植(九-2)...
  8. 数据结构和算法——八种常用的排序算法----交换排序(冒泡排序和快速排序)
  9. 【Postgresql】pg截取第一个和最后一个字符
  10. python八皇后问题递归算法_八皇后问题--递归回溯算法(Python实现)
  11. EXCEL 快捷键集合
  12. 原始股的股份怎么进行分红
  13. A记录和CNAME记录有什么区别?
  14. document.getElementsByTagName()返回值
  15. udp2raw android,关于udpspeeder和udp2raw部署的一些补充,及使用体会
  16. Scalar Evolution
  17. QQ登录php无限制,PHP实现QQ登录实例代码
  18. electron应用通过web页面按钮唤醒
  19. 数码管显示电路的设计
  20. 大家来学 VIM [一]

热门文章

  1. electron-builder打包后没生成latest.yml文件问题
  2. Mysql 实现行转列功能
  3. iOS UITextView 光标位置
  4. Could not find goal ‘assembly‘ in plugin org.apache.maven.plugins:maven-assembly-plugin: among avai
  5. 股市崩盘时,手中的股票期权 option 是如何让你倾家荡产的
  6. DevOps工具图谱分析(一)
  7. 前端项目性能优化方案有哪些
  8. 片刻之后我们就找到了计算机教室英语翻译,全新版大学英语综合教程2课文原文翻译...
  9. GDrive is here
  10. 2020ccf大学生计算机系统,云南大学学生获得2019CCF大学生计算机系统与程序设计竞赛西...