lua编程规范beta 1.0(for lua5.1 by jason 2011.7.6)
---------------------------------------------------------------------
源文件布局规范
---------------------------------------------------------------------
* 文件以utf-8编码保存。
* 文件第一行svn prop:-- $Id$。
* 选择tab进行缩进。
* 任一行代码长度不超过70列。
* 用 -- 来注释。
* 中文注释。避免英文注释。
---------------------------------------------------------------------
命名规范
---------------------------------------------------------------------
* 变量:驼峰法,eg: Temp。(这个很痛苦,而且现在不少代码是混了unix风格的)
* 常量:大写加下划线,eg: KIND_PET_FOOD
* 函数:和 变量 一致, eg:function SafeImport()
* 类:小写cls开头的驼峰法, eg: clsChar
* 模块:小写加下划线, eg: item_factory.lua
---------------------------------------------------------------------
比较规范
---------------------------------------------------------------------
* nil:a == nil
* int / str:a == 163 / a == "Wingszero"
* boolean:if a: / if not a:
* 杜绝比较不同类型的对象
---------------------------------------------------------------------
module规范
---------------------------------------------------------------------
*用import.lua的Import方法代替lua本身的module, require机制
eg: Import("base/util.lua")
---------------------------------------------------------------------
class规范
---------------------------------------------------------------------
*clsObject作为所有类的Super
*子类的__init__需要先调用父类的__init__
*子类实现自己的destroy,并调用其Super的destroy
* 避免多继承。
---------------------------------------------------------------------
table规范
---------------------------------------------------------------------
*善用weak table(比如全局资源) 和手工调用collectgarbage()
*对table进行迭代时,key和value应根据具体意义命名,而不是简单的k,v
eg: for CharId, Obj in pairs (CharIdMap) do
* 区分pairs和ipairs
* 取table的长度用#,不用table.getn(注:此长度仅是线性数组从索引为1开始的连续长度)
* table的数据较多时考虑用如下形式增强可读性:
local a = {
[1] = 108001,
[2] = 108002,
[3] = 108003,
}
---------------------------------------------------------------------
异常规范
---------------------------------------------------------------------
*对关键参数(比如传入的参数)进行assert, 比如是否为nil,数据范围和type
*用xpcall代替关键函数的直接调用
*如有必要,关键的步骤和错误需调用log
---------------------------------------------------------------------
其他建议
---------------------------------------------------------------------
* 尽量避免magic number
* 尽量使用 local 变量而非 global 变量
* 被多次读取的 global 变量,应提取出来放到 local 变量中
* 避免对内部函数的赋值, eg: a= print
* 用x = x or {}的方式替代if..else
* 可用print(x == "yes" and "YES!" or x) 的方式替代if..else
* if..then..return..end 分行写
*字符串连接:
连接符".."每次使用都会产生新的字符串,老串会成为垃圾,容易触发gc
用table.concat连接字符串很快,但加上insert子串的耗时后,经测试甚至比前者慢
极端情况可以用stack维护多个大子串来改善 --详见《Programming in Lua》P81-82
---------------------------------------------------------------------
充分理解
---------------------------------------------------------------------
*充分理解metatable及metamethod
*充分理解rawset,rawget的使用场合
*充分理解weak table的使用场合
*充分理解并合理利用clousure
*充分理解gc的原理