CGAL项目代码规范与开发指南详解

CGAL项目代码规范与开发指南详解

cgal The public CGAL repository, see the README below cgal 项目地址: https://gitcode.com/gh_mirrors/cg/cgal

前言

作为计算几何算法库的标杆项目,CGAL(Computational Geometry Algorithms Library)在代码组织和规范方面有着严格的要求。本文将深入解析CGAL项目的代码规范体系,帮助开发者理解并遵循这些规范,从而为项目贡献高质量的代码。

命名规范体系

通用命名规则

CGAL采用了一套独特的命名体系,主要特点包括:

  1. 下划线分隔:除概念(concept)外,所有名称都应使用下划线分隔单词,如function_nameClass_name
  2. 概念命名特殊规则:概念名称使用大写字母分隔单词,如ConvexHullTraits_2
  3. 避免缩写:尽可能使用完整单词,如使用Triangulation而非Tri
  4. 常量命名:全部大写,如ORIGIN
  5. 类名首字母大写:如Quotient, Orientation
  6. 函数名全小写:如is_zero()
  7. 布尔函数命名:应以动词开头,如is_empty()而非empty()
  8. 宏命名:必须以CGAL_开头

几何对象命名

几何对象的命名有其特殊性:

  • 必须包含维度后缀,如Vector_2Plane_3
  • 对于动态维度对象,使用_d后缀,如Point_d
  • 静态维度对象则使用模板参数指定维度,如Point<d>

几何数据结构和算法

  1. 数据结构命名应反映其维度,如Triangulation_2
  2. 算法函数名应包含维度,如convex_hull_3()
  3. 谓词成员函数应以is_has_开头
  4. 访问器函数应使用STL风格的命名:
    • vertices_begin()返回Vertex_iterator
    • edges_circulator()返回Edge_circulator

内核特性命名

内核特性(Kernel traits)的命名最为复杂,分为四大类:

  1. 广义谓词:以结果命名,如Has_on_bounded_side_2
  2. 构造对象:模式为Construct_type_d,如Construct_point_2
  3. 构造过程
    • 构造几何对象:Construct_前缀,如Construct_perpendicular_vector_2
    • 计算非几何值:Compute_前缀,如Compute_area_2
  4. 操作符替代:如Equal_2替代operator==

每个特性类还应提供返回其实例的成员函数,命名规则为小写的特性名加_object后缀,如less_xy_2_object()

文件命名规范

  1. 单个几何对象/数据结构/算法应放在同名文件中,如Triangulation_2.h
  2. 不包含单一类的文件不应以大写字母开头
  3. 文件名在大小写不敏感系统中也应保持唯一
  4. 避免使用特殊字符(:, *, 空格等)
  5. 内部头文件应放在Package/internal/目录下

编程规范要求

必须遵守的规则

  1. 模板参数typedef:应为所有可能被外部访问的模板参数提供typedef

    template <class GeometricTraits_2>
    class Something {
    public:
        typedef GeometricTraits_2 Geometric_traits_2;
    };
    
  2. const正确性

    • 不修改的引用参数应标记为const
    • 不修改对象状态的成员函数应标记为const
    • 概念上const但实际需要修改内部缓存的可使用mutable成员
  3. C++风格转型:优先使用static_cast等C++风格转型

  4. 头文件保护:必须使用预处理指令防止多重包含

    #ifndef CGAL_THIS_IS_AN_EXAMPLE_H
    #define CGAL_THIS_IS_AN_EXAMPLE_H
    // 内容...
    #endif // CGAL_THIS_IS_AN_EXAMPLE_H
    

推荐实践

  1. 谨慎使用#define
  2. 不要重定义C++基础类型
  3. 重载调用时确保精确匹配
  4. 全局函数调用时应显式指定命名空间

代码格式规范

  1. 缩进至少两个空格
  2. 每行只写一个语句
  3. 使用C++风格注释(//)

文件头规范

每个CGAL源文件必须包含标准文件头,包含以下内容:

  1. 版权声明(所有修改年份和版权所有者)
  2. 自动扩展的关键字:
    • $URL$:文件规范路径
    • $Id$:文件所属版本
  3. SPDX许可证标识符:
    • GPL-3+: SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial
    • LGPL-3+: SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial
  4. 作者列表(含可选联系信息)

示例头(GPL版本)

// Copyright (c) 1999,2000,2001,2002 INRIA Sophia-Antipolis (France).
// All rights reserved.
//
// This file is part of CGAL (www.cgal.org).
//
// $URL$
// $Id$
// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial
//
// Author(s)     : Monique Teillaud <Monique.Teillaud@sophia.inria.fr>
//                 Sylvain Pion

示例头(LGPL版本)

// Copyright (c) 2000,2001,2002,2003 Utrecht University (The Netherlands),
// ETH Zurich (Switzerland),
// INRIA Sophia-Antipolis (France),
// Max-Planck-Institute Saarbruecken (Germany),
// and Tel-Aviv University (Israel). All rights reserved.
//
// This file is part of CGAL (www.cgal.org)
//
// $URL$
// $Id$
// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial
//
// Author(s)     : Herve Bronnimann, Sylvain Pion

总结

CGAL的代码规范体系既考虑了代码的一致性和可维护性,也兼顾了与STL的兼容性。开发者应特别注意:

  1. 严格遵守命名规范,特别是概念与类的区分
  2. 确保const正确性
  3. 为模板参数提供适当的typedef
  4. 文件头信息必须完整准确
  5. 代码格式统一规范

这些规范不仅是形式上的要求,更是保证CGAL代码质量和长期可维护性的重要基础。

cgal The public CGAL repository, see the README below cgal 项目地址: https://gitcode.com/gh_mirrors/cg/cgal

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

曹艺程Luminous

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值