范围:

本规范适用于公司有使用lua编写的所有软件,之后编写修改代码需严格的按照本规范进行。

目的:

  1. 提高编码质量,统一编码标准,提高开发效率;
  2. 使代码通俗易懂,易于维护。

开发中,大量使用lua,暂时根据当前状况,总结相对而言较好的规范,在多人协作中可以更好的开发、交流。

 

  • 命名惯例
  1. 文件(类)命名
  1. 所有lua文件名命名时使用大驼峰法,与以前的同类型的文件命名保持一致;
  2. 根据文件的特性,一般以文件里的模块名或者类名作为同名文件名;
  3. 确定命名前,请检查下,不要跟其他文件同名;

AccScoreLogic.lua --良好的风格

UIOneRecharge.lua --良好的风格

  1. 函数命名
  1. 大驼峰法
  2. 函数命名应以函数要执行的动作命名,一般采用动词或者动词+名词的结构

UpdateBagItems(sortType) --良好的风格

UseItem(itemId, useCount) --良好的风格

  1. 变量命名
  1. 使用小驼峰命名;
  2. 使用“名词”或者“形容词+名词”命名;
  3. 为了可读性,尽量避免变量名中出现标号,如value1,value2;
  4. 不要出现仅靠部分字母大小写区分的相似变量;
  5. 除非是局部变量功能等价全局变量,不然局部变量不要与已有的全局变量同名;
  6. 尽量不要使用已有的类名作为变量名;

local data -- 良好的风格

local oldData -- 良好的风格

local newData -- 良好的风格

local posx,posX -- 不良的风格

local btn1,btn2 -- 不良的风格

local TABLE = {} -- 不良的风格

local uILabel -- 不良的风格

  1. 类的成员变量以”self.”开头,以区分于局部变量;
  2. 引用进来的类或模块,用大驼峰法命名,引用路径统一带括号;
  3. 临时变量:
  • 常用下划线”_”作为可以忽略的变量
  • i,k,v,t常做临时变量
  1. 常量、事件名的命名

常量,事件名所用单词均大写,单词用下划线分割,并添加好注释;

-- 常量 默认宽度

LIST_DEFAULT_WIDTH = 100

-- 事件 添加到场景

ADDED_TO_STAGE = getId()

  1. 枚举的命名

枚举名命名,与类名命名一致;

枚举值命名,与常量,事件名的命名一致;

ControllerViewType = {

SCENE = "SCENE",

PANEL = "PANEL",

POP = "POP",

}

  • 文件组织
  1. 文件描述

--MapModule.lua

--Author:xx

--DateTime:2017/7/31 17:59

--Using:创建地图

  1. 如果在文件中需要多次导入的模块,可以在文件头部直接导入,导入的模块都需要加local限定词;
  2. 类中的成员变量需要在init中先声明,并赋予初始值,尤其是table需要先置为{}
  3. 比较难理解的函数需要添加注释,格式如下:

--此函数检测是否可以从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

  1. 函数的行数过长(理论上100行以内)时,尽量拆分成子函数;函数中一些晦涩的部分,一定要加上注释。
  2. 短小的注释使用 -- ,较长的注释使用 --[[]]
  • 分隔和缩进
  1. 使用空行
  1. 在下述情况下使用单行空白行进行分割:
  2. 函数之间
  3. 在函数内部代码的逻辑段落小节之间
  4. 在注释行之前

注释之前增加一行或多行空行

  1. 使用空格符

除正常的定义、声明、赋值等成分之间以空格符分隔之外,以下情况也应使用一个空格符来分隔:

  1. 运算符前后,比如: a = b + c;
  2. 函数的参数列表之间, 比如:CheckArrivePoint(oldX, oldY, newX, newY)
  3. for等语句时,比如:for k, v in pairs(t) do

在以下情况下不要使用空格:

  1. 函数定义的时候,只有一个参数:function GetMax(a)
  2. 函数调用的时候,只有一个参数:GetMax(a)

Lua解析语法的时候采用空格等分割来解析的,某些情况下,若不小心加空格会导致非预期的结果

  • 编码技巧
  1. 应该尽量使用local变量而非global变量;

全局变量实际是放入全局表中,每次调用是用传入变量名作为key去获取,而local变量是直接通过lua的堆栈访问的;重复使用的变量或者函数要local化。

  1. and or 的返回值是表达式中的左值或者右值,可用来简化代码
  2. 字符串的连接: ..

尽量少使用字符串连接操作符,因为每次都会生成一个新的字符串。可以使用 table来模拟字符串缓冲区,避免了大量使用连接操作符,大大提升性能,table.concat()或者使用string.format()。

  • 代码规范
  1. 源文件布局规范
  1. 文件以utf-8编码格式保存。(否则中文等注释容易出现乱码)
  2. 选择tab进行缩进。(设置编辑器的tab =4个空格)
  3. 任何一行代码长度不要超过70列
  4. 尽量用--来注释,注释用中文
  5. 代码中尽量少用magic number
  6. 代码中不能出现(中文等)非代码语言;
  1. 比较规范
  1. nil:a == nil
  2. boolean:if a then / if not a then
  1. table的使用
  1. 获取table长度时应注意,确定table是数组性质的才能使用#或者getn来获取长度(建议用#),非连续的table只能用for获取;
  2. table判空,一种是未初始化为nil,一种是空数组未{},第二种使用next{table} == nil来判断;
  3. 连续的table数组与hash table最好不要混用,所以连续的table删除元素要用table.remove而不能简单的赋值为nil,否则会破坏原table的连续性;
  4. 了解hash table的长度增长原理,0->1->2->4->8;
  5. 善用weak table
  1. 异常规范
  1. 对关键参数需要进行判断,比如是否为nil,数据范围和type类型判断
  2. 在关键步骤添加log打印,logError、logWarn要注意使用场合,避免一些无意义的打印,上传代码时记得删掉