我应该删除未引用的代码吗?


118

我正在研究中等大小(10万行)的代码库,它们都是相对较新的代码(不到一年),并且具有良好的单元测试覆盖率。

我不断遇到的方法要么不再在任何地方使用,要么仅在仅测试特定方法的单元测试中引用。

如果确定不再需要此代码,是否应该删除它?

删除它的原因:

  • 更少的代码,更少的错误
  • 更少的代码更易于他人消化
  • 它仍在源代码控制下

保留它的原因:

  • 可以作为参考
  • 有时可能有用
  • 它可能被编写为“完善”类的功能

22
“更少的代码,更少的错误” -如果真的从来没有使用过他们,他们也不会导致错误
康拉德·莫拉夫斯基

19
@Morawski但是,如果保留它,则将使用一天。而且由于尚未对其进行维护,因此其中将包含错误,然后将出现这些错误。
DJClayworth 2011年

9
我通常会注释掉它以及依赖它的测试,然后留下带有日期的“ TODO”注释。一旦一年不使用,我就将其卡住。其他人建议立即将其删除,但是我发现很难做到这一点,尤其是在看起来代码曾经有用的情况下。
工作

31
@Job如果遇到注释掉的代码,它将被删除。没有理由。被注释掉的代码只会大喊“我不信任我们的源代码控制系统”。对我来说。
克里斯托弗·普罗沃斯特

26
@Kristof Provost,您怎么会知道有用的代码曾经存在于源文件A中(如果不再存在)?当然,您始终可以检查文件的历史记录,但是您经常想一下自己:“嗯……我需要在此处更改/实现功能。或者我需要测试5年的工作原理之前是QUICKLY。我想知道是否有人已经实施了它,然后将其删除了……让我检查一下历史”。我不主张凌乱废话围绕保持,但有些时候你是不是在生产中使用的代码的情况下,但确实/可能需要它偶尔进行调试等
工作

Answers:


219

简而言之,您保留它的大多数理由都不重要。如果不使用该代码,则将其丢弃-可以从源代码管理中轻松获取保留该代码所涉及的任何好处。最多留下一条评论,指出要在哪个修订版中找到它。

简而言之,您越早切割代码,就不必越早浪费时间维护,编译和测试代码。这些优势大大超过了您概述的琐碎好处,无论如何,所有这些好处都可以从源代码控制中获得。


30
我同意删除它,但是在某些情况下我因为某些人通过反射使用“未使用”的代码而破坏了某些内容。因此,无论如何都应该小心。
猎鹰

14
@Falcon,这是在人们开始使用它或发现有需要将其公开之前尽快将其删除的一个很好的理由。
StuperUser 2011年

6
@Falcon:这是OP的声明,即代码未使用。
DeadMG

4
@StuperUser:我完全同意。但是,应该小心并为意外做好准备。
猎鹰

18
如果删除它,并且您的单元测试和回归测试通过了,但是该产品在领域中破裂,则为设置某种类型的代码覆盖率工具提供了有力的依据。
Andrew T Finnell

43

删除它的所有原因都是正确的。

保留它的原因:

  • 可以作为参考
  • 有时可能有用
  • 它可能被编写为“完善”类的功能

所有这些保留它的原因将由源代码管理来管理。从实时代码中删除它,您将可以在需要时/在需要时对其进行检索。


1
是的,未引用的代码不应保留在实时代码中。
xdazz

在我看来,您也可以通过简单地注释掉大块内容而获得这些好处。
史蒂夫·本内特

@SteveBennett的确,但是您误解了此答案的重点。我列出了对其进行评论的好处,关键是您将从源代码控制中获得所有这些以及更多好处(您将在其他答案中看到)。
StuperUser 2012年

我当然不反对VCS。:)(我不过请注意,一旦东西从当前版本中删除,这是远远超过其他方法不太明显,如将其存储在一个未引用文本文件,在wiki上,在评论中,等...)
史蒂夫·贝内特

@Steve Bennet-在文件的当前版本中,它的“可见性”可能不及注释,但它对于检查单个文件的VCS历史记录而言却微不足道,我说这比txt-file / wiki / etc容易得多。 ..方法。
Zach Lysobey 2014年

23

