如何正确评论

How to properly comment

这是一个非常简单的问题,令我惊讶的是我在 SO 上没有找到其他任何地方。我想知道 哪些注释应该或不应该在 header/source 文件中 甚至,因为有些语言并不真正使用 header/source 系统,评论的正确方式是什么.

到目前为止,我一直都是这样做的:

main.c 或 main.cpp

int main()
{
    // Comments to describe what happens in main
}

foo.h

 // Comments for documentation and which gives information about the function itself

/**
* \fn void aFunction(void)
* \brief This function is a function
*/
void aFunction(void);

foo.c 或 foo.cpp

void aFunction(void)
{
    // Comments to describe and explain what happens within this function
}

这就是我所知道的。 main、source 或 header 中是否需要更多评论?我是否也应该添加我通常只放在源代码 header 中的评论,比如:

foo.c 或 foo.cpp

/**
* \fn void aFunction(void)
* \brief This function is a function
*/
void aFunction(void)
{
    // Comments to describe and explain what happens within this function
}

我知道这听起来可能很主观,但显而易见的事实是,有些开发者比其他开发者更擅长发表评论,因此发表评论的方式有好有坏。

C 文件应该包含您编写代码时随处编写的常用注释。它是做什么的,为什么。通常在每一行的末尾,除非需要更广泛的注释。

H 文件可以包含一个简短的最小值,解释一个函数将什么作为参数以及它returns。或者,它可以包含有关应如何使用该功能的完整文档。如果头文件中没有提供完整的文档,您将不得不单独编写。注意:几行 Doxygen 废话只是为了生成某种无用的 "documentation" 文件,不算作完整的文档。

H 文件记录了一个函数的作用以及应该如何使用它,但没有提及实现细节。重要的是要认识到 h 文件应该是相应 c 文件(或库)的完整、独立的接口。调用者需要知道的所有类型和依赖项(包括)都应该存在于 h 文件中。

这包括任何前置条件和 post 条件:调用函数之前需要执行什么?该功能使用了哪些资源?它是否留下了任何需要稍后清理的 handles/files/resources ?它是否改变了一些全局状态?等等等等

不一定向用户提供相应的 c 文件,用户也不需要阅读 c 文件以了解应如何使用其中的功能。仅从 h 文件中,一切都应该变得显而易见。

就个人而言,我的经验法则是尽可能避免评论。

尽可能做到这一点;

  • Make declarations in headers self-documenting by appropriate choice of type names, constants, enumerated values, function names, variable names, etc;
  • 使函数定义尽可能小和简单,尽可能清楚地说明它们是如何做的。 Make the functions as self-documenting as possible by appropriate choice of variable names, local types, etc etc. Break big functions into a set of smaller functions, and make ALL of the functions as self-documenting as possible.
  • 选择文件名(针对 headers 和编译单元)以便函数和声明的分组很明显。

然后仅在需要通过查看代码本身来解释不明显的内容时才使用注释。例如,最好解释为什么代码做某事,并允许代码本身描述 HOW。如果一个函数有特定的前提条件(当它被调用时假定为真)或 post 条件(当它 returns 如果满足前提条件时函数保证为真)那么这些可以被描述在评论中。

我不使用评论来跟踪版本历史记录(这就是版本控制系统的用途)。

有时无法以简单明了的方式编写代码。在这些情况下,需要评论。但是注释的问题(例如忘记更新它们,所以它们不再与代码对应)非常重要,最好努力工作,这样代码 - 没有注释 - 尽可能地描述自己。

这也意味着努力避免神秘代码。不要写有 25 个副作用的语句。缩进代码以使其与实际结构一致(代码格式化程序可以帮助实现这一点)。尽可能避免宏(因为它们可以做与范围不一致的事情)。