使用 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(可视化工具包,一种 3D 计算机图形、图像处理和可视化软件)使用自定义脚本,该脚本也将它们放置在新行上。 他们计划迁移到 clang-format。

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

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

总结

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

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

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.