大多数程序员会复制并粘贴代码吗?[关闭]


48

我很早就了解到,从长远来看,剪切和粘贴别人的代码需要花费更长的时间来编写自己的代码。在我看来,除非您真正理解它,否则剪切和粘贴代码可能会遇到解决噩梦的问题。

不要误会我的意思,我的意思是找到其他人的代码并从中学习是必不可少的,但我们不仅将其粘贴到我们的应用中。我们重写概念进入我们的应用程序。

但是我一直在听到有人剪切和粘贴的消息,他们谈论这就像是通常的做法。我还看到其他人的评论,这表明这是普遍的做法。

那么,大多数程序员会剪切并粘贴代码吗?


10
即使我知道如何做,我还是经常会搜索代码示例以获取最佳实践。阅读代码后,您可以快速判断出发现的内容是否比计划好。
妮可

最近有一个关于剪切和粘贴的问题。你为什么不检查呢
2011年

如果我理解的话。
约翰尼2014年

Answers:


46

两种一般情况:

从一个项目到另一个:

大多数程序员都以这种方式剪切和粘贴代码。他们可能会在网上找到先前的项目或其他内容,然后精确地复制/粘贴或复制/粘贴并对其进行更改。我认为这种做法通常很好。经过验证的代码尤其有用。(示例:过去的项目运行良好的某种实用程序对象,或者可能来自博客而只需要很少的更改)。可能不好的地方是复制不理解的代码时,或者代码不好的地方,或者比粘贴的代码有更好的替代解决方案的地方。

在同一个项目中:在同一个项目中 复制和粘贴通常不是一个好主意。这是一种难闻的气味,正在复制的代码应该只在某个方法/类中的某个位置并被重复调用。对此有一些例外,但是程序员通常应该考虑:“ 是否有一种方法可以参数化正在复制的代码? ”。


5
通常,这是正确的,除非您正在编写需要反模式的代码,例如防篡改代码(例如软件许可)就是这种情况。
罗伯·珀金斯

+1是的,我已经完成了这两项工作。我已经很长时间没有在同一个项目中完成过剪切和粘贴的代码了(尽管我承认很少会在极端的压力下用日志错误来恢复代码)。至于实用程序类,我的项目到项目复制现在被隔离为复制完整文件。
John MacIntyre'1

2
在编写数据库代码时,我通常将其中一些剪切并粘贴到新函数中,并修改sql本身以获得所需的结果,而不必担心重新键入进行数据库调用的一些先决条件。尽管总的来说,我同意这两种说法。
克里斯,

1
@Chris:复制和修改它的核心与直接粘贴它有很大不同。
罗伦·佩希特尔

1
@Loren Pechtel:尽管如此,它仍然涉及复制和粘贴代码的行为。
克里斯,

37

大多数程序员都这样做,但这并不意味着您应该

我的编程口头禅之一是:“如果我复制和粘贴代码,那我做错了事”。本质上是DRY

我认为显而易见,代码重用意味着将代码用作资源,而不是重复代码。有时我会复制并粘贴自己的代码,在大多数情况下,我会以样板代码或看起来非常相似的内容结尾。

