Skip to content

Latest commit

 

History

History
96 lines (72 loc) · 4.04 KB

regulations.md

File metadata and controls

96 lines (72 loc) · 4.04 KB

NEWorld 多人协作开发规范

前言

为了提高团队协作的工作效率、避免不必要的麻烦,各位开发人员有必要遵守一些规则。

第一节 代码文件规范

  1. 所有代码和文本文件都使用**UTF-8(无BOM)**编码,末尾要加空行。
  2. 严禁擅自修改许可证。

第二节 Git使用及GitHub使用规范

  1. 进行push操作时请仔细检查,不要上传目标代码二进制文件。
  2. 严禁恶意上传大文件或二进制文件,或者恶意修改他人代码,否则将施以严厉处罚。
  3. 所有分支都应属于项目的一部分,除releases分支外都应计划最终合并到主分支。
  4. 经常浏览issues,解决属于你范围的issues。
  5. 当本地与远程的commit历史出现差异时,使用rebase而不是merge
  6. 文档编写者应尽自己所能使别人能清晰地看出你想表达什么。文档包括但不限于Markdown格式的所有文件,doc目录下的所有文件,提交说明,里程碑说明,Release说明,代码注释。要善于利用格式。

第三节 合作开发规范

  1. 请开发人员加入NEWorld开发组的QQ群以便交流,群号为308354849。
  2. 确保主要开发人知晓并同意你要做的大修改(包括但不限于重构,加入新库)。
  3. 若覆写Git库,请通知其他开发者。

第四节 C/C++代码规范

4.1 缩进风格

  1. 所有代码使用4个空格缩进。
  2. 原则上使用Allman/BSD代码风格,namespace中的代码需要缩进(astyle参数--style=allman --indent=spaces=4 --indent-namespaces --keep-one-line-blocks --indent-preproc-block --indent-preproc-define --mode=c)。

4.2 代码编写

  1. 使用enum class而不是enum
  2. 不出现除了常量外的全局变量(包括在namespace内),常量应该尽可能定义为constexpr,必须定义为const。
  3. 当A类方法内部需要调用B类方法时,向A类方法传入B类实例的引用,而不是使用全局变量或工厂模式。
  4. 不允许在commit中出现临时系统架构实现,必须包含类架构,即使方法未实现。
  5. 除非别无他法或者影响可读性,不允许实现写在头文件中。
  6. 在大多数情况下优先考虑通用性和可扩展性而非效率。
  7. 使用正确的C/C++语法和规则编写正确的C/C++代码,每个人对自己写的代码负责。
  8. 应该对所有可能的情况和边界条件都做出错误检测,包括但不限于:
  • 文件不存在
  • 类型越界
  • enum越界
  • nullptr指针解引用
  • 错误的输入

4.3 命名风格

按优先级从低到高排序

  1. Using别名、类名、结构名、枚举名使用大驼峰。
  2. 函数名(含类方法)、变量名(含结构成员)、枚举值使用小驼峰。
  3. 类私有变量使用m加大驼峰。

4.4 代码注释

  1. 函数要在声明前一行加注释说明其功能;推荐在大段代码中在某些位置加注释以说明代码。
  2. 不出现不能达到说明代码、注明功能、防止分歧的目的的注释,以及无用注释(License除外)。
  3. 尽量编写不需要注释就能简单理解的代码和系统架构。

4.5 特别声明

  1. 如果不能保证错误不会造成影响,相比于让程序继续执行直到崩溃,应该让程序立刻退出并给出足够的信息,实例:
  • delete一个指针后,除非以此为判断依据,否则不要把指针值置为nullptr,这会隐藏导致多次delete的逻辑错误。
  1. 如果一个功能因为没有被实现或者已知问题导致无法正确执行,若此功能不会影响全局,应提示并继续执行,否则遵循1。
  2. PluginAPI 使用C语言格式。

4.6 外部依赖库

确保你使用的库都是可以跨平台(Windows, Linux, OSX)的。

4. 代码示例

namespace Hashing
{
    class MyHash
    {
    public:
        MyHash();
    private:
        int mPrivate;
    };
    
    void initCRC32Table()
    {
        if(CRC32TableInitialized)
        {
            return;
        }
        // ...
    }
}