未引用的代码与保持电池的电量相同,以防万一您需要一天使用它们进行割炬。

只要您使用某种版本控制,我都会说将其从实时代码中删除,并使用版本历史记录以防万一它有用。


40
为了使您的类比稍有改善,这就像是将快要用完的电池贴在遥控器上,而不是放在存储室中标有“用过但未用尽的电池”的新电池旁边的盒子中。
Scott Whitlock

加1可带来更好的改善!
尼古拉斯·史密斯

15

我可以看到保留当前未使用的代码的唯一好理由是,如果它是独立模块的一部分:虽然目前可能不使用部分代码,但很可能它们将被使用。将来使用。

对于在不同项目中使用的库而言,尤其如此:您不想根据特定项目的需要而不断地向内扔代码:我发现这很耗时且容易出错。

我的方法是:(1)如果只使用一次,请仅保留您真正需要的东西;(2)如果您使用了两次,请在第二次使用时进行复制和改编;(3)如果您使用它两次以上,请用它制作一个定义明确,稳定的模块,然后根据需要使用此模块。

总结:我将丢弃所有未使用的代码,除非它是您这样设计的通用模块的一部分,并且您知道您将重复使用几次。

注意:当然,更干净的解决方案是为库创建一个单独的项目,并在项目之间添加依赖项。


1
例如,我有一些库例程可以读取和写入字节数组中各种大小的有符号和无符号数据类型。根据当前代码所需要的内容,为所有数据类型设置一组这样的例程似乎比使某些例程存在或不存在更为干净。
2012年

11

通常,我会为此鞠躬。如果“不需要”,那么它只是在代码库,单元测试和程序集中占用空间。您可能最终需要它,但也可能最终需要完全重写它,因为从现在到需要类似它的东西之间,可能会发生很多变化。

但是,当您编写用于一般用途的实用程序或API时,情况会有所改变。就像您永远无法期望软件最终用户以您想要的方式与软件进行交互一样,您永远也不能期望代码的使用者希望完全按照您认为的方式使用代码。在这种情况下,只要您可以使用“这是一种与我的对象进行交互的有效方法”来证明方法的存在,那么它就应该加入其中,因为即使您不需要它,SOMEONE也会有很好的机会。


8

鉴于代码库不到一年的历史,它可能仍处于不断变化中(是吗?)-因此,在不久的将来可能需要重新使用某些比特的想法并不是没有道理的。

对于一开始很难正确处理并且似乎更有可能复活的位,我将使它们比“源代码控制”中的“活着”更多。人们不会知道/记住他们的存在-说“您可以在源代码控制中找到它”是假设您知道/记住它的存在!在这种情况下,请考虑弃用(使用“ assert(false)”显示顶部)或注释掉。


5
+1表示“您可以在源代码管理中找到它”,假设您知道/记住它在那里!” -有时候,由于某些原因或其他原因,我发现很少有人想起一些有用的代码。
史蒂文

3

如果代码是琐碎且无趣的,那么我只是将其扔掉,以消除软件系统不必要的惯性。

对于有趣的代码尸体,我archive在版本控制系统中使用一个分支。


3

“可以用作参考”我不会倾向于同意保留未使用的代码是一个很好的理由。通常,只有一小部分未使用的代码实际上在演示一些有趣的事情。有多种方法来记录和存储有用但未使用的代码。

尽管版本控制将包含一个历史记录,如果您以后决定需要使用代码,可以轻松地使您还原特定功能,但是知道您需要查看版本控制历史记录以从谁知道以前的修订版可以找到xy或z。除非您对所要查找的内容有一个非常明确的想法,否则它会有些乏味,并且经常被忽略。

可以用注释说明该代码何时被删除以及为什么不将其简单地从代码中删除。但是,这通常被认为是不好的样式,如果以后不加注释,则未被使用和维护不正确的代码可能会引入各种错误,因此,与中期重构相比,此方法作为临时调试/测试步骤通常要好于留下生产代码的方法。

我最喜欢的存储已删除代码的方法(如果将来可能会有用的话)是制作包含所有各种有价值的已删除代码块的辅助参考文档。每个代码块都有一个简短的标记,标明了它的来源或其他需要记住的内容,例如何时删除代码或代码的最后修订版本。被删除但“潜在有用”的所有内容都集中在一个位置,易于搜索,但不需要持续不断地维护和测试(测试推迟到重新引入代码的任何地方)。


