首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

1.6 注释

注释是帮助程序读者的一种手段。但是,如果在注释中只说明代码本身已经讲明的事情,或者与代码矛盾,或是以精心编排的形式干扰读者,那么它们就是帮了倒忙。最好的注释是简洁地点明程序的突出特征,或是提供一种概观,帮助别人理解程序。

不要大谈明显的东西。注释不要去说明明白白的事,比如i++能够将i值加1等等。下面是我们认为最没有价值的一些注释:

所有这些都该删掉,它们不过是一些无谓的喧嚣。

注释应该提供那些不能一下子从代码中看到的东西,或者把那些散布在许多代码里的信息收集到一起。当某些难以捉摸的事情出现时,注释可以帮助澄清情况。如果操作本身非常明了,重复谈论它们就是画蛇添足了:

这些注释也都应该删除,因为仔细选择的名字已经携带着有关信息。给函数和全局数据加注释。注释当然可以有价值。对于函数、全局变量、常数定义、结构和类的域等,以及任何其他加上简短说明就能够帮助理解的内容,我们都应该为之提供注释。

全局变量常被分散使用在整个程序中的各个地方,写一个注释可以帮人记住它的意义,也可以作为参考。下面是从本书第3章取来的一个例子:

放在每个函数前面的注释可以成为帮人读懂程序的台阶。如果函数代码不太长,在这里写一行注释就足够了。

有些代码原本非常复杂,可能是因为算法本身很复杂,或者是因为数据结构非常复杂。在这些情况下,用一段注释指明有关文献对读者也很有帮助。此外,说明做出某种决定的理由也很有价值。下面程序的注释介绍了逆离散余弦变换(inverse discrete cosine transform,DCT)的一个特别高效的实现,它用在一个JPEG图像解码器里:

这个很有帮助的注释点明了参考文献,简短地描述了所使用的数据,说明了算法的执行情况,

还说明为什么原来的代码应该修改,以及做了怎样的修改等等。不要注释差的代码,重写它。应该注释所有不寻常的或者可能迷惑人的内容。但是如果注释的长度超过了代码本身,可能就说明这个代码应该修改了。下面的例子是一个长而混乱的注释和一个条件编译的查错打印语句,它们都是为了解释一个语句:

否定性的东西很不好理解,应该尽量避免。在这里,部分问题来自一个毫无信息的变量名字result。改用另一个更具说明性的名字matchfound之后,注释就再没有存在的必要,打印语句也变得清楚了:

不要与代码矛盾。许多注释在写的时候与代码是一致的。但是后来由于修正错误,程序改变了,可是注释常常还保持着原来的样子,从而导致注释与代码的脱节。这很可能是本章开始的那个例子的合理解释。

无论产生脱节的原因何在,注释与代码矛盾总会使人感到困惑。由于误把错误注释当真,常常使许多实际查错工作耽误了大量时间。所以,当你改变代码时,一定要注意保证其中的注释是准确的。

注释不仅需要与代码保持一致,更应该能够支持它。下面的例子里的注释是正确的,它正确地解释了后面两行的用途。但细看又会发现它与代码矛盾,注释中谈的是换行,而代码中说的则是空格:现在注释和代码一致了。但是这两者都还可以进一步改进,应该写得更直截了当些。这里要解决的问题就是删除函数ctime返回时放在字符串最后的换行字符。注释里应该说明这个情况,代码也应该是做这件事:

最后这个表达式是在C语言里截去字符串最后字符的习惯写法。现在代码变短了,注释也支持它,解释了为什么这个语句需要做。澄清情况,不要添乱。注释应该在困难的地方尽量帮助读者,而不是给他们设置障碍。下面的例子中遵循了我们为函数写注释的建议,解释函数不寻常的特征。但是这里的函数是strcmp,这是个标准的东西,具有人们熟悉的界面,它的不寻常特性对手头工作来说根本不重要:

学生常被告之应该注释所有的内容。职业程序员也常被要求注释他们的所有代码。但是,应该看到,盲目遵守这些规则的结果却可能是丢掉了注释的真谛。注释是一种工具,它的作用就是帮助读者理解程序中的某些部分,而这些部分的意义不容易通过代码本身直接看到。我们应该尽可能地把代码写得容易理解。在这方面你做得越好,需要写的注释就越少。好的代码需要的注释远远少于差的代码。练习1-11   评论下面的注释:

查看所有评论(0)条】

最近评论



正在载入评论列表...
热点评论