• 注释

注释虽然写起来很痛苦,但对保证代码可读性至为重要,下面的规则描述了应该注释什么、注释在哪儿。当然也要记住,注释的确很重要,但最好的代码本身就是文档(self-documenting),类型和变量命名意义明确要比通过注释解释模糊的命名好得多。

注释是为别人(下一个需要理解你的代码的人)而写的,认真点吧,那下一个人可能就是你!

1. 注释风格(Comment Style)

使用// /* */ ,统一就好。

// /* */ 都可以,// 只是用的更加广泛,在如何注释和注释风格上确保统一。

2. 文件注释(File Comments)

在每一个文件开头加入版权公告,然后是文件内容描述。

法律公告和作者信息 :

每一文件包含以下项,依次是:

1) 版权(copyright statement):如Copyright 2008 Google Inc. 

2) 许可版本(license boilerplate):为项目选择合适的许可证版本,如Apache 2.0 、BSD 、LGPL 、GPL ;

3) 作者(author line):标识文件的原始作者。

如果你对其他人创建的文件做了重大修改,将你的信息添加到作者信息里,这样当其他人对该文件有疑问时可以知道该联系谁。

文件内容 :

每一个文件版权许可及作者信息后,都要对文件内容进行注释说明。

通常,.h 文件要对所声明的类的功能和用法作简单说明,.cc 文件包含了更多的实现细节或算法讨论,如果你感觉这些实现细节或算法讨论对于阅读有帮助,可以把.cc 中的注释放到.h 中,并在.cc 中指出文档在.h 中。

不要单纯在.h .cc 间复制注释,复制的注释偏离了实际意义。

3. 类注释(Class Comments)

每个类的定义要附着描述类的功能和用法的注释。

// Iterates over the contents of a GargantuanTable.  Sample usage://    GargantuanTable_Iterator* iter = table->NewIterator();//    for (iter->Seek("foo"); !iter->done(); iter->Next()) {//      process(iter->key(), iter->value());//    }//    delete iter;class GargantuanTable_Iterator {...}

如果你觉得已经在文件顶部详细描述了该类,想直接简单的来上一句“完整描述见文件顶部”的话,还是多少在类中加点注释吧。

如果类有任何同步前提(synchronization assumptions),文档说明之。如果该类的实例可被多线程访问,使用时务必注意文档说明。

4. 函数注释(Function Comments)

函数声明处注释描述函数功能,定义处描述函数实现。

函数声明 :

注释于声明之前,描述函数功能及用法,注释使用描述式("Opens the file")而非指令式("Open the file");注释只是为了描述函数而不是告诉函数做什么。通常,注释不会描述函数如何实现,那是定义部分的事情。

函数声明处注释的内容:

1) inputs(输入)及outputs(输出);

2) 对类成员函数而言:函数调用期间对象是否需要保持引用参数,是否会释放这些参数;

3) 如果函数分配了空间,需要由调用者释放;

4) 参数是否可以为NULL 

5) 是否存在函数使用的性能隐忧(performance implications);

6) 如果函数是可重入的(re-entrant),其同步前提(synchronization assumptions)是什么?

举例如下:

// Returns an iterator for this table.  It is the client's// responsibility to delete the iterator when it is done with it,// and it must not use the iterator once the GargantuanTable object// on which the iterator was created has been deleted.//// The iterator is initially positioned at the beginning of the table.//// This method is equivalent to://    Iterator* iter = table->NewIterator();//    iter->Seek("");//    return iter;// If you are going to immediately seek to another place in the// returned iterator, it will be faster to use NewIterator()// and avoid the extra seek.Iterator* GetIterator() const

但不要有无谓冗余或显而易见的注释,下面的注释就没有必要加上“returns false otherwise”,因为已经暗含其中了:

// Returns true if the table cannot hold any more entries.bool IsTableFull()

注释构造/析构函数时,记住,读代码的人知道构造/析构函数是什么,所以“destroys this object”这样的注释是没有意义的。说明构造函数对参数做了什么(例如,是否是指针的所有者)以及析构函数清理了什么,如果都是无关紧要的内容,直接 省掉注释,析构函数前没有注释是很正常的。

函数定义 :

每个函数定义时要以注释说明函数功能和实现要点,如使用的漂亮代码、实现的简要步骤、如此实现的理由、为什么前半部分要加锁而后半部分不需要。

不要从.h 文件或其他地方的函数声明处直接复制注释,简要说明函数功能是可以的,但重点要放在如何实现上。

5. 变量注释(Variable Comments)

通常变量名本身足以很好说明变量用途,特定情况下,需要额外注释说明。

类数据成员 :

