为什么代码的"复制和粘贴"很危险?

Yig*_* Wu 129 copy-paste dry

有时,我的老板会向我们抱怨:

为什么我们需要这么长的时间来实现一个功能?

实际上,该功能之前已经在另一个应用程序中实现,您只需要从那里复制和粘贴代码.成本应该很低.

这真的是一个难题,因为在我看来,复制和粘贴代码并不是一件简单的事情.

你有什么理由向你的非技术老板解释这个吗?

Ode*_*ded 169

如果您在复制粘贴代码中发现错误,则需要在每个地方修复它,并希望您能够记住它们(这也适用于更改的要求).

如果将逻辑保存在一个位置,则在需要时更容易更改(因此,如果您确定应用程序需要更新,则只能在一个位置进行更改).

让你的老板阅读干燥原则(不要重复自己).

您所描述的内容听起来像是图书馆的完美用途,您可以在这里共享代码并将其保存在一个地方.

如果我打算稍后重构代码,我只会复制粘贴代码- 确保我稍后提取公共代码,以便尽可能多地重用逻辑.不久之后,我的意思是分钟和小时后,而不是几天和几周.

  • +1.重点是复制和粘贴对于解决当前问题来说是便宜的.真正的问题是,从中期/长期来看,维护重复代码的成本远远高于良好的代码 (40认同)
  • 这不仅仅是一个bug问题; 程序要求可以改变.我已经改变了五个中有四个需要改变的地方. (7认同)
  • 那里有很多`ifs`,而且大多数工具此时都不支持克隆检测. (4认同)
  • 曾几何时,有一个为[ESA](http://esa.int)工作的程序员。他当时正在为Ariane-5火箭开发软件,并且使用了复制粘贴方法。然后[发生...](http://en.wikipedia.org/wiki/Cluster_(spacecraft)#Arithmetic_Overflow) (2认同)

CRe*_*lts 25

通过构建库而不是使用复制和粘贴复制代码,您可以更好地共享代码.

你仍然可以获得速度优势而不是重写(查找DRY),但只有一个位置来维护代码.


Kil*_*oth 12

显而易见的原因是你为未来承担了"债务":你需要在代码中做出的任何改变(不只是错误修正,任何改变)现在都要贵两倍,因为你必须更新两个地方 - 而且风险更大,因为你最终会忘记其中一个.换句话说,现在让它更快地工作将使你的工作在未来更慢,这可能是良好的商业意识,但通常不是.

但更重要的原因是"这与此相同"的假设往往不是微妙的错误.每当您的代码依赖于未说出的假设是正确的时,将其复制到另一个地方会导致错误,除非这些假设也适用于新的地方.因此,粘贴的代码从一开始就经常是错误的,而不是在下一次更改之后.


Ziv*_*Ziv 11

设计方面,复制粘贴代码肯定是一场灾难,未来可能会导致许多问题.但是你问为什么你花了很多工作,现在,答案是:因为它从来就不仅仅是复制和粘贴.

如果原始代码是为了重用而编写的,作为一个相当独立的库,考虑到灵活性和客户端使用 - 那么很好,但这不是复制粘贴,而是使用代码库.真正的代码复制粘贴通常更像是这样:

  • "当然,我已经有了完全符合要求的代码!"
  • "等等,这五个版本的代码中哪一个是我想用作源代码的?"
  • "嗯,所有这些'util_func_023'函数做了什么?我没有记录它们吗?我现在需要它们中的哪一个?"
  • "哦,是的,这段代码使用Code Base Y.猜猜我需要[ 选择一个:将所有Code Base Y复制到我的新项目中/花一天时间从Code Base Y中解放出我想要的一个功能/花一周时间解除我希望从Code Base Y中获得一个功能."
  • "我复制了一切,耶!"
  • "为什么这不起作用?"
  • 这就是您花费数小时/数天/周来调试与您想要的类似的现有代码,而不是编写您真正想要开始的代码.

总之,不能直接使用的现有代码最多可以作为编写类似代码的良好参考.它当然不能被提升整体,并期望在一个完全不同的系统中工作.一般来说,一个安全的假设是,任何已编写和完成的代码都应该尽可能少地混淆 - 即使它是副本而不是原始本身.

如果您希望将项目建立在复制粘贴的基础上,那么您必须以一种能够轻松重用的方式开始编写代码,而无需复制原始代码并搞乱它.这是值得做的,如果那是你老板的期望,那么你们都需要确保这就是你设计和工作的方式.


Ste*_*ini 9

复制和粘贴是一场等待发生的灾难.您的老板应该尽早评估运输价格,以及很快将代码发送到最终用户的价格.


Bri*_*sen 9

如果您已经实现了这些功能,并且需要复制并粘贴以重复使用它们,那么听起来您做错了.你不能把这些功能放在一个库中,这样你可以重复使用它们而无需复制/粘贴吗?


Gau*_*ier 8

DRY原则(不要重复自己): 在维基百科上干.

"每一段知识都必须在系统中具有单一,明确,权威的表现形式."

其他链接.


Mar*_*tin 7

听起来像你的非技术老板最糟糕的误解是,你的工作主要是打字.他们认为你可以通过消除打字来节省大量时间.

我认为你能给这个人的最好的教育就是指出你所做的所有不打字的工作.即使大部分工作通常都是无形的,在你的头脑中,在打字的同时.

当然,消除打字会节省一些时间.但是,随着时间的推移,更大,不打字的部分工作变得越来越大,并且随时节省开支.