当涉及到代码文档时,通常认为代码应该自我解释,并且内联代码文档(不包括公共 API 文档)应该只解释元代码问题,例如解决方法、解释为什么选择特定实现等。
您如何使您的代码更具可读性和更多解释性?
编辑: 除了一般评论外,我还在寻找具体的提示。因此,如果您说“简短但有意义的变量名”,如果您也能得到一个有用的提示(例如“使用三字原则”),那就太好了。
当涉及到代码文档时,通常认为代码应该自我解释,并且内联代码文档(不包括公共 API 文档)应该只解释元代码问题,例如解决方法、解释为什么选择特定实现等。
您如何使您的代码更具可读性和更多解释性?
查看 Jeff Atwood 的Code Smells博客文章。它几乎总结了它。当谈到可读性好的代码时,我将添加我的个人精神:
/* finished */
之前的评论一样return true;
。说真的,有什么意义呢?大多数(好的)代码可以自我解释;来自'uncle bob' 的书清洁代码通过动手示例为您提供了函数应该是什么样子的一个很好的概述。
一些重要的点:
这本书还有很多小规则,我真的很推荐它。还可以获取 Code Complete 2。
自记录代码是:
但是请记住,即使是最自我记录的代码也只能记录那里的内容。永远不要故意遗漏、优化、尝试和丢弃的东西等。基本上,在源文件中,您总是需要英语,否则您必然会遗漏重要的警告和设计决策。
我通常不会在代码内部发表评论,但是我完全不同意人们经常持有的观点,即一个人应该只编写可读的代码,然后你就不需要文档。
我认为应该记录的是您的界面。我的意思是在类和方法之上应该有注释。当然不是像 set 和 get 这样的简单方法。
使用您编写的类和方法的人不必阅读您的代码即可了解如何使用它们。所以我认为应该记录什么是合法的输入和输出范围以及重要的不变量。例如,函数将指针作为参数。无论您如何为函数命名,提供 NULL 是否有效或 NULL 是否是有效的返回结果都不是很明显。通常,-1 和 0 用于表示某些东西,例如搜索未找到的对象或类似的东西。这应该记录在案。
除此之外,我认为记录代码的关键不是记录一个类或方法做了什么或是什么,而是记录它背后的意图是什么。
在你和你的同事之间有一个编码约定。从缩进开始,覆盖括号直到“大括号从哪里来:新行,同一行?”
在 Visual Studio 中,可以选择并修复此样式。它可以帮助您团队中的所有其他人阅读相同的代码。当您不必区分“空”编辑(样式更改)和实际编辑时,它还使版本控制系统中的历史跟踪变得更加容易。
坚持在您正在编码的环境中使用的范例。
一个明显的例子是 .NET 中的方法使用 Pascal 案例,Java 中的骆驼案例。
不太明显的示例与使用与标准类库中使用的约定相同的约定有关。
这个目标有很多话要说。命名约定为人类传达了很多信息,而对编译器来说却很少。任何在一个环境中使用过使用另一种环境约定的 API 的人都会注意到外来代码有多么突出。
一致性是一个有价值的特性,它可以减少人类代码使用者的认知负担。
避开代码垃圾。
Edward Tufte有这个美丽而强大的图表垃圾概念,图表中的视觉元素会产生噪音而不是信息。通过以这种方式思考图表,我们可以制作更清晰的图表。
我认为同样的想法,应用于代码,给我们带来了更清晰的代码。示例包括/* getFoo() gets the foo */
- 样式的注释、不必要的圆括号和大括号、过于具体的变量名称和匈牙利符号缺陷。
什么构成图表垃圾取决于团队、环境和项目——有些人喜欢疣;某些环境以使某些垃圾有用的方式呈现代码(// end for
例如考虑大括号匹配和注释);一些项目需要更广泛的注释以符合标准或全面记录 API。但是,当一个团队建立了 chartjunk 对其项目意味着什么的标准时,许多决策变得更加容易,并且其代码变得更加一致和更具可读性。
所有回复(和问题)都基于这样的假设,即可读性完全是代码编写者的责任。如果你真的不想阅读代码并且你有一个现在放弃阅读列表(代码有异味),它匹配 99% 的可用代码并且你实际上甚至不想非常努力地思考某些代码在做什么,那么您将找不到任何可读的代码。
无论我们今天使用什么规则来使我们的代码更具可读性,在 10 年后都会显得过时和愚蠢。如果您真的想要更好的代码可读性,请阅读一些旧代码(考虑到当时的时尚,它必须在您拥有的速度和内存的 1000 倍的机器上运行),努力理解它并鼓励其他人做同样的事情。