每个类数据成员(也叫实例变量或成员变量)应注释说明用途,如果变量可以接受NULL 或-1等警戒值(sentinel values),须说明之,如:

private:// Keeps track of the total number of entries in the table.// Used to ensure we do not go over the limit. -1 means// that we don't yet know how many entries the table has.int num_total_entries_

全局变量(常量) :

和数据成员相似,所有全局变量(常量)也应注释说明含义及用途,如:

// The total number of tests cases that we run through in this regression test.const int kNumTestCases = 6

6. 实现注释(Implementation Comments)

对于实现代码中巧妙的、晦涩的、有趣的、重要的地方加以注释。

代码前注释 :

出彩的或复杂的代码块前要加注释,如:

// Divide result by two, taking into account that x// contains the carry from the add.for (int i = 0; i < result->size(); i++) {x = (x << 8) + (*result)[i];(*result)[i] = x >> 1;x &= 1;}

行注释 :

比较隐晦的地方要在行尾加入注释,可以在代码之后空两格加行尾注释,如:

// If we have enough memory, mmap the data portion too.mmap_budget = max<int64>(0, mmap_budget - index_->length());if (mmap_budget >= data_size_ && !MmapData(mmap_chunk_bytes, mlock))return;  // Error already logged.

注意,有两块注释描述这段代码,当函数返回时注释提及错误已经被记入日志。

前后相邻几行都有注释,可以适当调整使之可读性更好:

...DoSomething();                  // Comment here so the comments line up.DoSomethingElseThatIsLonger();  // Comment here so there are two spaces between// the code and the comment....

NULL、true/false、1、2、3…… :

向函数传入、布尔值或整数时,要注释说明含义,或使用常量让代码望文知意,比较一下:

bool success = CalculateSomething(interesting_value,10,false,NULL);  // What are these arguments??

和:

