过时的评论是都市神话吗?


38

我不断看到人们声称“评论趋于过时”。问题是,我认为我在整个职业生涯中可能已经看到两三个过时的评论。单独的文档中过时的信息一直在发生,但是根据我的经验,代码本身中过时的注释非常少见。

我刚刚和谁在一起很幸运吗?某些行业是否比其他行业更容易出现此问题?您是否有看到最近过时评论的具体示例?还是过时的评论更多是理论问题而不是实际问题?


30
同意 过时的代码被注释掉了,现在我看到了很多东西,并且希望少见。
pyvi

8
我看到缺少评论比什么都重要。结合不良的命名约定,尝试阅读一些我喜欢的东西会很有趣。
P.Brian.Mackey 2011年

2
我已经看到了许多过时的评论,有些只是明显的误导性的EVIL。绝对没有神话,但是对于由许多人维护和/或长期维护(由于复杂性而扩大)的项目,大多数情况下是有效的。但是我学会了相信代码,而不是注释(如果注释超过一两行,我几乎从不阅读它们)。
2011年

在我的整个职业生涯中,我大部分时间都在使用非常古老的旧代码。在大约30年的古老Fortan77代码中,我遇到过十几次与过时的注释相关的严重问题,但是在注释足够的情况下,占代码比例几乎为零。因此,我同意,问题的规模肯定已经夸大了。
SK-logic

只是我的运气,自发布这一年以来,我已经看过很多年了。我想我已经下意识地学会了不信任他们,然后纠正它们并继续前进,而没有给予足够的思考以记入我的长期记忆中。
Karl Bielefeldt 2012年

Answers:


33

不断地

我真的不敢相信我是唯一在过时和误导性评论中游刃有余的人。在偶然的情况下,这有助于理解:

这可能最重要地取决于代码的年龄。下一个因素将是人员流动。

我从事研发和维护工作。R&D是新的代码,通常来说有些偏离常规。我的许多同事相信,在尝试没有图书馆可用的东西时,请多加注解。由于注释与代码的比率比正常的比率高,因此存在更多不同步的机会。

维护代码...我是系统的活跃维护者,该系统已经使用了10年以上,而另一个系统是5年以上。正如您所期望的那样,使用10年的代码和注释非常糟糕。十多年来,您在代码库中获得了很多帮助,没有人知道整个过程如何工作。使用5年的代码和注释非常不错,因为团队的人员流失率非常低。

我几乎提供所有服务,甚至我们的产品都是针对特定客户量身定制的。

具体示例:

  • 描述特定方法的性能改进的注释,例如避免复制内存。当奔腾2中的高端计算机具有MB的RAM时,这很重要,但现在几乎没有问题。

  • 待办事项

  • 复制粘贴的代码块,包括注释。评论在其原始位置可能很有意义,但在这里几乎没有任何意义

  • 在注释掉的代码之上添加注释块(谁知道其中已有多少年了)。

在所有这些中,您看到了一种趋势,就是不将注释和代码保持在与软件相同的级别。IDE和基本的开发人员习惯对此无济于事,我的眼睛已经训练过,可以超越它们。我认为,在绿地和活跃项目中避免过时的评论相对便宜。如果您可以保持较高的代码/注释比率,则使它们保持最新并不重要。当您为生产系统中的错误修复预算了x个小时的预算时,要证明减少这些工作的难度会有些困难。


所以基本上您是说您只是完全忽略了评论,因为它已经太乱了,只会使您的情况更糟。不足为奇。
Steven Jeuris 2011年

5
@Steven-我个人,不。我非常相信渐进式改进。我已经看到,经过充分的努力,完全无法理解的代码变成了相当不错的东西。但是,无视无疑是我经验中的常态。当您遇到数个相互交织的10000行类,其中有数周的问题需要分类时,这是很容易理解的,过时的注释往往落在优先级列表的底部。
史蒂夫·杰克逊

1
@Steve:在您的情况下,我将简单地创建一个脚本,该脚本随后删除所有注释,并在需要时从头开始注释。:)
Steven Jeuris 2011年

