更新资料
我在报价中的回应强调:
我认为,指出注释的问题的答案不应在编码标准中解决,然后列出一系列防御性问题加以解决,这是唯一正确的答案。
这里的问题是,编码标准就是标准。非常主观的想法应该不会是在编码标准。它可以是“最佳实践”指南中的,但是在“代码审阅”期间不能针对开发人员使用该指南。我个人认为,编码标准应尽可能接近自动。当所有代码都可以自动执行时,在代码审查中浪费了很多时间来争论命名,间距,制表符,括号,注释等。甚至对答案tables
,并chairs
可以实现自动化。LINT'ers允许使用字典,每个概念的大写检查(变量,函数,方法,类等)。
在接受“拉取请求”之前,甚至可以由Robot LINT'er实施JavaDoc检查。许多开源项目都可以做到这一点。您提交“拉取请求”,该代码是使用Travis-CI文件(包括“静态分析”)构建的,并且必须通过所有可以客观表达的编码标准。没有人会抱怨“做错了”或“没有提供评论”,或者用错误的方式命名变量等。这些讨论没有任何价值,最好留给第三方机器人处理,这可以使我们的情感编码首当其冲。
要真正回答这个问题,我们必须解决如何编写一个标准,该标准解决如何回答以下问题:该评论是否有价值?编码标准不可能规定评论的“值”。因此,人类必须通过该清单。在编码标准中仅提及注释会创建清单,原始海报要避免。
这就是为什么注释通常不由编译器处理并去除的原因。它们的价值无法确定。有关评论是否有价值?是还是不是?。回答这个问题很困难。只有人类有机会正确回答它,即使如此,阅读它的人也只能在阅读时回答它。评论内容的价值受天气,他或她的家庭生活,他们刚刚参加的上次会议影响不大,一天中的时间以及所喝咖啡的量的影响。我相信情况会越来越清晰。
如何在任何标准中正确表达?除非可以持续,公平地应用标准,否则标准就没有用。
我认为编码标准应尽可能保持客观。变量被称为IS目标的方式。可以根据字典轻松地检查它们的正确拼写,语法结构和大小写。除此之外,还有“小便比赛”,由最有力量的人或“眉头殴打”赢得。我个人不做某事而感到挣扎。
当我发表评论时,我总是评论以第三人称与我的未来自我交谈。如果我在5年后回到此代码,我需要知道什么?什么会有所帮助,什么会造成混淆,什么会使代码过时?生成可搜索的公共API的文档代码和为未知的第三方提供价值的注释代码之间存在差异,即使该第三方是您自己也是如此。
这是一个很好的石蕊测试。如果您是该项目的唯一成员。您知道您将是该项目中唯一的一个。您的编码标准将是什么?您希望您的代码是干净的,自我解释的,并且将来对您自己可以理解。您是否会对自己进行代码审查,以了解为什么没有对每一行都发表评论?您是否会查看在签入的100个文件上创建的每个注释?如果没有,那为什么要强迫别人?
我认为在这些讨论中遗漏的是,Future You也是该项目的开发人员。在询问价值时,明天的您也是可以从评论中获取价值的人。因此,在我看来,团队规模并不重要。团队经验并不重要,它会经常变化。
没有大量评论代码对此进行审查,这阻止了起搏器坠毁并杀死患者。一旦谈论影响代码的注释,您现在谈论的是代码而不是注释。如果只需要缺少一条评论杀死某人,那么在此过程中还会有其他气味。
已经提供了针对这种严格编码方式的解决方案,作为编写软件本身的一种方法。它与评论无关。评论的问题在于它们对产品最终的工作方式没有影响。嵌入心脏起搏器后,世界上最好的评论无法阻止软件崩溃。或使用便携式EKG测量电信号时。
我们有两种类型的评论:
机器可读注释
注释样式,例如Javadoc,JSDoc,Doxygen等,都是注释一组代码提供的公共接口的所有方法。该界面只能由其他单个开发人员(两人团队的专有代码),未知数量的开发人员(例如JMS)或整个部门使用。可以通过自动化过程读取此代码,然后该过程将以不同的方式读取这些注释,例如HTML,PDF等。
这种类型的注释易于创建标准。这是确保每个公共可调用方法,函数,类均包含必需注释的客观过程。标头,参数,说明等。埃尔。这是为了确保其他团队可以轻松找到和使用代码。
我正在做一些看起来很疯狂的事情,但实际上并非如此
这些注释可帮助其他人查看为什么以某种方式编写此代码。也许正在运行代码的处理器中会出现数字错误,并且总是四舍五入,但是开发人员通常会处理四舍五入的代码。因此,我们发表评论以确保开发人员接触代码可以理解为什么当前上下文在做某事通常看起来是不合理的,但实际上是故意编写的。
导致许多问题的原因是这种类型的代码。它通常没有注释,后来被新开发人员发现并“修复”。从而破坏了一切。即使这样,评论也仅用于解释为什么不真正防止任何破坏。
不能依靠评论
注释最终是无用的,不能被信任。注释通常不会更改程序的运行方式。如果确实如此,那么您的过程会引起更多的问题,而应该这样。评论是事后的想法,只能说什么。代码很重要,因为这就是计算机处理的全部内容。
这听起来可能很愚蠢,但请忍受我。这两条线中的哪一条真正重要?
// We don't divide by 0 in order to stop crashes.
return 1 / n;
在此示例中,重要的是我们不知道“ n”是什么,也没有检查n是否为0,即使存在,也没有阻止开发人员将n = 0
检查后的0 放在那的情况。是没有用的,没有任何自动化可以捕捉到这一点。没有标准可以捕捉到这一点。评论虽然很美(对某些人而言)与产品的结果无关。
测试驱动开发
产品有什么结果?必须严格检查在其中编写代码可以真正保存或杀死某人的行业。这是通过代码审查,代码审查,测试,测试,代码审查,单元测试,集成测试,试用,分阶段,几个月的测试,代码审查和单人试用,分阶段,代码审查,测试,然后可能最终完成的。投入生产。评论与此无关。
我宁愿没有注释的代码,有规范的代码,有经过验证的规范的单元测试,对在生产设备上运行代码的结果的研究,然后有据可查的未经测试的代码,也没有任何可比较的代码。代码反对。
当您试图弄清为什么某人以某种方式做某事时,文档记录是不错的选择,但是,多年来,我发现文档通常用于解释为什么“聪明”的事情做了,而实际上并不需要这样写。
结论
如果您在一家需要对每一行都进行评论的公司工作,我保证项目中至少有两名软件工程师已经用Perl,Lisp或Python编写了自动文档程序,该程序确定了该行的工作方式,然后在该行上方添加一条注释。因为这是可行的,这意味着注释是无用的。找到编写这些脚本的工程师来自动记录代码,并以此为依据来证明“每一条注释”都在浪费时间,没有价值并可能造成伤害。
一方面,我正在帮助一位密友进行编程任务。他的老师已规定必须记录每一行。因此,我可以看到这种思考过程的来源。只是问问自己,您要做什么,这是对的吗?然后问问自己;有什么办法可以通过这个过程“游戏”系统吗?如果有,那么它真的增加了任何价值吗?不能自动编写单元测试来测试代码是否符合特定规范,并且如果可能的话,那也不是一件坏事。
如果某个设备因为要在人体内而必须在某些条件下工作,那么确保它不会杀死它们的唯一方法是进行数年的测试,同行评审,试验,然后再也不要更改代码。这就是为什么NASA仍在使用此类旧硬件和软件的原因。当涉及到生与死时,您不只是“做些改动并签入”。
评论与挽救生命无关。评论是针对人类的,即使编写评论,人类也会犯错。不要相信人类。恩,不要相信这些评论。评论不是您的解决方案。