Apache Gluten C++代码规范:参与开源项目的必备开发指南
Apache Gluten C代码规范参与开源项目的必备开发指南【免费下载链接】glutenGluten is a middle layer responsible for offloading JVM-based SQL engines execution to native engines.项目地址: https://gitcode.com/GitHub_Trending/glu/glutenApache Gluten是一个负责将基于JVM的SQL引擎执行卸载到原生引擎的中间层其C代码规范是确保项目代码质量、可维护性和协作效率的关键。本文将详细介绍Gluten项目的C编码规范帮助开发者快速掌握参与该开源项目的必备开发知识。一、Gluten C代码规范的核心哲学Gluten C代码规范的核心哲学是编写符合ISO标准的C代码优先使用标准API保持代码的一致性、简洁性和可读性。代码编写应优化读者体验遵循“先实现功能再优化性能”的原则避免引入不必要的复杂性。这些哲学思想贯穿于代码规范的各个方面是开发者在编写代码时需要时刻牢记的准则。二、代码格式化与命名规范2.1 代码格式化Gluten项目使用clang-format-15来统一代码格式包括间距、行宽、缩进和包含顺序等。项目提供了dev/formatcppcode.sh脚本用于格式化Velox后端的C代码。对于CMake文件如CMakeLists.txt和*.cmake则需要使用cmake-format进行格式化可通过以下命令安装和使用apt install python3-pip -y pip3 install --user cmake-format cmake-format --first-comment-is-literal True --in-place cpp/velox/CMakeLists.txt2.2 命名规范命名规范是代码可读性的重要保障Gluten项目的命名规则如下类型类、结构体、枚举、类型别名、类型模板参数和文件名使用PascalCase。函数、成员变量、局部变量和非类型模板参数使用camelCase。私有和受保护成员变量使用camelCase_。命名空间名称和构建目标使用snake_case。宏使用UPPER_SNAKE_CASE。静态常量和枚举器使用kPascalCase。三、源文件与头文件规范3.1 文件命名与结构所有头文件必须使用#pragma once进行单包含保护。头文件后缀统一为.h源文件后缀统一为.cc。一个文件应包含一个主要类文件名与主要类名保持一致明显的例外是用于定义各种杂项函数的文件。如果头文件有对应的源文件它们应具有相同的文件名只是后缀不同例如a.h和a.cc。3.2 头文件包含规则包含必要的头文件确保源文件.cc仅包含#include test.h就能成功编译无需包含其他头文件。不包含任何不必要的头文件因为包含越多编译速度越慢。简而言之不多不少恰到好处。四、类与函数设计规范4.1 类设计基类名称不以Base结尾使用Backend而不是BackendBase。确保一个类只做一件事遵循单一职责原则。区分接口和实现使实现私有化。设计类层次结构时区分接口继承和实现继承确保公有继承表示“is-a”关系私有继承表示“implements-with”关系。不要无故将函数设为virtual确保多态基类有virtual析构函数使用override明确表示重写。图Gluten ClickHouse后端架构展示了Gluten在SQL引擎执行卸载中的作用4.2 函数设计使函数简短而简单性能敏感的代码路径除外调用有意义的函数比编写过多内联语句更易读。给函数起一个好名字判断函数名是否好的标准是大声读出来感觉流畅参数能表示的信息不应编码到函数名中例如使用get(size_t index)而不是getByIndex。一个函数应专注于单一逻辑操作并且要名副其实既要完成函数名所涵盖的所有事情又不要做函数名未涵盖的任何事情。五、变量、常量与宏规范5.1 变量变量名应简单且有意义不要将所有变量都分组在作用域顶部这是过时的习惯应尽可能在靠近使用点的地方声明变量。5.2 常量优先使用const变量来定义常量值而不是使用预处理器#define。如果需要表示空指针某个T的T*始终使用nullptr否则对于零值使用0。5.3 宏宏会降低可读性、扰乱思维并影响调试且有副作用应谨慎使用。考虑使用const变量或inline函数替换宏考虑使用do {...} while (0)包裹宏定义避免直接使用第三方库宏。六、命名空间与资源管理6.1 命名空间不要在头文件中使用using namespace xxx可以在源文件中使用但仍不鼓励。所有Gluten C代码都应放在namespace gluten下因为一级命名空间足够嵌套命名空间会带来混乱。推荐使用匿名命名空间来定义文件级别的类、函数和变量用于放置文件作用域的静态函数和变量。6.2 资源管理使用句柄和RAII自动管理资源将显式资源分配的结果立即交给管理器对象。优先使用作用域对象和栈对象原始指针T*表示单个对象pointer size_t表示数组对象如果不想使用容器。原始指针T*和原始引用T是非拥有的理解unique_ptr、shared_ptr、weak_ptr的区别优先使用unique_ptr需要共享所有权时使用shared_ptr使用make_unique和make_shared创建智能指针仅在需要明确表达生命周期语义时将智能指针作为参数一般情况下使用T*或T参数而非智能指针。七、异常处理与代码注释7.1 异常处理C标准中的异常规范变化较大在Gluten中应谨慎使用异常优先使用返回码而不是抛出异常优先编译时检查而不是运行时检查封装复杂的构造函数而不是在代码中传播。7.2 代码注释添加必要的注释并非越多越好也不是越少越好。好的注释能使晦涩的代码易于理解对于非常明显的代码则无需添加注释。八、开发环境配置正确配置开发环境是遵循代码规范的前提以下是CLion中工具链和CMake的配置示例图CLion工具链配置展示了默认工具链的设置包括CMake、构建工具、C/C编译器和调试器等图CMake配置展示了Release配置文件的设置包括构建类型、工具链、生成器和CMake选项等九、总结遵循Apache Gluten C代码规范对于参与该开源项目至关重要它有助于提高代码质量、可维护性和协作效率。开发者应牢记代码规范的核心哲学严格遵守代码格式化、命名规范、源文件与头文件规范等各方面的要求。更多详细内容可参考官方文档docs/developers/CppCodingStyle.md。通过不断实践和学习开发者可以更好地为Gluten项目贡献力量。【免费下载链接】glutenGluten is a middle layer responsible for offloading JVM-based SQL engines execution to native engines.项目地址: https://gitcode.com/GitHub_Trending/glu/gluten创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考