Lua 代码规范

首先声明,由于我们是在 Unity 中使用 Lua 开发,经常需要调用 C# 相关的一些 API,为了保证代码书写的统一,所以很多 Lua 命名规范参考了 C# 代码规范。

Pascal 命名法:每个单词首字母均大写,例如:FieldName。

Camel 命名法:第一个单词首字母小写,其余单词首字母大写,例如:fieldName。

使用 Pascal 命名法。

成员变量

使用 Camel 命名法。

方法

使用 Pascal 命名法。

方法参数

使用 Camel 命名法。

局部变量

使用 Camel 方式命名。

常量

使用 Pascal 命名法。(建议使用此方法,单词比全大写更好辨认)

1
2
local Consts = {}
Consts.PageIndex = 6

也有人建议所有单词大写,多个单词之间用下划线 _ 隔开。

1
2
local Consts = {}
Consts.PAGE_INDEX = 6

. 和 : 的使用约定

实例方法使用 :
静态方法使用 .

类的成员变量先声明后使用

Lua 表中的成员变量,是可以不声明,直接使用的。但此处建议成员变量像 C# 一样先声明后使用,以提升代码的可读性。

关于私有成员变量和私有方法

虽然有人建议私有成员变量和私有方法用_开头,但综合考虑到代码的风格统一,我们暂不区分成员变量和方法的公有私有写法,统一按照上述的成员变量 Camel 命名法,方法 Pascal 命名法。

扩展 Lua 原生方法

Lua 原生的一些方法,如 rawget, print, pcall, math.max, string.find, table.insert 等均是全小写,当我们扩展类似方法时,保持 Lua 原生的写法,如已添加的 declare, tryset, callback, string.split, string.startswith 等。

严格控制全局变量声明

为什么要严格控制全局变量声明?

在 Lua 中,不加 local 定义的变量即全局变量,全局变量定义后可以在项目的任意位置直接使用,全局变量使用如果不加限制,会导致代码结构逐渐变得混乱。随着项目功能模块增多,因为全局变量使用不当而导致的问题也不容易排查。

原则:不禁止使用全局变量,禁止的是全局变量的滥用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
-- 严格控制全局变量的存取
setmetatable(_G, {
__index = function(_, key)
error("attempt to read undeclared variable: " .. key, 2)
end,
__newindex = function(_, key)
error("attempt to write undeclared variable: " .. key, 2)
end
})

-- 使用 declare 方法显示声明全局变量
function declare(name, value)
rawset(_G, name, value)
end

总结示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
-- 类名 Pascal
-- 引入 middleclass 模拟类
local Animal = class("Animal")

-- 成员变量 Camel 命名法,先声明,后使用
Animal.id = 0
Animal.name = ""
Animal.category = 0

-- middleclass 内部初始化方法,方法名不予干预
function Animal:initialize()

end

-- 方法名 Pascal,方法参数 Camel
-- 实例方法使用 :
function Animal:SetName(name)
self.name = name
end

function Animal:GetName()
return self.name
end

function Animal:Test()
-- 局部变量 Camel
local index = 2
local text = "aaa"
end

-- 静态方法使用 .
function Animal.New()
return Animal()
end

return Animal