编程必知:八个最没有意义的代码注释

多年来,我非常荣幸能和一些谦逊的公司和客户合作。我也因此有机会接触到各种不同的程序员—— 每个程序员都有自己独特的风格。事实上,每个项目本身都有一些独特的元素。

这些特质的交叉让我去思考我曾经审查、更新或提高过的程序代码。与其说是代码的实际逻辑,还不如说是开发人员自己添加到代码中的注释,对代码产生了颇为深远的影响。这篇文章的主题就是罗列一些我印象深刻的一些代码注释。

因为Carol让我这么做

我记得审查程序代码时,有一条注释是这样写的:


  1. // Because Carol Told Me to Do This 

在阅读这行代码时,我一下子就懵了,“谁是Carol?”以及“Carol让这个开发人员做什么了?”虽然写代码的程序员知道这两个答案,但换做是

一个局外人或者是一个后面加进来的人,那么这条注释就毫无价值。当我和我的经理说起这条注释的时候,他哈哈大笑,只是说了句Carol明显是一个人名字之
后,就无下文了。好吧,直到现在,我依然不知道这句注释究竟是什么意思。

很大一部分被代码遮挡

在另一种情况下,我相信我将问题范围缩小到了一个特定的类。但是打开这个类,我看到大量的代码被块注释掉了。让人疯狂的是,注释的代码是在方法的中

间。所以,我只能在阅读完顶部的代码之后,滚动几个屏幕,才能继续阅读剩下的代码。你得牢记在心里,幸好中间间隔的时间不是太久,有到应用程序的源代码库
的链接。

在我心中,我对此非常嗤之以鼻,“提前阅读没有注释的大块代码,却只是看到了程序是用来做什么的”。当我问另一名开发人员为什么代码要像这样被注释和检查的时候,他给我的回答是“万一我们下次还要用到它呢”。我真心无语。

只是为了苦中作乐

在工作于一个基于web的应用程序时,我发现了以下的JavaScript注释:


  1. // make sure it's correctly formatted, because in javascript things 
  2. // like '7' or '4.3' or 'derpdy do 77' are valid dates 
  3. // seriously, try it out for yourself: Date.parse('derpdy do 77') 

这里的开发人员意识到Date.parse()方法存在着问题。为了警示他人,开发人员决定添加注释作为警告,同时又苦中作乐了一番。我只能想象当这个开发人员意识到此路不通时心中该是有多么的沮丧。

道歉

有些时候,程序员意识到他们的做法并不好。很多时候,这是基于开发小组之外所能做的唯一选择。于是,出现了这样的注释:


  1. // Sorry for what you are about to see 

阅读代码和理解实施方法背后的情况有助于完整地理解简单的道歉式注释。这有点像惊悚片里的英雄在采取有计划的行动之前,先道歉的那一幕。

只围绕它编码

一开始作为一个白板声明,最终被转移到以下注释:


  1. // Doing this to "not do anything to effect Eric and Steve's code" 

基本上,这是一个进程的入口点,代码围绕明显由Eric和Steve引入的问题。但是我没有任何相关的背景,也不认识Eric和Steve,我只知道任何影响了他们的代码都得禁止。

为了注释而注释

我们都听过这样一句话:“好的代码是自文档化的”。我完全同意这种说法,当然有些注释还是有必要的。但是,下面这种注释,明显不能划到“必要”的范畴中:


  1. return true; // returns true 

这种注释确明显是没有必要的,因为我们很容易理解返回什么。我能想出的关于为什么要这么注释的唯一原因就是,开发人员在添加到实际代码前,使用注释先制定出了方法,后来却忘记删掉这些注释了。但是如果有代码审查过程的话,就不会出现这样的注释。

注释不正确

