首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

抓狂!一天掉到同一个坑里两次,亲身体验,复制粘贴代码真的不好吗?

说个让我抓狂的事情,给大家乐呵一下。

早上,我在调试一个问题,代码改了以后,怎么都不生效!我刚要抓狂,发现改错地方了!

晚上,我在调试另外一个问题,代码改了以后,怎么都不生效!这下我真的抓狂了,发现改错地方了!

一天掉到两个坑里两次!

复制粘贴代码的好处

一天让我两次抓狂的原因是:复制代码!!

我在开发一个功能,挺复杂的,这里不方便共享代码,咱们就聊聊设计思路。

我们假设任务是要生成一份很复杂的报告,比如这样:

Report 1

这时候忽然冒出另外一个需求来,生成一个类似的报告,数据基本一样,但是样子上差别还有大点。相似度大概80%吧。

你说怎么办吧?有这么几个办法:

修改这个页面,添加很多if..else,让它能够同时支持新老两种报告样式。

把页面复制一份,简单粗暴地修改成新的报表的要求。

对页面进行比较大的重构,让它能够优雅地支持两种报告样式。

我采用了第一种办法。原因如下:

这种方法最安全,肯定不会影响原来的报告。毕竟原来的报告也是很重要的。

这种方法最快,不用考虑原来的报告,想怎么改就怎么改。

事实也是如此,比较顺利的改完了,顺利实现了新报告,老报告也完全没问题。

于是,现在有了两个比较相似的代码文件:

report

report_new

复制粘贴代码的坏处

过了一会儿,有个小的需求变动。

于是我打开文件,一顿操作,就是改不好。为什么改动后不起作用呢?

后来一看:

我改错文件了,我改的是report,不是report_new!!!

同样的错误,我晚上又犯了一次。两次加起来大概浪费了我一个小时。

你可能会觉得:

怎么会犯这种错误呢?但这就是事实。

作为一个旁观者,可以看地比较清楚,但当自己深陷其中的时候,是会犯很多低级错误,瞎眼错误等等。

这就是复制粘贴代码带来的恶果!

到底是否应该复制粘贴?

我复制粘贴代码错了吗?未必!

再来看看前面说的3个办法:

修改这个页面,添加很多if..else,让它能够同时支持新老两种报告样式。

把页面复制一份,简单粗暴地修改成新的报表的要求。

对页面进行比较大的重构,让它能够优雅地支持两种报告样式。

选择2是为了最高效和安全地完成任务,但也遗留了代码重复的问题,可以说是留下了技术债务

但是1和2相比,真的未必更好:

一方面很有可能把老的报告修改坏。

以后的维护也会变得更复杂。不管是修改老报告还是新报告,都可能会把对方改坏。

虽然作为程序员,很多人都在强调:

避免重复代码。我们可以使用继承,或者组合,以及一些相关的设计模式。

但我想提醒新手们一个相反的点:

如果两处代码只是看起来相似,需求并不相同,并且以后可能会各自发生变动。在你没有想好如何抽象之前,也许重复一份代码是更好的选择。

大型的公司到处都存在重复建设的现象,小到相似的代码,中到相似的功能模块,大到相似的系统,比比皆是。

不是他们技术水平不够,也不是他们不想重用。其中要考虑的东西还挺多的。

但是技术债总归要还的,所以大厂们都在做中台或者类似的架构,也是为了加强重用。

回到我们今天很小的例子。如果时间够用,也许第3个办法是最好的选择。具体来说:

对两份报告做抽象,在主文件中提炼出相同的框架流程,避免if..else。

然后把不同的部分分别做成组件,组件放在独立的文件中。

这样虽然还是在一定程度上互相影响,但由于各自的修改大部分都在组件中,而组件的修改肯定不会影响另一份报告。可以说在维护性和稳定性上都比较好。

明白了吗?如果喜欢,记得点赞!

我是程序员麦叔,聊程序员的故事

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20220504A01N4200?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券