提高代码质量的指南

10
你在改进代码质量方面遵循哪些准则?许多人有关于如何编写C++代码的规则(据说)使其难以出错。我见过一些人坚持每个 if 语句后面都要有一个大括号块({...})。
我对其他人遵循的准则及其背后的原因感兴趣。我还对你认为是垃圾但普遍存在的指南感兴趣。有人能提出几个建议吗?
为了掀起热潮,我将先提出一些:
- 每个if / else语句后都要使用大括号(如上所述)。其背后的理由是,不总是容易判断单个语句是否实际上是一个语句,还是扩展为多个语句的预处理器宏,因此这段代码将中断:
``` // top of file: #define statement doSomething(); doSomethingElse // in implementation: if (somecondition) doSomething(); ```
但是如果您使用括号,则可以按预期工作。
- 仅用于条件编译的预处理器宏。预处理器宏可能会引起各种麻烦,因为它们不允许C++作用域规则。由于头文件中具有常见名称的预处理器宏,我曾多次被搞乱了。如果您不小心,可能会引起各种骚乱!
现在轮到你了。
21个回答

9

以下是我个人的几个喜欢的:

努力编写 常量正确 的代码。这将使编译器帮助我们消除易于修复但有时很痛苦的错误。你的代码也会讲述你在编写它时所想的故事 - 对于新手或维护者来说非常有价值。

不要再管内存管理的事情了。学会使用智能指针:std::auto_ptrstd::tr1::shared_ptr(或 boost::shared_ptr)和 boost::scoped_ptr。学习它们之间的区别,以及何时使用其中一个而不是另一个。

你可能会使用标准模板库。阅读 Josuttis 书籍。不要仅停留在容器的前几章,认为你已经了解了STL。继续深入到好东西:算法和函数对象。


9
  1. 删除不必要的代码。

就这样。


1
然后我会收到编译器错误:unnecessaryFunction()未定义。 - Camilo Martin
使用递归删除函数删除所有不必要的代码,可以获得额外的积分。 - HopelessN00b

7
  • 使用并强制执行统一的编码风格和指南。原因:团队或公司内的每个开发人员都能够阅读代码,避免由于不同的括号风格等问题而分散注意力。
  • 定期对整个源代码进行完全重建(即每日构建或每次提交后构建),并报告任何错误!原因:源代码几乎总是处于可用状态,并且问题在“实现”后不久就被检测到,此时解决问题的代价较小。

7

在你的编译器中开启所有警告(gcc: -Wall 是一个好的起点,但不包括所有内容,所以请查阅文档),并将它们设为错误,这样你就必须修复它们(gcc: -Werror)。


5

在这些答案中提到的Google样式指南非常可靠。其中有一些无意义的东西,但好的方面比坏的方面多。

Sutter和Alexandrescu写了一本不错的书,名为《C++编码标准》。

以下是我自己的一些通用提示:

  1. 您的缩进和括号风格都是错误的。其他人也是如此。因此,请遵循项目的标准。放下你的个人偏见,并设置编辑器,使所有内容与代码库的其余部分尽可能一致。阅读缩进不一致的代码真的非常烦人。话虽如此,括号和缩进与“改善您的代码”没有任何关系。它更多地涉及改善您与他人合作的能力。

  2. 注释要充分。这非常主观,但总的来说,最好写关于代码为什么工作的注释,而不是解释它做了什么。当然,对于复杂的代码,让那些不熟悉算法或代码的程序员了解它正在做什么也很好。链接到所使用的算法的描述非常受欢迎。

  3. 以尽可能简单明了的方式表达逻辑。具有讽刺意味的是,像“将常量放在比较的左侧”这样的建议在这里出了问题。它们非常受欢迎,但对于英语为母语的人来说,它们经常打破那些阅读者的逻辑流程。如果您不能信任自己(或编译器)正确地编写相等比较,请务必使用此类技巧。但是,这样做会牺牲清晰度。还包括像“我的逻辑是否有3个缩进级别?它可以更简单吗?”以及将类似的代码整合到函数中。甚至可能拆分函数。编写优雅地表达基础逻辑的代码需要经验,但值得努力。

以上是相当通用的提示。对于具体的提示,我无法做得比Sutter和Alexandrescu更好。


我不做C++,但是现代IDE是否有设置来强制缩进样式或者插件可以实现这种代码美化呢? - Camilo Martin

4
在if语句中,将常量放在左边,即:

if语句中将常量放在左侧。

if( 12 == var )

不是

if( var == 12 )

因为如果您错过了输入'=',那么它就会变成赋值。在顶部版本中,编译器会提示这是不可能的,在后者中则运行,并且if语句始终为真。

如果if语句不在同一行上,则我会使用大括号。

if( a == b ) something();
if( b == d )
{
    bigLongStringOfStuffThatWontFitOnASingleLineNeatly();
}

花括号应该总是单独成行。但这当然是个人约定。


我同意将常量放在左边可以防止漏写等号...但我从未能够采用它。以另一种方式编写代码更自然。幸运的是,大多数编译器都有一个设置来警告“if(a=b)”结构。 - Rob Walker
这就是我喜欢VB.Net的原因之一。If语句不接受赋值,你只需使用等号进行赋值和测试相等性。这使得代码有些冗长,但意味着许多这些错误根本不会发生。 - Kibbee

4

只有在必要的情况下,才进行注释以解释代码正在做什么,如果通过阅读代码无法得出相同的结论。

不要注释掉你不再使用的代码。如果你想恢复旧代码,请使用源代码管理系统。注释掉代码只会让事情变得混乱,并使你真正重要的注释淡化为注释代码的背景噪音。


3
  1. 使用一致的格式。
  2. 在处理旧代码时,应采用现有的格式风格,特别是大括号的风格。
  3. 获取Scott Meyer的书Effective C++的副本。
  4. 获取Steve MConnell的书Code Complete的副本。

3

Google内部还有一个很好的C++风格指南,其中包含了大部分在这里提到的规则。


2

开始写很多注释--但利用这个机会重构代码,使其自我解释。

例如:

for(int i=0; i<=arr.length; i++) {
  arr[i].conf() //confirm that every username doesn't contain invalid characters
}

应该更像是这样的:
for(int i=0; i<=activeusers.length; i++) {
  activeusers[i].UsernameStripInvalidChars()
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接