1
我以前工作的主要代码库至少有一半是注释,很少是注释代码。过时的评论是生活中的事实,正确的评论极为罕见,我什至不会开始评论文档!视线...在完成这项工作后,我了解到少有好处,如果您的代码需要注释,则可能需要进行重构以使事情变得更明显...
Newtopian 2011年

4
我已经看到了一些可怕的例子Blocks of copy-pasted code including comments. Comment may have made sense in its original location, but hardly makes sense here。例如,类级别的评论谈论的是不同的类。
彼得·泰勒

18

“评论趋于过时。”

我已经看到这种情况经常发生,足以知道这可能是一个问题。

问题是,我认为我在整个职业生涯中可能已经看到两三个过时的评论。

我认为,在每个人都充分注意并维护评论的环境中工作应该是完全可能的。查看正在编辑的代码附近的注释并在适当时更新它们,这只是一小笔额外的工作。如果评论距离太远,以至于您没有立即注意到它们,那么它们无论如何都是不好的评论,因此不应该首先添加(或至少不添加)。

此外,通常伴随着评论趋于过时的陈述,随之而来的陈述是,这降低了可读性并使人们感到困惑。这是我还没有经历过的事情。每次遇到过时的注释时,我都会清楚地看到发生了什么变化,并且只需付出一些额外的努力就可以相应地更新注释以表示较新的代码。


Roehm等人的最新研究2012年观察到以下情况:

[28名参与者中,有21名]报告称他们从源代码和内联注释中获取了主要信息,而只有四名参与者表示文档是其主要信息来源。

这符合您的怀疑,即代码本身中的注释通常仍被认为非常有用。这表明应该在过时的文档和过时的注释之间划清界线

Roehm,T.,Tiarks,R.,Koschke,R.,&Maalej,W.(2012年6月)。专业开发人员如何理解软件?在《 2012年国际软件工程大会》(第255-265页)中。IEEE出版社。


随着我变得更好,我发现我需要更少的注释来掌握典型的Plug-chug代码中的代码。
保罗·内森

3
@保罗弥敦道,评论不应该描述什么 代码的功能-代码描述更好。这里有注释来解释为什么 代码会执行此操作。
SK-logic

2
@ SK-logic:尽管我理解论点,但我认为它太广泛了。函数(或代码段/块)的注释可以比其名称更清楚(更快捷)地说明函数的作用。公共职能尤其需要此功能。尽管可以轻松阅读代码,但阅读两行十行代码的解释仍然更快。想象一下使用没有任何“什么”文档的您最喜欢的API 。您对它的功能不确定得多。
Steven Jeuris 2011年

是的,我没有提供任何文档(例如Javadoc)-它的结构过于复杂,以至于不能仅仅称为“ 注释 ”。
SK-logic

17

过时的评论是工作的味道。这就像已经过时或被忽略的单元测试一样,它表明曾经在商店中活跃的良好流程正在退化为牛仔编码。花时间做正确的事情的正确的“工程文化”已经崩溃。该项目/公司可能会陷入技术债务。

简而言之,是的,您很幸运。如果您到目前为止在职业生涯中碰巧拥有一连串经营良好的商店,那么很有可能看不到这么多。但是在更典型,经营不善的商店中,这与其他混乱情况平行。


“过时的评论是工作的味道。” 很好放!同样,不带任何注释的自文档代码不是解决方案,而是懒惰的“ hack”。
Steven Jeuris 2011年

10

注释就像测试一样,它们在最新时非常有用,但如果没有,则可能更难理解代码。

如果您从未看到过时的评论,那么您很幸运。

我使用过的大多数代码库都充满了过时的注释,通常我完全不理会注释,因为它们通常是混乱的源头而不是帮助。


请问您从事过哪些行业?我想知道这在某些国家是否比其他国家更普遍。
Karl Bielefeldt

我曾在欧洲的3个不同国家/地区工作,主要是为一家大公司和一家小公司担任顾问。最近在SaaS开发公司。
Kim.Net 2011年


10

过时的注释通常出现在JavaDoc中:

  • 列出不再存在的参数
  • 不解释所有参数(稍后可能添加缺少的参数)
  • 例外情况类似。

此外,有时,当大多数性能方面的考虑往往比代码本身更快时,陈旧的注释会声明诸如“在此处执行以提高性能”之类的事情。


