评论中的旧代码[关闭]
Posted
技术标签:
【中文标题】评论中的旧代码[关闭]【英文标题】:Old Code in comments [closed] 【发布时间】:2009-06-20 21:06:49 【问题描述】:您应该在代码库中将旧代码注释掉多久?承包商通过将旧代码转换为 cmets 继续将旧代码保留在代码库中。这真的很令人沮丧,我希望他们只删除旧代码而不是将其注释掉。
是否有正当理由将代码库中的旧代码保留为 cmets?我正在使用 Visual Sourcesafe 的版本控制
【问题讨论】:
【参考方案1】:如果您使用 SVN 或 CVS 之类的东西,则不会。我会在视线范围内抹去它们。它们降低了代码的可读性。
注释应该可以帮助正在阅读代码、解释内容等的程序员。
【讨论】:
【参考方案2】:我能想到的一个正当理由是这个(虚构的)例子:
# removed the following test because this should work now that bug #12345 is fixed.
#assert a != 0
b = number / a
基本上是为了防止其他开发人员重新插入因某种原因而被删除的代码。
【讨论】:
同意。如果有人看到做某事的另一种方式 - 他们会明白它没有这样做是有原因的。 我有点同意这个原则,但这个案例肯定是一个糟糕的例子。在这里,如果不再需要断言,只需将其删除。一个更好的例子可能是“不要使用以下明显的实现;它不起作用”,但我可能会在评论而不是代码中快速描述问题。或者更好的是,我可能会完全删除评论并编写一个旨在显示明显实现不起作用的测试用例。【参考方案3】:告诉承包商停止这样做。这是一种糟糕的做法。
实际上没有任何理由将旧代码保留在代码库中;它只是碍事。您的版本控制系统将向您显示每个文件的历史记录。
保留旧代码的唯一可能好的理由可能是作为历史参考(也许如果旧代码做了一些特别奇怪的事情,可能与当前情况有关)。
有时我会只注释掉代码,因为我知道我正在进行临时更改(临时我的意思是少于几天)并且肯定打算回到它。
编辑:另一种相关做法是将更改的名称和日期放在文件中:
// 06/20/2009 - joe changed this #1245
也不要这样做。看看是谁做出了改变,这在当时似乎很有价值,但随着时间的推移,它确实没有任何价值,而且还会使代码变得混乱。
【讨论】:
哦,不,如果您有很多开发人员更改错误并添加更改,那么“审计”跟踪会非常有效。我已经使用它太多次来找出对工作代码进行特定更改的原因。 VSS 也是如此——在 WAN 上检查修订历史记录太不切实际了。 有时,它可以帮助记录“/* 这种奇怪之处,因为 Zimbotron 编译器 4.56 版错误处理了“其他代码 sn-p” - 2004-06-20 */";这给出了更改的原因,以及帮助您识别(不使用'svn blame'或其他)为什么编写奇怪代码的日期,并让您有机会说(五年后)“哦,天哪,我们早在 2006 年就停止使用该编译器;我们不再需要这种变通方法,并且可以将其清理回一个健全的编码标准!”。 是的,这就是我所说的“供历史参考”【参考方案4】:如果您正在使用您应该使用的源代码控制,那么请删除旧代码,因为副本将在源代码控制中准备就绪,并在您需要重新添加它时等待您。将旧代码放在那里会降低阅读上述代码的能力并引入混乱。此外,如果您使用承包商编写代码,请告诉他们如何在您支付工资时编写代码。为它们定义编码标准并让它们按意图进行编码,这应该改进方法、属性等的名称,并一起减少对 cmets 的需求。
【讨论】:
【参考方案5】:你问“多久?”如果这些地方是人们仍在工作的热点,那么我不会因为一两个地方有旧代码而感到生气。
也许他们对新代码还没有信心。新代码“完成”了吗?是按应该写的吗?它通过测试吗?是否根据规范进行了评论和记录?表现在它应该在的地方吗? (我能想到的同时拥有旧代码和新代码的最佳原因是当我在计时或分析一组特定案例时。)
旧代码有什么比新代码更可取的地方吗?
承包商是否感到匆忙?还是只是版本控制前的旧习惯?
【讨论】:
据我所知,这只是一个难以改掉的旧习惯。【参考方案6】:当您提醒承包商时,他们不必注释掉代码,因为 Sourcesafe 会保留历史记录,询问他们为什么这样做。
他们可能出于某种原因不信任它。如果你能从他们那里得到这个原因,他们可能会注意。我知道当我们多年前从 VSS 迁移时,是因为他们可能也遇到了可靠性和可扩展性问题。如果您可以解决他们的顾虑,或者通过证明 VSS 足以满足您的需求,或者说您将调查其他源代码控制解决方案(当然,如果您有预算),那么您应该赢得他们的支持。
说服胜于强迫。
【讨论】:
【参考方案7】:是的,一见钟情。除了表明评论它的开发人员不确定是否要删除它之外,它没有任何价值。或者他们不知道如何使用您的源代码控制软件。
【讨论】:
【参考方案8】:基本上,您只有 2 个选项。
-
删除它 - 当您使用一些代码存储库时。您的存储库会准确地告诉您进行了哪些更改,因此无需在您的工作代码中保留很长的旧 cmets,这并不能用简单的语言解释。
另一方面,如果您出于多种原因希望保留该代码,例如,我将应用程序中的一些浮点计算代码注释掉,因为它不能在平台上运行,我正在为此编程。但由于我不希望我的应用程序仅限于该平台,因此我将代码保留在那里,因此当我将应用程序移植到支持浮点计算的平台时,它可以节省工作量。
这只是保留旧代码的原因之一,可能适用于相同背景的人。
否则,上述是您仅有的 2 个选择。您的来电!!
【讨论】:
我支持你的第二个原因 - 我在代码中做了类似的事情,我编写了 C 函数的优化 asm 版本 - 我会将原始 C 代码版本注释掉 (a)记录 asm(这通常比 C 更难阅读,并且 (b) 以帮助某人将来将 asm 移植到不同的平台。 是的,我们在使用准系统硬件时经常遇到这样的问题,并且在我的很多应用程序中都有很多 asm 代码在循环,如果没有添加那一行特殊的代码,这些代码将无法工作只是为了让您的整个应用程序在该平台上运行。由于任何未来的程序员都不会知道在哪里寻找什么和在哪里寻找,所以将旧代码保留在某些地方,至少可以作为一个提示,该代码需要特别注意。 如果您使用的 VCS 不容易支持分支,第二个原因可能很好,因为很多人早在 2009 年就已经写了答案。在 2019 年,希望没有人使用 VCS 来迫使他们这样做。 :)【参考方案9】:保留旧代码只会使阅读整个代码变得更加困难。只要项目有某种形式的版本控制,注释掉的代码就应该被删除。如果您没有修订控制并且无法进行任何设置,则建议将旧代码放在不属于代码库一部分的文件中。
【讨论】:
【参考方案10】:我假设您指的是似乎具有一定价值的重要代码块,或者本身就是好的算法,而不仅仅是这里或那里的奇数行。
在这些情况下,如果您进行了较大的更改,保留旧代码,因为 cmets 充当代码审查的一种形式,那么自然就会倾向于保留代码。任何获得最新版本的人都将能够立即看到所做的重大更改,如果出现问题,更容易看到以前的内容。如果问题出在新代码上,那么有一种非常简单的方法可以立即检查它。
因此,鉴于此,我倾向于注释掉第一次修订的旧代码,然后仅在随后再次更改代码时将其删除,此时更改将被“嵌入”并且不太可能错误的原因。
这些 cmets 是一种文档形式,对于任何纯粹的“干净”编码理想,无需删除它们。不再需要时将其移除,并在它们可能有价值时保留它们。
【讨论】:
你已经有了一个差异工具,它可以显示版本之间的变化,以便进行代码审查,对吧?如果是这样,那么注释掉的代码肯定不会带来额外的好处。 @MarnenLaibow-Koser 代码差异仅显示以前的版本。如果您的文件经常被签入,那么注释位将很快丢失。知道要保留什么需要权衡(一如既往),但这样的代码就在你面前,直到你知道它可以被删除。随意将其替换为对它最后出现的版本的引用,但通常,将相关位保留一段时间要容易得多。 您使用的是什么 VCS,代码差异仅显示以前的版本?在我用过的那些上,你可以区分任何两个版本。 VCS 已经保留了相关位。无论如何,代码审查应该在之前完成,新代码进入主/主干/无论你的 VCS 调用主线;那时,旧代码可以安全地丢弃。因此,除了表明您不信任您的 VCS 之外,我只是没有看到这种做法有什么作用。 :) @MarnenLaibow-Koser 很少有人使用 VCS 来显示一些随机版本 10 或更多提交的差异。有些人发现一旦分支就很难比较! 99% 的差异仅在以前的版本中完成。 这根本不是我的经验。我经常使用 VCS 来比较不连续的版本——它一直发生在代码审查和跟踪错误时。任何好的 VCS 都应该让跨分支的比较变得容易。【参考方案11】:首先,我说摆脱它。
但我知道一个不这样做的原因:虽然它仍然存在于您的版本控制中,但这并不意味着任何人都可以看到它。如果您可能需要再次看到它,您首先必须知道它曾经存在过。有时你做了一个修改,未来的开发者需要同时看到旧的和新的方式,如果你删除了旧的方式,开发者怎么知道它曾经存在?对于此类问题,大多数人没有足够好地记录版本控制中的更改。
【讨论】:
为什么需要双向查看修改?不确定您在这里的设想是什么 我十年前写的。实际上,原因是缺乏代码审查。会发生的情况是代码会在进行广泛的补丁时被注释掉,然后被签入以进行 QA。但在 QA 批准补丁后,没有人回过头来删除注释代码。 考虑到我们大多数人 10 年前的做法,这是有道理的。 :)【参考方案12】:将旧代码留在那里的原因有很多。基本上 - 一旦它被删除,它实际上就消失了 - 除非有人真的记得它在那里。
作为一个邪恶的承包商,我不会删除代码,除非我对程序进行大量重写——废弃它并替换它而不是“修复”它。
【讨论】:
投反对票。是的,有人必须记得在 VCS 中查找旧代码,但那又如何呢?您要删除的代码应该“有效地消失了”——这就是您要删除它的原因。我认为,注释掉的死代码会引入维护(读取)开销而没有任何好处。您保留代码的“这么多理由”是什么? (在我的合同工作中,我总是根据需要删除代码。如果我聘请你作为承包商并看到你注释掉代码,我会假设你对正确使用 VCS 感到胆怯,我会要求你删除它,或者,如果你经常这样做,终止合同。)【参考方案13】:我目前正在介绍的项目使用另一种方法 - 某种妥协...当您决定不再使用某些代码时,您只需将其注释掉,写下日期注释掉,并且(如果可能的话——例如在 Netbeans 或 VisualStudio 中)将旧代码插入#region OLD_IMPL。影响? - 为了以防万一,您仍然有旧代码 - 未使用的代码块只占用 1 行 (#region OLD_IMPL) - 如果您看到,该代码一年没有使用(您有注释掉它的日期),您可以简单地删除它。
如果遇到任何危急情况,您总是使用 SVN ;)
【讨论】:
【参考方案14】:那些因为版本控制工具可以解决您可能遇到的任何问题而说摆脱注释代码的人是白痴。
一旦你确定它真的真的过时了,你就需要摆脱过时的代码。
是否曾经因为“它并不完全糟糕,但可惜它也不完全好”而不得不修改修改?如果您仍然可以取出生产源并且知道之前版本的代码仍然在其中,以某种文本形式,它将为您节省大量时间,因为您无需求助于复杂、难以- 控制,因此使用您的版本控制工具可能为您提供的任何“部分源合并”和“部分源合并”的过程非常容易出错。
不喜欢这种现实的人肯定在他们的整个职业生涯中都只编写了从未“不完全坏,但也不是完全好”的代码,或者换句话说,只产生了要么完全坏要么完全不好的代码否则完全完美。而且我们都知道实现后者的概率有多大。
【讨论】:
部分源合并???如果你真的需要重新插入一些旧代码,从旧版本复制粘贴就像取消注释一样简单。 投反对票。如果您使用的是不错的 VCS,很容易从以前的版本中获取几行代码。如果您的 VCS 无法让这一切变得简单,请购买更好的 VCS。以上是关于评论中的旧代码[关闭]的主要内容,如果未能解决你的问题,请参考以下文章