在花了更多时间使用该代码之后,我得到以下结果:

  • 一个组成部分(另请参见:关注点分离
  • 我可以借助反思来使事情变得更简单,更清洁,将来更容易重复使用。
  • 一个更好的设计,因为即使它起作用了,为什么在您吸取了教训后又不重新做一遍呢?
  • 我可以抽象一个模式,变成一个库组件,并删除重复的代码。

我们是否应该复制和粘贴代码是有争议的,因为客户端/老板不在乎(至少直接和短期内),您可能会得到相同的结果,但是问题确实出在当它导致错误,模块化的丧失,并最终导致维护麻烦。

您应该做什么:尽快重构

没有人会编写完美的代码,即使它可以工作,即使您没有复制和粘贴并且它是您自己的代码,如果您对此不太满意,也只需在注释中添加注释(例如docblock“ @todo”)以提醒您您自己应该重构什么以及为什么……即使您自己不重构它,也可能成为维护者感到幸福与完全沮丧之间的区别。

最终,即使复制和粘贴,您最终也将获得良好的代码

好代码

通过XKCD


15
我经常看到“稍后重构”变成“从不重构”,甚至更糟的是,“其他一些SUCKER可以重构并修复我几乎不怎么好的代码,我真是太热了”。我坚信可以马上做,否则明天就一样-永远不会实现。
quick_now 2011年

1
@quickly_now-回复:“我真是太棒了,其他一些SUCKER可以重构并修复我几乎但不是很好的代码”……我无法向您表达我多么讨厌那些混蛋。
约翰·麦金太尔

嗨,约翰。我听到你了 我一辈子都在做那个傻瓜……付出了一半的钱,流汗了直到午夜,才对发生的事情有了一个很好的了解(并重新编写了大量的废话代码),而当时的热火还在继续其他的东西。叹。
quick_now 2011年

1
据我所知,团队中的人员越多,“以后重构”就越成为“永不重构”:/
wildpeaks

8

当我陷入困境并寻找可以解决我的问题的东西,并且遇到一些有用的代码片段时,我自然就会复制它。有时只是它的要旨。然后,我根据自己的需要对其进行更改。当我深入研究自己不擅长的事情时(当前是Objective-C),这种情况会经常发生。

我总是花时间从代码中学习一些东西,因此对我来说,这是学习和避免重新发明轮子的好方法。


4
我一直说“好的开发者就是懒惰的开发者”。如果有人已经做过,我不会重新发明轮子。但是我要保持小规模...我永远不会复制多行代码,也不会复制任何我不完全理解的东西。
morganpdx 2011年

我全心向他人学习,但是,除非您正在寻找一个特定的问题,否则您不会发现,只是将头放在其他人所做的事情上会比从头开始做更多的时间吗?(请注意,我在说的是“代码”,而不是类的完整功能单元……)
John MacIntyre

@John MacIntyre可以,但是通常当我弹出一些小代码片段时,我会对其进行模版,直到对它满意为止。无论如何,通常都需要对其进行改编(将其改编为功能,更通用,改进,优化等)。
Martin Wickman

@John:代码片段提供了一些片段,向您展示了如何做事。当然,剪切粘贴。但是就像马丁指出的那样-学习该代码在做什么。您将花费更多的时间来搜索您不知道其名称的特定方法。当你不知道一个词是什么意思时;您在字典中查找它。定义是100%清晰的;但是您多久查看一次使用示例?代码示例就像字典用法示例一样。MSDN并不总是包含使用样本,或者经常是不完整的。
IAbstract

6

我将在这里谈论复制/粘贴其他人的代码。从我的个人资料库中抓取部分自己的作品是公平的游戏。我了解它们并按定义理解它们。

我发现,“剪切和粘贴”代码的最常见情况是遇到特殊问题时,我遇到了解决该问题的博客文章。多数情况下,我将解决方案重新输入到项目中(毕竟,如果没有别的话,它可能是以博客作者的风格编写的)。这并不是我的代码,但是我在那种情况下使用它并不感到不好。

我不了解如何获取整个方法或系统以将其按原样粘贴到我的项目中并称其完成。前几天在StackOverflow上有一个问题,完美地说明了这样做的问题。

用不同的代码部分拼凑出科学怪人的怪物就不可能那么高效。我的意思是,如果您擅长于此,则意味着您要一遍又一遍地复制相同的解决方案,或者您已经充分了解了其他人的代码,因此不再需要相同级别的复制/粘贴。通过不必解决不兼容的代码示例之间的问题,可以提高生产率。

我个人没有遇到很多大规模复制/粘贴的程序员。我见过很多将自己编码到最深和最黑暗的角落的人,但这是另一回事。根据我的个人资料,我会说大多数程序员不会一起复制/粘贴整个应用程序,但是确实很难确定。


1
也许许多程序员不会大规模复制/粘贴实际代码,但是他们会很乐意利用现成的库(免费或其他方式)而无需查看任何一行代码...
hplbsh 2011年

1
@Stuart是的,但我认为区别在于该库不会被称为程序员自己的工作。老实说,只要该库能够正常工作并满足我的需要,我也不在乎它的来源。(假设对图书馆的信誉度/可靠性首先进行了尽职调查。)
亚当·李尔

从某种意义上说,这对发行商和消费者
都有意义

@stuart-在本次讨论中,我不会包括一个库,因为它是一个内聚单元……如果您理解我的意思,并不是真正的“失败”代码。
约翰·麦金太尔

实际上,在考虑您的评论时,老实说,我想知道程序员是否有可能将完整的系统剪切并粘贴在一起。我认为他们的傲慢情绪很快就会雪崩,使他们的发展停滞不前。
约翰·麦金太尔

4

不好:一遍又一遍地复制和粘贴相同的代码块

如果您发现自己正在执行此操作,则可能应该花一点时间考虑可以从正在复制的代码中抽象出什么,并创建一个函数/方法来对其进行处理。这就是DRY(请勿重复)原则的重要性。

良好:复制已知有效的代码块

DRY(不要重复自己)在这里也适用,只是意义不同。IE,不要重复您过去已经完成的工作。如果您花时间编写了一段代码,请对其进行调试,测试,并证明它可以在生产代码库中使用;您会很笨拙,不要重复使用它。

大多数人会给复制粘贴带来不好的说唱,因为许多初学者程序员花时间在网上搜索和复制/粘贴其他人的代码,却不了解它的实际作用。

每次都从头开始编写所有内容并没有任何好处。我知道有很多老派的纯粹主义者,所有东西都应该从头开始编写,我希望我不会被他们束缚。如果您有5年的编程经验,则应该拥有一个相当丰富的代码库,可以重复使用。它是经验丰富的程序员可以带到餐桌上的最好的资产之一,因为它可以节省大量的开发时间。

如果您一开始对旧代码不了解,请花一点时间阅读注释并重新熟悉自己。如果您的评论很糟糕……那完全是另一个问题。


除了复制和粘贴代码外,完全有可能以可重用的方式编写代码。然后使用它代替复制和粘贴它。
比约恩

1
@BjornTipling是的,通常最好将代码分解为可重用的函数,除非该过程增加了复杂性并且代码永远不会被重用
Evan Plaice

如果要复制和粘贴,则在重用。我同意人们应该用脑袋,条件可以保证。我发现自己在编写测试时进行复制和粘贴,但是即使在那儿,我也尝试创建可重用的函数,但是然后有两到三行几乎是相同的,但是我不能将其概括化为足以可重用的功能。
比约恩

3

经过25年的编写代码,有些时候(无法访问我为前雇主编写的代码)我希望可以剪切和粘贴。但是,这种情况很少见(并继续阅读)。

最好的例子也许是我几年前为unix操作系统设计的一个非常简单的命令行解析器。一个简单的循环遍历args并处理选项。它非常简单而优雅,从那以后,我已经多次使用它(更多地用作一种模式,而不是文字上的剪切和粘贴)。这是例外,而不是规则。

通常,简单的ole剪切和粘贴是完全不适当的-它更重要的是剪切和粘贴概念或算法。

我不太自豪-我会很乐意四处搜索以找到一种非常快速的奇偶校验或海明码验证算法或类似的东西。然后花几个小时了解它,看看它是否真的是我所追求的超快速度,还是天真烂漫的垃圾。

我担心每当有人只是复制代码而不暂停理解它的时候。他们要么是个天才(一眼就理解了它的所有精妙之处),要么是个傻瓜。两者之间没有太多空间。哦,也没有很多真正的天才。

如果不了解,您真的不知道在快乐的情况下,在不快乐的情况下或输入条件下,您刚刚真正投入的工作。有时候这并不重要,因为您会很幸运。有时这会带来长期的痛苦。


4
另一方面,有些程序员自己编写代码,但仍然不理解它……
hplbsh 2011年

3

在通常情况下,您基本上需要这样做以提高生产力。

除非您有一个可行的示例,否则很难学习任何您不熟悉的技术。因此,您可以复制并粘贴该文件以使其具有实际运行的功能,然后开始进行修改。


更正:有一个实际的belif,您基本上认为您需要这样做以提高生产力。因此,您复制并粘贴自己的方式来释放某种可以起作用的东西,并花费无限的时间来修复损坏。
Newtopian 2012年

3

作为一个新的程序员(我的第一份工作开始已经四个月了),我非常依赖帮助(无论是来自SO还是其他地方)。我提出了不要盲目复制和粘贴其他代码的观点。即使提供的代码是我将要使用的代码,我也将其键入到程序中,然后花一点时间确保我完全了解它的作用及其原因。

我想确保自己不断学习,而不仅仅是剪切和粘贴方面的专家


1

我对这个话题有很多感触,但我不能坦白地说任何一个都是客观的。

剪切和粘贴其他人的代码到您的应用程序中有很多参数。其中有些可能有意义,有些可能没有意义。例如,如果您从某人的博客中获得了一种方法,该方法接受输入并运行某种复杂的数学算法,而该算法超出了您的数学能力,并且吐出了结果(这是剪切和粘贴的参数),请获得作者使用其许可的权限编码并归因于他们-这是光荣的事情。

有人提出不重新发明轮子的说法-从理论上讲,这也是有道理的。但是,如果您不花时间熟悉要剪切和粘贴的代码,则不知道是否有解决此问题的更好方法,也不知道代码中是否有错误。如果您粘贴的轮子坏了怎么办?

速度和效率存在争议-您建立了别人的代码库,这些代码被盗用,被盗,窃或以其他方式窃听,您甚至可能甚至不需要知道如何在Frankensteining某些应用程序之外进行编程一起从回收零件中取出。

在某些时间和地点,我认为这种行为是完全可以接受的。为了将不是为长寿而设计的快速扔掉的工具凑在一起,而是为了完成任务,现在就可以通过钩子或骗子来完成。为了进行原型设计和研究,在理论上学习和发展,我认为这是完全公平的游戏。

剪切和粘贴其他人的代码是窃-如果您能得到他们的祝福,并且了解自己要粘贴的代码,并且适合您的应用程序的编码标准,那么,我承认这是公平的游戏。

作为专业软件工程师,我将获得报酬以维持标准和道德规范。我没有因为窃取,窃或侵犯他人版权而得到报酬,这使我的客户面临被起诉的风险。除此之外,还有一个非常真实的风险,那就是当您运行上述剪切/粘贴的代码时,会带来灾难性的副作用。

约翰不是针对您的答案,我知道您在诸如此类的话题上非常有道德倾向,因此,这实际上只是问题本身的一般说法。

附录:也就是说,我认为在项目之间剪切和粘贴自己的代码是完全可以接受的-除非它被编写为他人的可租用作品,在这种情况下,您不拥有版权,您应该获得许可您为其编码的人的人。我发现,除非代码与专有功能概念相关,否则大多数雇主都可以让您将自己的想法重新用于其他客户。


您如何使用博客文章中的代码来解决您遇到的特定问题?物理上复制/粘贴代码是您认为违反道德的行为,还是将解决方案重新键入您的项目属于同一类别?“借用”代码的大小(即完整的程序/功能与一小段代码)是否会影响您的意见?
亚当李尔

2
我觉得如果它在博客文章上,那么作者打算将其公开,因此,如果它对您有用,那么这是公平的游戏。但是,我几乎从未遇到过可以逐字复制的代码段。他们通常需要一些修改。
Pemdas 2011年

我使用的教程或博客文章中的代码没有问题-只需了解它的作用即可。如果已发布,则可能可用。
quick_now 2011年

“不是把这个答案对准你的约翰”……我实际上并不认为你……至少直到我读完这篇文章为止。大声笑
约翰·麦金太尔

我喜欢您对窃和完全理解代码的评论,但是您真的认为复制/粘贴别人的代码比自己编写更有效吗?我发现您或者不会完全理解它,以后会遇到问题,或者您尝试完全理解它比您自己编写要花更长的时间。KWIM?
John MacIntyre


0

如果代码是好的,那么应该将其复制并粘贴到公共库中,而不是复制并粘贴。但是人们不必为重构而烦恼,他们更喜欢通过复制和方法来传播相同的功能。

人们应该知道何时使用它,而不是拥有普遍的绝对的复制和粘贴法则是好是坏。

复制和粘贴的优点是:使您快速入门缺点:同一代码分布在多个地方,发现/解决的任何问题都需要解决,如果不是将一个粘贴/粘贴的问题用作公用库,则更新将传播到各处。对于使用库而不是将相同的代码分散到各处的少量初始投资。

选择是最初是否要节省大量时间,然后再复制和粘贴才是可行的方式,否则将其重构并放在一个公共库中。


我绝对同意公共库,但是您应该剪切并粘贴该代码,还是从头开始创建它?
约翰·麦金太尔

导入代码最快的方法是通过复制和粘贴,但是应该检查一下,如果需要,可以修改代码,然后再将其插入项目并忘记它。
Arjang

0

在大多数情况下,您在网上找到的代码将无法满足您的确切目的。

我自己所做的很多事情是从某人那里复制代码,将其分解为最基本的内容,然后添加代码,直到满足我的要求为止。我将始终对其进行重构以使其符合我的命名约定和编码风格。

当我阅读教程时,我个人讨厌它,而它们首先显示了一个复杂案例的代码。从本质开始,并显示构建块以扩展代码。如果我自己开过博客,我将为人们提供带注释的代码示例,其中显示了我想要做的事情的本质,如何添加功能/特殊情况以及基本功能的完整示例。


-1

如果您了解代码在做什么,拥有重用代码(或代码开放)的权限,而又不一定需要其他人编写的所有代码,为什么还要重新发明轮子。我经常复制算法实现,并根据自己的需要对其进行修改。通常,尽管我只是剪切并粘贴它是因为我不需要示例中的所有内容,所以添加另一个文件只会浪费(或者是函数内部的某些东西)。如果您要在同一个项目中剪切和粘贴自己的代码,我同意jzd的说法,那是有问题的,您可能应该想出一种经济的方式来释放它或共享功能。


-1

我发现“ 集成 ”团队成员或在代码或编程方面没有太多经验的团队成员倾向于更频繁地复制和粘贴并且不了解他们所做的事情(进入问题中提到的问题)。

我还发现,程序员经常不喜欢剪切和粘贴,因为他们喜欢代码并且经常重新发明轮子,只是因为他们想做得更好或了解更多。


+1为重塑。我还发现自己花费了大量时间从Internet重写代码,而不是复制粘贴代码。我想我这样做是因为我不受时间限制。我可以自由学习,也可以在需要时学习。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.