bool success = CalculateSomething(interesting_value,10,     // Default base value.false,  // Not the first time we're calling this.NULL);  // No callback.

使用常量或描述性变量:

const int kDefaultBaseValue = 10;const bool kFirstTimeCalling = false;Callback *null_callback = NULL;bool success = CalculateSomething(interesting_value,kDefaultBaseValue,kFirstTimeCalling,null_callback);

不要 :

注意永远不要用自然语言翻译代码作为注释,要假设读你代码的人C++比你强:D:

// Now go through the b array and make sure that if i occurs,// the next element is i+1....        // Geez.  What a useless comment.

7. 标点、拼写和语法(Punctuation, Spelling and Grammar)

留意标点、拼写和语法,写的好的注释比差的要易读的多。

注释一般是包含适当大写和句点(.)的完整的句子,短一点的注释(如代码行尾的注释)可以随意点,依然要注意风格的一致性。完整的句子可读性更好,也可以说明该注释是完整的而不是一点不成熟的想法。

虽然被别人指出该用分号(semicolon)的时候用了逗号(comma)有点尴尬。清晰易读的代码还是很重要的,适当的标点、拼写和语法对此会有所帮助。

8. TODO注释(TODO Comments)

对那些临时的、短期的解决方案,或已经够好但并不完美的代码使用TODO 注释。

这样的注释要使用全大写的字符串TODO ,后面括号(parentheses)里加上你的大名、邮件地址等,还可以加上冒号(colon):目的是可以根据统一的TODO 格式进行查找:

// TODO(kl@gmail.com): Use a "*" here for concatenation operator.// TODO(Zeke) change this to use relations.

如果加上是为了在“将来某一天做某事”,可以加上一个特定的时间("Fix by November 2005")或事件("Remove this code when all clients can handle XML responses.")。

______________________________________

译者:注释也是比较人性化的约定了:

1. 关于注释风格,很多C++的coders更喜欢行注释,C coders或许对块注释依然情有独钟,或者在文件头大段大段的注释时使用块注释;

2. 文件注释可以炫耀你的成就,也是为了捅了篓子别人可以找你;

3. 注释要言简意赅,不要拖沓冗余,复杂的东西简单化和简单的东西复杂化都是要被鄙视的;

4. 对于Chinese coders来说,用英文注释还是用中文注释,it is a problem,但不管怎样,注释是为了让别人看懂,难道是为了炫耀编程语言之外的你的母语或外语水平吗;

5. 注释不要太乱,适当的缩进才会让人乐意看,但也没有必要规定注释从第几列开始(我自己写代码的时候总喜欢这样),UNIX/LINUX下还可以约定是使用tab还是space,个人倾向于space;

6. TODO很不错,有时候,注释确实是为了标记一些未完成的或完成的不尽如人意的地方,这样一搜索,就知道还有哪些活要干,日志都省了。

代码注释规范-google版本相关推荐

  1. PHP中类和文件的代码注释规范

    编写好的文档对于任何软件项目都至关重要,不仅是因为文档的质量可能比代码的质量更重要,还因为良好的第一印象会促使开发人员进一步查看代码以及后续的迭代. 文件注释 /*** Sample file com ...

  2. java 注释 超链接_java_Java代码注释规范详解,代码附有注释对程序开发者来 - phpStudy...

    Java代码注释规范详解 代码附有注释对程序开发者来说非常重要,随着技术的发展,在项目开发过程中,必须要求程序员写好代码注释,这样有利于代码后续的编写和使用. 基本的要求: 1.注释形式统一 在整个应 ...

  3. python代码大全中文注释_零基础小白必看篇:Python代码注释规范代码实例解析操作(收藏)...

    本文内容主要介绍了Python代码注释规范代码实例解析,通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下!!! 一.代码注释介绍 注释就是对代码的解释和说明 ...

  4. python代码_零基础小白必看篇:Python代码注释规范代码实例解析操作(收藏)

    本文内容主要介绍了Python代码注释规范代码实例解析,通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下!!! 一.代码注释介绍 注释就是对代码的解释和说明 ...

  5. java dao层编写及注释_JAVA代码注释规范

    2. 班级: 班级的目的,即班级完成的功能,以及班级的创建时间和作者姓名:当多个人一次编辑或修改同一个班级时, 作者姓名中应出现多个姓名: 3. 接口: 在满足类注释的基础上,接口注释应包含设置接口的 ...

  6. java的注释规范_Java代码注释规范

    1,单行(单行)-简短说明: ///... 单行注释: 代码中的单行注释. 最好在注释前有一个空行,并在其后加上与代码相同的缩进级别. 如果无法完成一行,则应使用块注释. 评论格式: 在行首注释: 在 ...

  7. golang 代码注释规范

    注释规范 包注释 每个包都应该有一个包注释,一个位于 package 子句之前的块注释或行注释.包如果有多个 go 文件,只需要出现在一个 go 文件中(一般是和包同名的文件)即可. 包注释应该包含下 ...

  8. python代码注释规范-Python编程规范之注释

    来源:计量经济学服务中心 经济金融及Python应用讲义 一.注释 1.为什么需要注释 如果代码的编写者在这里添加了备注说明,那么读者很快就能理解该段代码的含义了. 可以发现,在编写代码的过程中,我们 ...

  9. 代码注释规范之Doxygen

    一 Doxygen简介 Doxygen是一个程序的文档产生工具,可以将程序中的注释转换成说明文档或者说是API参考手册,从而减少程序员整理文档的时间.当然这里程序中的注释需要遵循一定的规则书写,才能让 ...

最新文章

  1. Python+Selenium学习笔记8 - 多表单多窗口切换
  2. xstream解析xml字符串和生成对象
  3. springboot中的拦截器interceptor和过滤器filter,多次获取request参数
  4. 南科大计算机系实力a,五大竞赛学科A+高校排行榜发布!北大实力碾压,科大赶超清华...
  5. C语言 · 数的读法
  6. 什么是大端序和小端序,为什么要有字节序
  7. word设置多级标题样式及编号
  8. CSS - font-size 设置小字体不生效解决方案(小于12px)
  9. 记一次小米手机安装Google Play(其他手机类似)
  10. vue+echarts平面地图和飞线
  11. 用div和css制作网页,DIVCSS网页设计总结:有用的3个网页制作_css
  12. 一周内,被闲鱼疯转2.6W次,最终被所有平台封杀!
  13. OpenCv-C++-SURF特征检测
  14. python简笔画绘制 数据驱动绘图恐龙_python:绘制枫叶简笔画
  15. springboot租房管理系统源码分享
  16. 某计算机桌面右下角本地连接图标变为,本地连接图标不见了怎么办【图文教程】...
  17. 如何快速判断IP被墙
  18. Linux服务器各应用版本信息查看总结
  19. 关于IntelliJ IDEA解决文件带BOM的问题
  20. arctanx麦克劳林公式推导过程_蔡勒(Zeller)公式及其推导:快速将任意日期转换为星期数...

热门文章

  1. 用户体验——减少用户的操作!
  2. 根据IP地址,子网掩码计算主机所在网络的网络地址和广播地址
  3. 不要成为自己讨厌的那种程序员
  4. DEDECMS最新5.7版在Windows下的Memcache安装
  5. 卸载或重新安装Redis集群
  6. 基于python的图形化邮件发送程序(支持添加附件)
  7. linux安装 Android Studio详细教程,支持性较差,需要安装最新底层库内核的linux
  8. laravel nosql
  9. 具有实际意义的5种云遣返
  10. 为什么不建议企业组织自行配置SD-WAN?—Vecloud微云