盒子
盒子
文章目录
  1. 命名规范:
  2. 代码组织:
  3. lua的全局变量问题

lua-coding-style

命名规范:

  • 文件名: 首字母大写驼峰型(第一个单词首字母也大写)
  • 常量: 由字母、数字、_ 构成,字母全大写,首字母必须为字母,单词之间使用”_”相连
  • 函数名: 由字母、数字、_ 构成,字母全小写,首字母必须为字母,单词之间使用”_”相连
  • 局部变量:由字母、数字、_ 构成,字母全小写,首字母必须为字母,单词之间使用”_”相连
  • 全局变量:由字母、数字、_ 构成,字母全小写,必须为”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
    3
    https://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变量。