还记得前面提过的“好的代码是自文档化的”这句话吗?那么,也许在所有注释中,最糟糕的就是提供了错误信息的注释。请看下面这个简单的例子:


  1. // Always returns false 
  2. public boolean isActive() { 
  3.     return true; 

现实中我所看到的例子远远没有这么简单。然而更糟糕的是,当你需要依赖注释写一个复杂的方法时,才意识到这样的注释是无效的。在这种情况下没有注释都比错误的注释好。

小说般的注释

最后一种我见过的注释是,开发人员写的类似于小说般的注释:


  1. /** 
  2. * This is the widget method which will process the list of 
  3. * widgets from the widget controller and service in order to 
  4. * handle pre-processing (where the widget information is 
  5. * compared against the average widget history), actual 
  6. * processing (where the quarterly, monthly and week attributes 
  7. * are updated) and all of the post-processing (which include the 
  8. * analytical metrics and audit table updates) aspects. It is 
  9. * important to remember the widget rules around leap year where 
  10. * the cost to transfer rate is 75% adjusted to the annual rate in 
  11. * order to account for the extra day. When this happens, the 
  12. * process will throw the LeapYearException which will need to be 
  13. * validated by the application support staff. Failure to do so will 
  14. * end up causing issues with the ME-4110 report. 
  15. */ 

我的经验法则是,任何需要那么多信息的代码或许应该分解成更小的方法。而且注释中这样的信息应该挪到实际的代码之外。而在上面的例子中,像流水账一样记录的业务规则和业务流程——却有可能随着时间而改变。

结论

关于如何正确地写好代码注释,简单地搜一下的话,网上有很多很多。有些甚至可能会告诉你如何尽可能地不在代码中提供注释。

相反,我想分享一些我有幸作为一个应用程序开发人员所读过的一些滑稽的注释。请记住,我在应用程序开发上有着20年以上的编译经验——反映了例外,而不是规则。

编码快乐!


作者:小峰

来源:51CTO

时间: 2024-08-03 10:00:05

编程必知:八个最没有意义的代码注释的相关文章

电脑高手必知八个最常用的电脑命令

  一.nbtstat 该命令使用TCP/IP上deNetBIOS显示协议统计和当前TCP/IP连接,使用这个命令你可以得到远程主机deNETBIOS信息,比如用户名.所属de工作组.网卡deMAC地址等.在此我们就有必要了解几个基本de参数. -a使用这个参数,只要你知道了远程主机de机器名称,就可以得到它deNETBIOS信息(下同). -A这个参数也可以得到远程主机deNETBIOS信息,但需要你知道它deIP. -n列出本地机器deNETBIOS信息. 当得到了对方deIP或者机器名de

注意:健康体检必知八个常识[图]

一错认为没有疾病不用查. 有的人往往身体不错,能睡能吃,从来没有觉得不舒服,于是不主动检查,或者干脆就不去体检.这样做对自己是十分不负责任的.[page] 二是身体不好不敢查. 有的人身体比较虚弱,一到体检,往往担心会 查出这样那样的疾病,从而对工作.家庭造成不良影响.因此体检时躲躲闪闪,不愿检查.这样只会导致原有疾病加重.[page] 三是害怕麻烦不想查. 有些人工作忙,该体检了,自己还有许多事情做,想到身体也没什么大病,干脆走走形式,有的甚至形式也不走,干脆找个理由一推了之.这种做法,很有可

SEO必知的100个网站优化问答(八)

在接触SEO的过程中,大家都会碰到很多这样或那样的问题,木木SEO为了让大家更清楚更方便的了解这些常见的SEO问题,现将这些常被问到的网站seo优化问答总结下来,一共100个,前面已经写了6篇,文章的反映效果不错,大家也非常喜欢.这里不多说,前面写到到了SEO必知的100个网站优化问答(七) ,现在直接进入SEO必知的100个网站优化问答(八): 71.一般做百度优化都有哪些好的方法? 这个就多了,主要从三方面来: (1)站内优化,基本的优化页面的布局.标签优化.内部关键字的插入.内容建设.站内

经典的20道AJAX面试题(必知必会)

1.什么是AJAX,为什么要使用Ajax(请谈一下你对Ajax的认识) 什么是ajax: AJAX是"Asynchronous JavaScript and XML"的缩写.他是指一种创建交互式网页应用的网页开发技术. Ajax包含下列技术: 基于web标准(standards-basedpresentation)XHTML+CSS的表示: 使用 DOM(Document ObjectModel)进行动态显示及交互: 使用 XML 和 XSLT 进行数据交换及相关操作: 使用 XMLH

Python 程序员必知必会的开发者工具

Python已经演化出了一个广泛的生态系统,该生态系统能够让Python程序员的生活变得更加简单,减少他们重复造轮的工作.同样的理念也适用于工具开发者的工作,即便他们开发出的工具并没有出现在最终的程序中.本文将介绍Python程序员必知必会的开发者工具. 对于开发者来说,最实用的帮助莫过于帮助他们编写代码文档了.pydoc模块可以根据源代码中的docstrings为任何可导入模块生成格式良好的文档.Python包含了两个测试框架来自动测试代码以及验证代码的正确性:1)doctest模块,该模块可

javascript 必知必会之closure_javascript技巧

下面的代码片断缩进目前还不完善,你也可以选择 下载pdf 来阅读. Contents 摘要 什么是closure 执行空间(执行上下文, Execution Context) closure的一些用法 关于closure的效率 应用建议 结论 参考资料 本文的rst源码 什么是closure 一种定义是: A "closure" is an expression (typically a function) that can have free variables together w

Visual Studio 使用及调试必知必会

原文:Visual Studio 使用及调试必知必会   一:C# CODING 技巧 1:TODO 然后 CTRL + W + T,打开任务列表,选中 Comments,就会显示所有待做的任务 2:打开所在的文件夹 右键单击任何一个文件选项卡, 选择"打开所在的文件夹",或在 Solution Explorer 的文件上面点右键: 3:比对同一个文件 鼠标向下拖动红框内的图标. 4:按意愿编程 我把它定义为:按意愿编程,即,在写代码过程中,如果觉得需要使用到一个新类,可以先不用创建这

Javascript必知必会(四)js类型转换_javascript技巧

string和number boolean javascript 类型会根据赋值的进行转成相应的类型. var str = ""; alert(typeof (str));//string str = ; alert(typeof (str));//number var sum = str + ; //+编程两个数字相加 alert(sum);// 这一种比较明显,一眼就可以计算出其值.但是请看下面这种转换 var sum = "" + "";

与新手站长共勉:新手站长成长必知的六个知识

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 与新手站长共勉:新手站长成长必知的六个知识,作为新手站长,笔者负责公司网站-朗朗家教的维护和线上推广,现将这四个多月的成长和积淀形成文字,与众多跟我一样的新手站长一起探讨和成长,同时希望路过的大侠们不吝赐教. 我们朗朗家教于09年10月30日上线,经历近五个月的成长,现在百度收录1300,谷歌3400,PR2,Alexa世界排名14万位,快照