2

保留未使用方法的一个很好的理由是:它们可以在其他分支/标签上使用!

删除所有活动的分支和标记之前,请先对其进行探索。


这对我来说没有意义:如果未在分支中使用它,请将其从分支中删除。如果另一个分支使用它,它将留在那里。
sleske 2013年

1

如果使用版本控制系统,则不必担心将来的引用,因为您可以简单地查看该代码的历史记录并找到已删除的部分。如果不这样做,你认为这是一天使用,后来干脆让它呆在那里,但评论也有说明,解释为什么它的评论。

但是,如果您确定将来不会使用它,只需将其删除。我认为您提到的原因非常容易删除代码。

但是请在删除它之前,确保没有在任何地方使用它。Visual Studio具有一项称为“ 查找所有引用”的功能,该功能可搜索整个解决方案并查找对当前变量,方法,属性,类,接口等的任何引用。在删除部分代码之前,我始终确保没有任何引用。


1

我经常有发现一种看起来像它可以完全满足我需要的功能的经验,并且因为它已经投入生产很长时间了,所以相信它可以正常工作,只是发现它实际上并没有被使用。几年。未使用的代码不会得到维护,尽管它可能已经使用多年了,但其周围的API已经发生了足够的变化,以至于您无法信任它。

充其量,您最终会花费大量时间来确保它实际上仍然可以满足您的要求。在最坏的情况下,它似乎一直有效,直到您后来被一个讨厌的bug咬住,并花费更长的时间进行跟踪,因为您认为“经过生产测试”的代码可以工作,因此问题必须在新代码中的其他地方出现。以我的经验,仅自己编写一个新函数几乎总是更快。

如果您删除了它,但是很快就发现您确实需要它,那么它就在源代码管理中。如果直到很长时间才不需要它,而您又不记得它在源代码控制中,那么最好还是从头开始编写它。


1

没有什么比没有代码消耗更少的时间了。

如果您必须深入研究代码库,则需要一些时间来弄清楚该代码的用途,如果什么都不用,则需要更多时间。

好的-可以通过评论将其治愈,然后再次,每个人都将推理为什么未使用的代码仍然存在于代码库中,无论是否应将其删除。

如果什么都没有,没有人会浪费时间。

如果很难正确处理,则需要一个很好的文档,证明该代码存在,但是如果代码库经过一些迭代而演变,则如果重新激活它,则可能不再起作用。


1

删除未使用的代码-减少混乱,更好地理解。您的版本控制系统会注意。另外,如果您使用的东西比记事本还好,则您的环境将允许您使用旧的代码作为参考。

旧代码的冗长注释会分散注意力,并且使导航变得困难。

问候


1

请遵循以下简单算法:

  1. 是否在SCM中备份?是=> 3。
  2. 设置一个SCM。
  3. 把东西扔掉

您支持删除的所有观点都是有效的。

一旦拥有SCM来查找或恢复它,所有用于保持混乱的观点都是无效的。实际上,如果使用正确,您的SCM应该能够帮助您确定为什么在这里未使用该代码。

出于某种原因,它被称为“死代码”。让它死去,安息吧。


0

它将保留在源代码管理中;它不应保留在活动代码库中。

一个例外是,如果代码完成了设计,并且在您不使用代码时,您计划最终将代码公开,而其他人可能想要该基本功能。然后,只需设计测试以确保代码的这些部分可以正常工作,以模仿您建议他人如何使用这些代码部分即可。但是,如果您甚至正在考虑删除代码,但又不能提出保留该代码的充分理由,则应该删除它。未使用的代码使每个人的工作量更大(难以阅读代码;代码可能被破坏;需要维护的工作量更多,等等)。


0

以我的经验,删除未使用的代码也会适得其反。您可能会忘记拥有该代码,并且不会在历史记录中寻找它。或者,您甚至可能不知道有人实现了该代码,然后在以后将其删除。同样,您将不会在历史中寻找它...

无疑,拥有未使用的代码是一种难闻的气味。

更新:我只是注意到埃德·史陶布(Ed Staub)给出了非常相似的答案。

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.