使用 Clang-format 确保代码的整洁和一致

428 位读者喜欢这篇文章。
code.org keynote address

Opensource.com

程序员常常低估一致的编码风格对于项目成功的重要性。它使代码库更易于阅读,减少了为修复不一致风格而进行的非功能性更改,并概述了代码提交的期望。大多数大型项目都有编码风格,一旦你工作了一段时间,你就会体会到风格一致性的价值。一些指定的风格示例包括大括号的位置、缩进使用制表符还是空格、缩进多少空格以及如何断长行。

使用 Clang-format

拥有一致的编码风格很重要,但描述它可能很麻烦,并且需要在代码审查中花费时间。Clang-format是我追踪了相当一段时间的一个代码格式化工具,以及它的几个前身。这个项目重用了clang中的语言解析器,这意味着它对 C++ 编程语言有一个坚实的模型,因此它不必像其他一些工具那样依赖正则表达式匹配。

---
# This configuration requires clang-format 3.8 or higher.
BasedOnStyle: Mozilla
AlwaysBreakAfterReturnType: None
AlwaysBreakAfterDefinitionReturnType: None
BreakConstructorInitializersBeforeComma: false
...

对于Tomviz,用于断层扫描数据的 3D 科学数据可视化软件,我将我们的格式文件基于CMake(一个用于构建和测试软件的工具)在最近的转换中使用的格式文件,并进行了一些小的调整。你可以简单地将 .clang-format 文件放在基本源代码目录中,该工具将从当前目录向上扫描,直到遇到此文件。然后我能够在我们所有的源文件上运行它,一位同事在我们的 GitHub 存储库中添加了一个自动化钩子,以验证提议的更改是否符合样式文件。现在所有的拉取请求都通过检查,如果测试失败,则提供必要的更改。这消除了审查拉取请求的编码风格的需要,并确保我们的代码库具有统一的风格。我们还使用flake8(一个风格指南执行工具)将其扩展到我们的 Python 代码。

开发人员可以轻松地将样式应用于他们的更改。我通常运行 clang-format -i path/to/changed.*,还有其他使用该工具的方法。现在来权衡一下关于大括号放置位置的争论,但我们选择站在 CMake 一边,并将大括号与语句放在同一行,以最大限度地保留垂直空间。ParaView数据分析和可视化项目刚刚合并了他们的 clang-format 更改,选择将大括号放在新的一行。VTK(Visualization Toolkit,一个 3D 计算机图形、图像处理和可视化软件)使用一个自定义脚本,该脚本也将它们放在新的一行。他们计划迁移到 clang-format。

自动化这些细节可以节省开发时间,同时仍然培养风格的统一性。clang-format 工具使我们能够以非常简洁的方式表达我们的代码风格,并且我们可以在提交更改之前轻松应用它。Clang-format 还理解并很好地配合 diffs/git 工作。我希望尽快了解一下clang-tidy,因为我正在寻找一种可以自动检查一些更深层次的 C++ 编码风格问题的工具,例如优先使用新的 C++11 语言特性。

这些工具使新开发人员的创造过程更容易,因为他们只需运行该工具即可获得大部分正确的格式,而无需阅读任何给定项目的冗长的编码风格文档。它还消除了一些在审查中可能被忽略或因对风格指南的不同解释而产生的边缘情况。这些工具是相当特定于语言的,但我鼓励你考虑在你的开发工作流程中采用它们(或在可用的情况下使用等效工具)。

总结

永远不要使用制表符,始终使用空格。Vim 当然是唯一真正的文本编辑器。而且作为家养宠物,狗比猫更优秀。

Marcus D. Hanwell
Marcus D. Hanwell | Marcus 领导 Open Chemistry 项目,开发用于化学、生物信息学和材料科学研究的开源工具。

5 条评论

作为“总结”的证明 --

% man dog
DOG(1) 用户手册 DOG(1)

名称
dog - 比 cat 更好

概要
dog [-AbBeEnstTuv] [-w cols] [-l lines] [--show-all] [--number-nonblank]
[--no-blanks] [--bind=port] [--dos] [--show-ends] [--hang-up] [--images]
[--krad] [--links] [--lower] [--mac] [--number] [--no-header] [--squeeze-blank]
[--strfry] [--sock=domain:port] [--sock-test] [--show-tabs] [--raw] [--rot=num]
[--udp] [--unix] [--upper] [--show-nonprinting] [--hide-nonprinting] [--help]
[--hex] [--skip-tags] [--oog] [--version] 文件 | URL | -

描述
dog 将每个给定的文件、URL 或标准输入(如果没有给定或当给定的文件名为 '-' 时)的内容写入
标准输出。它当前
支持文件、http 和原始 URL 类型。它被设计为 cat(1) 的兼容但增强的
替代品。

“永远不要使用制表符,始终使用空格。Vim 当然是唯一真正的文本编辑器。而且作为家养宠物,狗比猫更优秀。”

你最后两句话毁了这一切,唉。在那之前我还是同意你的。

感谢这篇文章。我以前不知道 flake8 工具。

Creative Commons License本作品采用知识共享署名 4.0 国际许可协议进行许可。
© . All rights reserved.