3
(不是批评-只是提出一个解决方案)IDE警告可以大大防止这种情况。如果需要采取更严格的措施,请在Javadoc构建警告/错误上使构建失败。
Michael K

1
这可以解释为什么我没见过很多。我从未在使用JavaDoc风格的注释的地方工作过。
Karl Bielefeldt

4
@ Michael,IDE警告在轻度情况下很有帮助。我们原有的代码库产生超过20,000 Checkstyle的警告,这是在哪里你停止关注极限的方法: - (((集成开发环境,严重时,可导致的Javadoc苦难显著大多数在我们的代码库的废话的Javadoc明显自动生成。
PéterTörök

4

我会不时地处理过时的评论。这当然不是都市神话。人们在最坏做法列表中提到它不是因为它经常打击您,而是因为当它打击您时,通常会花费您大量的时间和精力。

在我们的代码库中,大多数过时的注释是由在调用附近而不是在方法声明附近使用(反)模式描述方法行为引起的。当有人将一长段代码提取到一个方法中时,就会发生这种情况,该方法此刻仅被调用一次,然后注释该方法调用。因此,您最终会得到如下结果:

featureList = GetFeatures();

// Sorting features and deleting empty ones from the list...
ProcessFeatures(featureList);

并且该方法在下面的某处声明,没有注释。多年来,人们一直在使用这些方法来处理规格更改和修复错误,最终您最终得到的方法无法对列表进行排序,并且在找到空功能时会抛出异常。因此,以上注释是过时的注释,最终将使您花费一些时间在调试器中。这些确实在某些代码库中发生。


3

问问自己这个。您是否曾经更改过一行代码,却没有更改相关注释或添加新注释?

我处理了许多旧代码,有时注释甚至不相关。


2

在大多数情况下,我的经验与您的经验相符,但是我遇到了一种情况,在整个代码库中都是如此。该应用程序是几年前由一家咨询公司编写的,不再与客户保持“良好关系”。

该公司在注释代码方面做得非常出色,但是自从最初的交接以来一直维护它的程序员是“仅更改绝对需要更改的内容”心态的一部分,这本身并不坏。不幸的是,他们对注释也保持同样的态度,随着时间的推移,导致注释和代码之间的巨大脱节。


2

我看不到太多的过时的描述性评论,但是我确实看到了很多已经存在多年的TODO评论了。我希望他们像时间囊,并说出这样的话:

//TODO: In 15 years AND NO SOONER... actually implement this method.

1
这种情况下的问题可能是滥用TODO。我认为TODO仅应在代码实际可用时使用,但可以在以后进行改进,因此TODO: implement不应存在​​任何注释,而实际上没有人回来就没有太大关系。遗憾的是,没有多少人遵守此规则,我完全同意,我希望在某个时候看到像您在某些生产代码中发布的评论。这会让我开心。
pwny 2011年

1
在C#中,出于这些目的,我使用NotImplementedException
Steven Jeuris 2011年

2
@pwny,在签入之前,我只对打算写的东西使用TODO,以确保掩盖它。在我看来,任何比期限更长的期限都属于错误跟踪程序。
Karl Bielefeldt

@Karl Bielefeldt这也很有意义。
pwny 2011年

2

我从事的最后3个项目我花了几天时间,每个项目都从代码库中删除了过时,误导且仅是无用的注释。在可能的情况下,我将其替换为更适当的注释,但通常,这只是删除注释并继续前进的问题。

我几乎在从别人手中接过的每个代码库上都做过同样的事情,通常是在一段时间不使用它并且原始所有者早已离开和/或不愿或无法做适当的交接之后。


1

可能是使用评论的减少。有多少人的代码合格?首先,实际上必须有人添加评论以使其过时。其次,必须更改注释的代码。不确定是否有大量代码合格。

您只需要依靠一个不好的注释就可以破坏大量的应用程序,并浪费大量时间。


0

在组织大量代码的组织中,很难保持注释同步。理解正在发生的事情的最好方法是使用绘制您正在使用的模块的控制流程图的软件。这是保持了解软件功能的唯一方法。

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.