每个组织或者说每家公司都有自己的注释风格,没有规矩不成方圆,在编程领域,这条规则依然成立。对于注释,也有各自的要求,在编程规范中都有规定。有时候,这种规定比较松,比如说要写多少注释,以及用什么样的风格都由程序员自己来决定,下面我们就来看一看代码注释的几种方式。
我写单行注释的标题就是让大家看起来不那么反感,其实词不达意,这里要说的是每一行都注释,在整个代码中强制自己每一行都加注释,就可以避免文档内容不足的问题。如果真的要这么做的话,一定要保证你这么做的道理。实际上,这么大规模的注释看起来不简洁、臃肿、杂乱。看个例子吧:
int result; // Declare an integer to hold the result.
result = doodad.getResult(); // Get the doodad's result.
if (result % 2 == 0) { // If the result modulo 2 is 0 ...
logError(); // then log an error,
}else { // otherwise ...
logSuccess(); // log success.
} // End if/else.
return result; // Return the result.
这样的注释真是让人无语,稍微懂点英文的同学都可以看懂未加注释的代码,只要你有基本的C++知识,也知道这段代码是做什么用的,这种注释完全背离了我们程序中加注释的初心。这只是一个极端的例子,我们还是要基于这个例子来向大家说一些干货的,我们来看其中的一行:
if (result % 2 == 0) { // If the result modulo 2 is 0 ...
这句注释就是对代码的翻译,着实无用。没有解释为什么用2去除,看修改成如下注释:
if (result % 2 == 0) { // If the result is even ...
哎,好像有点儿意思了,不单纯是代码本身了,代码本身给出的信息被注释得更明晰了,长时间之后,就能理解,原来当初是要干这件事儿。这段儿代码是来检查数字是否是偶数。
我们再次声明,讲解代码注释的目的依然是初心:让代码本身更清晰地表达自己,在代码清晰表明自我的前提下,代码注释越少越好。那我们改进这段儿代码的思路就出来了,将代码与注释合二为一,将这段儿代码放到一个所见即所得的函数中不就解决问题了。
bool isEven(int value) { return value % 2 == 0; }
不用加注释的代码如下:
if (isEven(result)) {
每行注释看起来多余臃肿,但在一些难以理解的代码中,注释还是多多益善的,下面的代码来自真实案例,也是每行都注释,但却确实有用:
// Calculate the doodad. The start, end, and offset values come from the
// table on page 96 of the "Doodad API v1.6."
result = doodad.calculate(Start, End, Offset);
// To determine success or failure, we need to bitwise AND the result with
// the processor-specific mask (see "Doodad API v1.6," page 201).
result &= getProcessorMask();
// Set the user field value based on the "Marigold Formula."
// (see "Doodad API v1.6", page 136)
setUserField((result + MarigoldOffset) / MarigoldConstant + MarigoldConstant);
该注释解释了每一行要做什么,如果没有这些注释,对于"Marigold Formula"的计算大家肯定是一头雾水,无法解密吧。
再多说一句,不做无谓的代码注释,注释的内容都是代码本身无法表达的,更不要去翻译代码的每一行,真的没有什么用。
你的公司可能会要求在源码的前面加上一段儿标准注释,说明代码的重要信息,可能会包含如下信息:
*号注释的内容是与缺陷与特性跟踪系统相关的。
还有一些信息是不要包含在注释中的,这些信息在版本控制系统中都有。
举例如下:
// Implements the basic functionality of a watermelon. All units are expressed
// in terms of seeds per cubic centimeter. Watermelon theory is based on the
// white paper "Algorithms for Watermelon Processing."
//
// The following code is (c) copyright 2023, FruitSoft, Inc. ALL RIGHTS RESERVED
固定格式的注释是为相关工具服务的,按照固定格式对代码进行注释,利用相关工具就可以直接生成与代码相关的文档,而不用人员再进行手工整理,让一切标准化,学习过Java的同学都很清楚,JavaDoc就可以做到生成Java的相关文档。在C++中,也有相关工具,本次推荐Doxygen的免费工具,大家可以到doxygen.org上去下载,使用起来也比较容易,我关于这部分,我就不过多介绍了。
大部分时间,注释是基于需要而产生的,下面给出几点需要考虑的
我们一再强调,好的代码是不需要多余的注释的。最好的代码是易于阅读的,如果像前面介绍的那样,对每一行代码都加了注释,就需要考虑对代码进行重写了。例如,使用描述性的名字来对函数、参数、变量、类等进行命名。合理使用const常量;如果变量不会被修改,就要加上const。对函数中的步骤重新排序,使其更易阅读。使用中间变量使算法更易理解。记住C++是一种编程语言,主要目的是让计算机好好工作,其语法也是被用于向读者解释其意思的。
另外一种方式就是对代码进行分解,我们下一篇文章再谈。