Skip to main content

代码规范

C/C++代码规范

  1. 通用规则:

    保持统一的程序书写方式而避免个人风格,只在文件的开头描述部分署名;

    接口部分的函数和属性命名尽量不要使用缩写

    控制程序的每一行不要超过80个字节

  2. 内存管理:

    为了检测内存泄漏和保证跨模块内存引用的安全性,可以使用以下方法申请和释放内存:

    申请和释放未初始化的内存:CORE_ALLOCCORE_FREE

    生成和删除对象:CORE_NEWCORE_DELETE

    如果有内存泄漏,系统退出时会在运行目录下生成内存泄露日志(mem_leak.log),里面包含详细的内存泄漏信息。

补充:

符号说明:

____表示Tab

▲表示空格

  1. 变量定义

    数据成员局部变量 风格一局部变量 风格二
    bool▲m_bLoop;bool▲bLoop▲=▲false;bool▲loop▲=▲false;
    int▲m_nTotalSize;int▲nTotalSize▲=▲0;int▲total_size▲=▲0;
    char▲m_strFileName[32];char▲strFileName[32];char▲file_name[32];
    char*▲m_strFileName;char*▲pstrFileName▲=▲NULL;char*▲file_name▲=▲NULL;
    float▲m_fTotalSeconds;float▲fTotalSeconds▲=▲0.0ffloat▲total_seconds▲=▲0.0f
    double▲m_dTotalSeconds;double▲dTotalSeconds▲=▲0.0double▲total_seconds▲=▲0.0
    D3DXVECTOR3▲m_vPos;D3DXVECTOR3▲vPos(0.0f,▲0.0f,▲0.0f);D3DXVECTOR3▲pos(0.0f,▲0.0f,▲0.0f);
    D3DXMATRIX▲m_mtxWorld;D3DXMATRIX▲mtxWorld;D3DXMATRIX▲world;
    IEntity*▲m_pEntity;IEntity*▲pEntity▲=▲NULL;
  2. 运算符

    运算符前后保留一个空格,例如:

    int▲a▲=▲b▲+▲c;
  3. 换行

    遇到换行时,运算符要在下一行,例如:

    int▲a▲=▲xxxxxxxxxxxxxxxxxxx▲+▲xxxxxxxxxxxxxxxxxxx▲
    ____+▲xxxxxxxxxxxxxxxxxxx;

    if▲((xxxxxxxxxxxxxxxxxxx)▲&&▲(xxxxxxxxxxxxxxxxxxx)▲
    ____&&▲(xxxxxxxxxxxxxxxxxxx)▲&&▲(xxxxxxxxxxxxxxxxxxx))
    {
    }
    else▲if▲()
    {
    }

    声明处换行格式:

    //▲读取自定义材质数据
    return_string▲GetCustomMaterialValue(const▲char*▲mat_name,▲
    ____const▲char*▲key);

    定义处换行格式:

    return_string▲Model::GetCustomMaterialValue(const▲char*▲mat_name,▲
    ____const▲char*▲key)
  4. 处理不同内容的代码段,用空行分隔

  5. 注释

    1)单行注释后有一个空格,例如:

    //▲注释

    2)Get类型属性注释和声明

    ///▲readonly: string Name
    ///▲\brief 名称
    DECLARE_PROPERTY_GET(const▲char*,▲Model,▲Name,▲GetName);

    //▲名称
    const▲char*▲GetName()▲const;

    3)Get、Set属性注释和声明

    ///▲property: bool AsyncLoad
    ///▲\brief 是否异步加载
    DECLARE_PROPERTY(bool,▲Model,▲AsyncLoad,▲GetAsyncLoad,▲SetAsyncLoad);

    //▲是否异步加载
    void▲SetAsyncLoad(bool▲value);
    bool▲GetAsyncLoad()▲const;

    4)定参方法的注释和声明

    ///▲method: bool SetSpeed(float speed)
    ///▲\brief 设置播放速度
    ///▲\param speed 速度(正常速度为1.0)
    DECLARE_METHOD_1(bool,▲Model,▲SetSpeed,▲float);

    //▲设置播放速度
    bool▲SetSpeed(float▲speed);

    5)不定参方法的注释和声明

    ///▲method: [x, y, z] GetHelperPosition(string group, string name)
    ///▲\brief 获得辅助点的当前位置
    ///▲\param group 辅助点组名
    ///▲\param name 辅助点名字
    DECLARE_METHOD_N(Model,▲GetHelperPosition);

    //▲获得辅助点的当前位置
    void▲GetHelperPosition(const▲IVarList&▲args,▲IVarList&▲result);

    6)返回表的实体方法的注释和声明

    ///▲method: table GetHelperNameList()
    ///▲\brief 获得所有的辅助点的名字列表
    DECLARE_METHOD_T(Model,▲GetHelperNameList);

    //▲获得辅助点名字列表
    void▲GetHelperNameList(const▲IVarList&▲args,▲IVarList&▲result);
  6. 注意自己的Tab键,设置好自己的编辑工具,与项目统一,注意排版整齐。

