范围:
本规范适用于公司有使用lua编写的所有软件,之后编写修改代码需严格的按照本规范进行。
目的:
- 提高编码质量,统一编码标准,提高开发效率;
- 使代码通俗易懂,易于维护。
开发中,大量使用lua,暂时根据当前状况,总结相对而言较好的规范,在多人协作中可以更好的开发、交流。
- 命名惯例
- 文件(类)命名
- 所有lua文件名命名时使用大驼峰法,与以前的同类型的文件命名保持一致;
- 根据文件的特性,一般以文件里的模块名或者类名作为同名文件名;
- 确定命名前,请检查下,不要跟其他文件同名;
AccScoreLogic.lua --良好的风格
UIOneRecharge.lua --良好的风格
- 函数命名
- 大驼峰法
- 函数命名应以函数要执行的动作命名,一般采用动词或者动词+名词的结构
UpdateBagItems(sortType) --良好的风格
UseItem(itemId, useCount) --良好的风格
- 变量命名
- 使用小驼峰命名;
- 使用“名词”或者“形容词+名词”命名;
- 为了可读性,尽量避免变量名中出现标号,如value1,value2;
- 不要出现仅靠部分字母大小写区分的相似变量;
- 除非是局部变量功能等价全局变量,不然局部变量不要与已有的全局变量同名;
- 尽量不要使用已有的类名作为变量名;
local data -- 良好的风格
local oldData -- 良好的风格
local newData -- 良好的风格
local posx,posX -- 不良的风格
local btn1,btn2 -- 不良的风格
local TABLE = {} -- 不良的风格
local uILabel -- 不良的风格
- 类的成员变量以”self.”开头,以区分于局部变量;
- 引用进来的类或模块,用大驼峰法命名,引用路径统一带括号;
- 临时变量:
- 常用下划线”_”作为可以忽略的变量
- i,k,v,t常做临时变量
- 常量、事件名的命名
常量,事件名所用单词均大写,单词用下划线分割,并添加好注释;
-- 常量 默认宽度
LIST_DEFAULT_WIDTH = 100
-- 事件 添加到场景
ADDED_TO_STAGE = getId()
- 枚举的命名
枚举名命名,与类名命名一致;
枚举值命名,与常量,事件名的命名一致;
ControllerViewType = {
SCENE = "SCENE",
PANEL = "PANEL",
POP = "POP",
}
- 文件组织
- 文件描述
--MapModule.lua
--Author:xx
--DateTime:2017/7/31 17:59
--Using:创建地图
- 如果在文件中需要多次导入的模块,可以在文件头部直接导入,导入的模块都需要加local限定词;
- 类中的成员变量需要在init中先声明,并赋予初始值,尤其是table需要先置为{}
- 比较难理解的函数需要添加注释,格式如下:
--此函数检测是否可以从A(oldX,oldY)点走到B点(newX,newY)
--@param oldX 当前所在点x
--@param oldY 当前所在点y
--@param newX 自标点x
--@param newY 目标点y
~-@return若可以到达,返国true:否则返回false
function ActorLogic:CheckArrivePoint(oldX, oldY, newX, newY)
......
end
- 函数的行数过长(理论上100行以内)时,尽量拆分成子函数;函数中一些晦涩的部分,一定要加上注释。
- 短小的注释使用 -- ,较长的注释使用 --[[]]
- 分隔和缩进
- 使用空行
- 在下述情况下使用单行空白行进行分割:
- 函数之间
- 在函数内部代码的逻辑段落小节之间
- 在注释行之前
注释之前增加一行或多行空行
- 使用空格符
除正常的定义、声明、赋值等成分之间以空格符分隔之外,以下情况也应使用一个空格符来分隔:
- 运算符前后,比如: a = b + c;
- 函数的参数列表之间, 比如:CheckArrivePoint(oldX, oldY, newX, newY)
- for等语句时,比如:for k, v in pairs(t) do
在以下情况下不要使用空格:
- 函数定义的时候,只有一个参数:function GetMax(a)
- 函数调用的时候,只有一个参数:GetMax(a)
Lua解析语法的时候采用空格等分割来解析的,某些情况下,若不小心加空格会导致非预期的结果
- 编码技巧
- 应该尽量使用local变量而非global变量;
全局变量实际是放入全局表中,每次调用是用传入变量名作为key去获取,而local变量是直接通过lua的堆栈访问的;重复使用的变量或者函数要local化。
- and or 的返回值是表达式中的左值或者右值,可用来简化代码
- 字符串的连接: ..
尽量少使用字符串连接操作符,因为每次都会生成一个新的字符串。可以使用 table来模拟字符串缓冲区,避免了大量使用连接操作符,大大提升性能,table.concat()或者使用string.format()。
- 代码规范
- 源文件布局规范
- 文件以utf-8编码格式保存。(否则中文等注释容易出现乱码)
- 选择tab进行缩进。(设置编辑器的tab =4个空格)
- 任何一行代码长度不要超过70列
- 尽量用--来注释,注释用中文
- 代码中尽量少用magic number
- 代码中不能出现(中文等)非代码语言;
- 比较规范
- nil:a == nil
- boolean:if a then / if not a then
- table的使用
- 获取table长度时应注意,确定table是数组性质的才能使用#或者getn来获取长度(建议用#),非连续的table只能用for获取;
- table判空,一种是未初始化为nil,一种是空数组未{},第二种使用next{table} == nil来判断;
- 连续的table数组与hash table最好不要混用,所以连续的table删除元素要用table.remove而不能简单的赋值为nil,否则会破坏原table的连续性;
- 了解hash table的长度增长原理,0->1->2->4->8;
- 善用weak table
- 异常规范
- 对关键参数需要进行判断,比如是否为nil,数据范围和type类型判断
- 在关键步骤添加log打印,logError、logWarn要注意使用场合,避免一些无意义的打印,上传代码时记得删掉