命名规范:
- 文件名: 首字母大写驼峰型(第一个单词首字母也大写)
- 常量: 由字母、数字、_ 构成,字母全大写,首字母必须为字母,单词之间使用”_”相连
- 函数名: 由字母、数字、_ 构成,字母全小写,首字母必须为字母,单词之间使用”_”相连
- 局部变量:由字母、数字、_ 构成,字母全小写,首字母必须为字母,单词之间使用”_”相连
- 全局变量:由字母、数字、_ 构成,字母全小写,必须为”g_”开头,单词之间使用”_”相连,最好不用全局变量
- 配置变量:由字母、数字、_ 构成,由”Conf_”开头,单词首字母大写,单词之间使用”_”相连
代码组织:
文件开头加上功能描述;每个文件都加module限定词;导入的模块都加local限定词
所有函数都加注释:
函数功能: @brief xxx
param描述:@param xxx
return: @return xxx合理的空行:函数之间、函数内部代码块之间
注释格式:单行注释使用”–”;多行注释使用–[[]],其中在”]]”前面加”–”,如果要取消注释,只用在”–[[“前再加一个”-“就行
常量、消息号、枚举值行末都加上分号 ——?
函数内的临时变量、文件内的局部函数都加上 local 限定词
函数内部代码块尽量加注释
单个函数较长时(大于100行),尽量拆分成多个子函数
assert 函数开销不小,请慎用
lua类设计时,用元表来实现oop
不要直接增加函数成员,因为直接增加函数成员会导致内存增加,并且在jit下执行效率和用元表方式无差异
空格符:
运算符之间,如 s = a + b
参数列表或数组元素之间,如 fuction my_sum(a, b),{1, 2, 3}
注意:函数参数列表中,左括号与第一个参数之间、右括号与最后一个参数之间,都不要加空格单行超过80字符时,应该换行
函数参数换行时,下一行与上一行的第一个参数对齐
运算较复杂时,使用小括号分割每个运算逻辑,增加可读性,同时避免运算符优先级顺序问题
4字符缩进
日志:
1.明确的日志级别
2.每个异常处必须有日志(warning、error)说明异常原因
3.日志必须传一个参数,可以是string和table,如果是string,最好为[key:value]形式;如果是table,日志库会自动转成[key:value]形式,且第一个key为message(如果存在)尽量减少表中的成员是另一个表的引用 ——?
取table的长度用#,不用table.getn
当table中的key是纯数字(不一定有序)的时候,求table长度不可以用#(错误),可以用Utils.tableCount(pairs遍历)函数;
相同场景,打印table的内容,用Utils.simple_var_dump(table.concat实现);
按照key大小顺序遍历的话,用pairsByKeys(this function get from [Programming In Lua])获取迭代器尽量避免magic number
lua的全局变量问题
- 之前使用ngx-lua实现一个类似proxy的项目时,发现使用长连接机制会导致 请求错乱(不同的连接数据发生混乱)的现象,经追查发现lua中全局变量使用如果不当会导致一些未可知的异常情况。
类似的也有其他同学遇到过相似的困扰:
1
2
3https://github.com/openresty/lua-nginx-module/issues/150
http://wiki.nginx.org/HttpLuaModule#Data_Sharing_within_an_Nginx_Worker
http://zacharyhu.org/?p=373
解决方案:
在用 ngx-releng 脚本check代码全量global变量之后,将所有global更改为local;同时对长连接建立失败或者读写超时的连接,进行close connection的处理。经验证上线之后数据错乱问题不再复现。 - 所以建议对自己的代码用ngx-releng脚本进行check,尽量使用local变量。