脚本代码规范

  1. 在界面编辑器中,自动生成的函数名可以略做修改,但不能删除关键字

    符合要求示例:xxx_btn_click; xxx_checked_changed; xxx_edit_lost_focus; xxx_edit_drag

    xxx表示功能、属性等用于描述的关键字

  2. 关键字后的空格要求

    if while for 等后面有一个空格

  3. 运算符

    运算符前后保留一个空格,例如:

    local▲a▲=▲b▲+▲c

    遇到换行时,运算符要在下一行,例如:

    local▲a▲=▲xxxxxxxxxxxxxxxxxxx▲+▲xxxxxxxxxxxxxxxxxxx▲
    +▲xxxxxxxxxxxxxxxxxxx

    if▲(xxxxxxxxxxxxxxxxxxx)▲and▲(xxxxxxxxxxxxxxxxxxx)▲
    and▲(xxxxxxxxxxxxxxxxxxx)▲and▲(xxxxxxxxxxxxxxxxxxx)▲then
    --......
    end
  4. 定义/声明变量的代码段要作为单独的一段,定义/声明变量段后加一行空行

    local▲x▲=▲1
    local▲y▲=▲1

    if▲......
  5. 处理不同内容的代码段,用空行分隔

  6. 脚本注释后不要空格,例如:

    --注释;区别于C/C++注释后要有一个空格,如://▲注释

  7. 属性和变量定义:

    脚本定义的变量名必须为小写(除了定义常量外,定义常量通常是所有字符都大写)

    实体的自定义属性名使用小写字母加下划线分隔的形式,如:prop_name,从而与实体的内部属性相区别

  8. 在性能影响不大的情况下,使用nx_call调用其他脚本文件里的非异步函数,而尽量少使用require包含其他脚本文件,因为这会影响脚本修改后的重新加载

  9. 写足够多的注释,因为脚本程序可能经常变化

  10. 不准出现分号(;)

  11. 注意自己的Tab键,设置好自己的编辑工具,与项目统一,注意排版整齐

  12. 代码行长度尽量不要超过80个字符(引擎代码要求不超过80)

  13. 在提交代码前一定要测试,并与修改前进行比较,顺便查看是否排版整齐,是否精简等

  14. 全局界面实体名必须符合:描述关键字 + form

    例如:nx_value("xxx_form") nx_value("xxx_xxx_form")

  15. 避免实体泄露

    1)创建临时的实体,注意要在所有return的地方进行销毁,常见的诸如:

    工具类的ArrayList, IniDocument, XmlDocument

    2)在用nx_create创建ArrayList实体时,记得写第二个参数

    local▲xxx▲=▲nx_create("ArrayList",▲"xxx_xxx_xxx")

    3)全局的实体,必须在退出系统之前,进行销毁

    通过以上方式,能较容易的查找实体泄露

脚本代码说明

同一个脚本文件中,调用nx_current()接口存在返回不同结果的情况。示例如下图:

img

说明:

①调用时,nx_current()返回值为"User1.lua",请注意User1.lua中包含了接口的头文件Interface.lua

②调用时,nx_current()返回值为"Interface.lua"