`
alphafox
  • 浏览: 18006 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

避免在代码里写注释

 
阅读更多

如果用很多注释来“装饰”代码是件好事的话,那么在代码中加入大片大片的注释便是锦上添花了。是这样吗?事实上不完全是这样的。过犹不及,好心也会办坏事。

'*************************************************
' Name: CopyString
'
' Purpose: This routine copies a string from the source
' string (source) to the target string (target).
'
' Algorithm: It gets the length of "source" and then copies each
' character, one at a time, into "target". It uses
' the loop index as an array index into both "source"
' and "target" and increments the loop/array index
' after each character is copied.
'
' Inputs: input The string to be copied
'
' Outputs: output The string to receive the copy of "input"
'
' Interface Assumptions: None
'
' Modification History: None
'
' Author: Dwight K. Coder
' Date Created: 10/1/04
' Phone: (555) 222-2255
' SSN: 111-22-3333
' Eye Color: Green
' Maiden Name: None
' Blood Type: AB-
' Mother's Maiden Name: None
' Favorite Car: Pontiac Aztek
' Personalized License Plate: "Tek-ie"
'*************************************************

我常常不看开发者写的注释。似乎他们并不明白,其实他们的代码已经告诉了我它是怎样工作的;我们需要注释告诉我们的是,程序为什么这样工作。代码注释已被广泛地误解和滥用,以致于你都开始怀疑它们原本的价值——注释还有存在的必要吗?你在期望什么呢?要当心!这里有一段完全没有任何注释的代码:

r = n / 2;
while ( abs( r - (n/r) ) > t ) {
r = 0.5 * ( r + (n/r) );
}
System.out.println( "r = " + r );

明白这段代码想要做什么吗?它看起来一清二楚,但到底是干什么用的呢?

让我们加上一行注释:

// 用“牛顿-拉夫逊”近似法求解n的平方根
r = n / 2;
while ( abs( r - (n/r) ) > t ) {
r = 0.5 * ( r + (n/r) );
}
System.out.println( "r = " + r );

这个应该就是我想要的了。不是吗?它介于完全没有任何注释与每隔一行就规规矩矩写上史诗般的注释这两种极端之间,看似一个不错的折中——你满意了吗?

未必!与其添加注释,我更愿意把这段代码重构成这样:

private double SquareRootApproximation(n) {
r = n / 2;
while ( abs( r - (n/r) ) > t ) {
r = 0.5 * ( r + (n/r) );
}
return r;
}
System.out.println( "r = " + SquareRootApproximation(r) );


我一行注释也没有加,但这段神秘的代码现在已经非常容易理解了。

尽管注释本身说不上好或者坏,它们却常常被用作支撑代码的“拐杖”。你应该总是专注于编写代码,而忘了还有注释这种东西的存在。这会迫使你竭尽全力使用最简单、最直白、最能自我说明的方式把代码写出来。

为了让你的程序员同伴们更易于阅读和理解你的代码,如果你已经重写、重构、甚至重新设计了很多遍——当你已经一筹莫展,已经想不出任何办法可以让你的代码变得更加浅显易懂——这时候,也只有在这时候,你才应该迫不得已地加上些注释来解释你的代码是做什么的。

就像Steve Yegge指出的那样,这是初级开发者与高级开发者之间的一个关键差别:

坦率地说,要是在以前,让我一下子看太多的代码会让我崩溃,它的复杂度已经超越了我能接受的极限。而当我不得不在那些代码的基础上继续工作的时候,我通常会把它们重写,或者至少也会写上大量的注释。现如今,当我碰到这种情况的时候我会披荆斩棘快速通过,而不会(过多地)抱怨。当我在脑子里有了一个明确的目标、并且有一段复杂的代码要写时,我会把时间花在代码实现上面,而不是(用注释)写下它的故事、讲给我自己听。

初级开发者依靠注释来讲故事,而实际上他们应该依靠代码本身。注释是“旁白”,它们有其自身的价值,但绝不能用来替代(故事里的)情节、人物和场景。

或许这才是关于代码注释不可告人的小秘密:想要写出好的注释,你必须是一位优秀的作家。注释跟代码不一样,它不是给编译器看的。注释是用来和其他人类交流想法的文字。尽管我跟(大多数)程序员同伴们关系很好,但我必须承认,与其他人有效沟通真的不是我们的强项。我曾经收到过我们小组里的一位程序员发来的电子邮件,里面只有三段,但着实把我搞得晕头转向。我们能相信这样的人会在代码里写出清晰、易懂的注释吗?于是我想,或许我们中的一些人去做那些我们擅长的事情会更好些——那就是,为编译器写代码,并且尽可能写得清楚些,而只把注释当作是最后没有办法的办法。

写出好的、有意义的注释是很难的。就像写代码一样,它是一门艺术;或许还要更加艺术一点!就像Sammy Larbi在“Common Excuses Used ToComment Code and What To Do About Them”(注释代码的常见借口以及应对方法)一文中所说的那样,如果你觉得你的代码在没有注释的情况下显得过于复杂、很难被人理解,那只能说明你的代码写得很糟糕。重写你的代码吧,直到它不再需要任何注释。如果经过了这些努力,你仍然觉得注释是必需的,那么就尽你所能加上注释吧。切记,小心!

分享到:
评论

相关推荐

    什么时候应该避免写代码注释?

    看到标题,我知道你可能会想:“我为什么要避免代码注释,这难道不是一件好事吗?”。是的,写注释在大多数情况下是有用的。但是,请注意,我说的是“在大多数情况下”,因为有一些情况下,你不应该写注释。

    Log4Net使用示例代码(带注释)

    本代码示例了在生产环境中的日志记录方式. 附带有日志按日志每天分割出一个文件,以及按日志容量分割出一个文件. 同时示例了采用自定义config文件配置的方式进行log4Net相关的配置,避免直接配置在web.config文件中...

    智慧医疗-基于医疗知识图谱的对话机器人python源码+注释拉满+数据集.zip

    智慧医疗-基于医疗知识图谱的...代码注释拉满、毕业设计项目、附带医疗知识数据集文本 可直接训练模型 【备注】 建议使用anaconda和pycharm,在anaconda虚拟空间内搭建环境,然后导入到pycharm,避免与其他项目冲突。

    java代码审查规范文档

    Code Review是一种用来确认方案设计和代码实现的质量保证机制,通过这个机制我们可以对代码、测试过程和注释进行检查。 Code Review主要用来在软件工程过程中改进代码质量,通过Code Review可以达到如下目的: .在...

    HTML5 对各个标签的定义与解释:noscript

    如果浏览器支持脚本,那么它不会显示...老式的(无法识别 &script> 标签的)浏览器会忽略注释,这样就不会把标签的内容写到页面上,而新式的浏览器则懂得执行这些脚本,即使它们被包围在注释标签中! 实例代码 <body>

    Java注释规范整理.docx

    在软件开发的过程中总是强调注释的规范,但是没有一个具体的标准进行说明,通常都是在代码编写规范中简单的描述几句,不能作为一个代码注释检查的标准和依据,做什么都要有一个依据吗:),现在我特整理了一个《Java的...

    阿里巴巴编码规范 基础技能认证 考题分析(考题+答案).docx

    关于代码注释,下列哪些说法符合《阿里巴巴Java开发手册》:ABD A .特殊注释标记,请注明标记人与标记时间。 B .待办事宜(TODO):( [标记人,标记时间,[预计处理时间]) C .在注释中用FIXME标记某代码虽然...

    Python开发代码需要注意什么,用Python写一段圣诞树源码

    3. 注释:代码中应该有足够的注释,以便其他人能够理解代码的含义。 4. 代码复用:重复的代码应该封装成函数或类,以便复用。 5. 异常处理:代码中应该包含适当的异常处理,以避免程序崩溃。 下面是一段用Python写...

    审查代码规范(C++)

    审查代码规范 C++ 1. 范围 3 2. 规范性引用文件 3 3. 术语和定义 3 4. 开发工具 3 5. 目录结构 4 6. 布局规范 5 ...10.2.11. 避免在索引列上使用IS NULL和IS NOT NULL 31 10.2.12. 使用UNION-ALL和UNION 32

    (稀缺代码)引力模型要素流动的Stata代码附数据 区域创新人才流动

    ab代码,本材料专门使用Stata写成供Stata研究者使用 注:材料用到的数据 为示例数据,仅供研究使用,但是具体数据根据自己的研究内容进行修改 示例数据区间为 2008-2019年的面板数据 代码有详细注释 Stata代码 - ...

    编写Ruby代码注释时需要注意的一些问题

    写出自解释文档代码,然后让这部分歇息吧。这不是说着玩。  使用英文编写注释。  使用一个空格将注释与符号隔开。... 注解应该写在紧接相关代码的上方。  注解关键字后跟一个冒号和空格,然后是

    多线程进度条避免窗体假死

    自己写的多线程进度条,避免主线程窗体假死的功能程序,有详细注释,可直接运行看结果,写给不懂线程知识的人使用的,不用有线程等编程基础,只需添加窗体进自己的程序,然后按照代码注释在对应地方添加自己的函数就...

    Sonar代码规范

    5. 注释不足或者过多 没有注释将使代码可读性变差,特别是当不可避免地出现人员变动 时,程序的可读性将大幅下降 而过多的注释又会使得开发人员将精力过多地花费在阅读注释上,亦违背初衷。 6. 缺乏单元测试 sonar...

    less语法小结-源代码+注释.rar

    此工程是在b站学习了尚硅谷less教学视频后的语法小结。在此作为一种分享与个人的记录。 关键字:less变量的常见用途,less的混合,less的继承,避免编译less,使用less进行加减乘除。

    请避免五种程序注释方式

    你是否曾在检查代码时碰到一条在你看来多余的注释?在代码中使用注释的目的是提升代码的可读性,以让那些非原始代码开发者能更好地理解它们。  我甄别出5类让我不胜其扰的注释及5类生成它们的程序员。我希望读过...

    银行家算法死锁的避免.doc

    (2)报告中有实现的关键技术点源代码,源代码书写要有一定的规范,源代码中有相关的注释; (3)作为扩展,有余力的同学,能在界面上能够定时给出可视化展示资源申请过程。 (4)实验结果要附上运行结果的截图,并...

    三维DWA算法matlab代码(代码中有详细注释,适合算法入门)

    DWA算法的核心思想是在机器人的控制空间中搜索一个可行的控制序列,使得机器人能够在避免碰撞的同时,尽可能快速地达到目标位置。 ### 2. 算法步骤 DWA算法通常包括以下步骤: #### 2.1 初始化 - 确定机器人的...

    编写可读代码的艺术(The Art of Readable Code)

    本书的关键思想是代码应该写得容易理解。确切地说,使别人用最短的时间理解你的代码。  本书解释了这种思想,并且用不同语言的大量例子来讲解,包括C++、Python、JavaScript和Java。我们避免使用某种高级的语言...

    死锁的避免――银行家算法

    只是一个用c++代码关于操作系统死锁的避免写的银行家算法实验,里面的注释很齐全

    SpringMVC写的增删改查,最简洁代码,入门范例

    使用springMVC写的增删改查,使用map存放的数据,避免与数据库连接跑不起来,都是我自己写的,增删改查功能都能实现,代码全部是最简洁的(没有绝对),没有冗余,部分代码有注释能看懂,里边的jar包要自己加。...

Global site tag (gtag.js) - Google Analytics