代码规范
C/C++代码规范
通用规则:
保持统一的程序书写方式而避免个人风格,只在文件的开头描述部分署名;
接口部分的函数和属性命名尽量不要使用缩写;
控制程序的每一行不要超过80个字节。
内存管理:
为了检测内存泄漏和保证跨模块内存引用的安全性,可以使用以下方法申请和释放内存:
申请和释放未初始化的内存:
CORE_ALLOC
和CORE_FREE
生成和删除对象:
CORE_NEW
和CORE_DELETE
如果有内存泄漏,系统退出时会在运行目录下生成内存泄露日志(mem_leak.log),里面包含详细的内存泄漏信息。
补充:
符号说明:
____表示Tab
▲表示空格
变量定义
数据成员 局部变量 风格一 局部变量 风格二 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.0f float▲total_seconds▲=▲0.0f double▲m_dTotalSeconds; double▲dTotalSeconds▲=▲0.0 double▲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; 运算符
运算符前后保留一个空格,例如:
int▲a▲=▲b▲+▲c;
换行
遇到换行时,运算符要在下一行,例如:
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)处理不同内容的代码段,用空行分隔
注释
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);注意自己的Tab键,设置好自己的编辑工具,与项目统一,注意排版整齐。
脚本代码规范
在界面编辑器中,自动生成的函数名可以略做修改,但不能删除关键字
符合要求示例:
xxx_btn_click
;xxx_checked_changed
;xxx_edit_lost_focus
;xxx_edit_drag
xxx表示功能、属性等用于描述的关键字
关键字后的空格要求
if
while
for
等后面有一个空格运算符
运算符前后保留一个空格,例如:
local▲a▲=▲b▲+▲c
遇到换行时,运算符要在下一行,例如:
local▲a▲=▲xxxxxxxxxxxxxxxxxxx▲+▲xxxxxxxxxxxxxxxxxxx▲
+▲xxxxxxxxxxxxxxxxxxx
if▲(xxxxxxxxxxxxxxxxxxx)▲and▲(xxxxxxxxxxxxxxxxxxx)▲
and▲(xxxxxxxxxxxxxxxxxxx)▲and▲(xxxxxxxxxxxxxxxxxxx)▲then
--......
end定义/声明变量的代码段要作为单独的一段,定义/声明变量段后加一行空行
local▲x▲=▲1
local▲y▲=▲1
if▲......处理不同内容的代码段,用空行分隔
脚本注释后不要空格,例如:
--注释
;区别于C/C++注释后要有一个空格,如://▲注释
属性和变量定义:
脚本定义的变量名必须为小写(除了定义常量外,定义常量通常是所有字符都大写)
实体的自定义属性名使用小写字母加下划线分隔的形式,如:
prop_name
,从而与实体的内部属性相区别在性能影响不大的情况下,使用
nx_call
调用其他脚本文件里的非异步函数,而尽量少使用require
包含其他脚本文件,因为这会影响脚本修改后的重新加载写足够多的注释,因为脚本程序可能经常变化
不准出现分号(;)
注意自己的Tab键,设置好自己的编辑工具,与项目统一,注意排版整齐
代码行长度尽量不要超过80个字符(引擎代码要求不超过80)
在提交代码前一定要测试,并与修改前进行比较,顺便查看是否排版整齐,是否精简等
全局界面实体名必须符合:描述关键字 + form
例如:
nx_value("xxx_form")
或nx_value("xxx_xxx_form")
等避免实体泄露
1)创建临时的实体,注意要在所有
return
的地方进行销毁,常见的诸如:工具类的
ArrayList
,IniDocument
,XmlDocument
2)在用
nx_create
创建ArrayList
实体时,记得写第二个参数local▲xxx▲=▲nx_create("ArrayList",▲"xxx_xxx_xxx")
3)全局的实体,必须在退出系统之前,进行销毁
通过以上方式,能较容易的查找实体泄露
脚本代码说明
同一个脚本文件中,调用nx_current()
接口存在返回不同结果的情况。示例如下图:
说明:
①调用时,nx_current()返回值为"User1.lua",请注意User1.lua中包含了接口的头文件Interface.lua
②调用时,nx_current()返回值为"Interface.lua"