Lua代码规范跟编写技巧(性能优化)

范围:

本规范适用于公司有使用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. 代码中不能出现(中文等)非代码语言;
    2. 比较规范
      1. nil:a == nil
      2. boolean:if a then / if not a then
    3. 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
    4. 异常规范
      1. 对关键参数需要进行判断,比如是否为nil,数据范围和type类型判断
      2. 在关键步骤添加log打印,logError、logWarn要注意使用场合,避免一些无意义的打印,上传代码时记得删掉
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个简单的示例代码,展示了如何使用Lua C API在C++中调用Lua的函数: ```c++ #include <lua.hpp> int main() { // 创建Lua状态机 lua_State* L = luaL_newstate(); // 加载Lua标准库 luaL_openlibs(L); // 加载Lua脚本文件 luaL_dofile(L, "test.lua"); // 调用Lua函数 lua_getglobal(L, "testFunc"); // 获取全局函数testFunc lua_pushnumber(L, 1); // 压入第一个参数 lua_pushnumber(L, 2); // 压入第二个参数 lua_call(L, 2, 1); // 调用函数,传入2个参数,返回1个结果 int result = lua_tonumber(L, -1); // 获取返回值 lua_pop(L, 1); // 弹出返回值 // 关闭Lua状态机 lua_close(L); return 0; } ``` 上述代码假设已经有一个Lua脚本文件`test.lua`,其中定义了一个名为`testFunc`的函数,该函数接受两个参数,返回它们之和。以下是`test.lua`的示例代码: ```lua function testFunc(a, b) return a + b end ``` 在C++代码中,首先创建了一个Lua状态机,然后加载了Lua的标准库和脚本文件。接着,使用`lua_getglobal`函数获取名为`testFunc`的全局函数,并使用`lua_pushnumber`函数压入两个参数。然后,使用`lua_call`函数调用`testFunc`函数,传入2个参数并返回1个结果。最后,使用`lua_tonumber`函数获取返回值,并使用`lua_pop`函数弹出返回值。最后,关闭Lua状态机。 这是一个简单的示例,实际情况下可能需要更多的错误检查和内存管理。但是,使用Lua C API可以实现高性能的C++和Lua的交互。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值