《 AUBO Lua编码规范 》精简版
Code is read much more often than it is written.
Programming style is an art.
日期:2021/06/18
版本:v0.0.1
负责 : 郭凤贺
1 格式
1.1 缩进2个空格
不应使用制表符进行缩进,或将其与空格混合使用.
1.2 空行
加空行 函数之间都要加空行 函数内部代码概念与逻辑之间,逻辑段落小节之间,都应该加空行 注释行之前
不加空行 在一个函数体内,逻揖上密切相关的语句之间不加空行 多行注释解释参数的时候,注释之间不加空行
1.3 空格
- 注释后(--)使用空格
--bad -- good
- 使用空格 ”and“,”or“ 等关键字前后留一个空格,便于辨析 在逗号之后、比较运算符、赋值运算符、算数运算符等之间放置一个空格 if、for、while等关键字之后如果要加左括号”(“,关键字与左括号之间应留一个空格,以突出关键字
-- bad
local x = y*9
local numbers={1,2,3}
numbers={1 , 2 , 3}
numbers={1 ,2 ,3}
local strings = { "hello"
, "Lua"
, "world"
}
dog.set( "attr",{
age="1 year",
breed="Bernese Mountain Dog"
})
if a>b then max=a end
-- good
local x = y * 9
local numbers = {1, 2, 3}
local strings = {
"hello",
"Lua",
"world",
}
dog.set("attr", {
age = "1 year",
breed = "Bernese Mountain Dog",
})
if a > b then
max = a
end
- 不使用空格 函数名之后不要留空格,紧跟左括号”(“ 左括号”(” 向后紧跟,紧跟处不留空格 右括号”)“、逗号”,“、分号”;“,向前紧跟,紧跟处不留空格 字符串连接符”..“前后不加空格 “:“,”.“,”[“,”]“这类操作符前后不加空格
-- bad
data = dataTable [ index ]
function (posX,posY)
-- good
data = dataTable[index]
function(posX, posY)
1.4 缩进
根据行首缩进表和函数,而不是结构
-- bad
local my_table = {
"hello",
"world",
}
using_a_callback(x, function(...)
print("hello")
end)
-- good
local my_table = {
"hello",
"world",
}
using_a_callback(x, function(...)
print("hello")
end)
1.5 其他
table的数据较多时考虑分行增加可读性
local robot_type = {
[1] = aubo_i5,
[2] = aubo_i10,
[3] = aubo_i20
}
避免对齐变量声明
-- bad
local a = 1
local long_identifier = 2
-- good
local a = 1
local long_identifier = 2
2 命名
作用域大的变量名比作用域小的变量名更详细.
2.1 文件命名
文件名要全部小写, 可以包含下划线 .
2.2 变量名长度
一律小写, 单词之间用下划线连接.
2.3 值和对象变量
保存值或对象的变量采用小写形式并且是简短的
用作谓词的布尔值或函数加上is前缀.
is_directory
2.4 函数
遵循类似于值和对象变量命名的规则(函数是第一类对象) 采用小写加下划线形式.
2.5 Lua内部变量
下划线开头的名称后跟大写字母.
_VERSION
2.6 模块/包
名称简短且小写的名词,单词之间没有任何内容.
-- bad
Lua-SQL.Postgres
-- good
luasql.mysql
luasql.oci8
socket
xmlrpc
3 初始化赋值及访问
3.1 Tables
创建table时, 如果可以, 最好一次全部对字段进行填充. 向所有字段添加尾随逗号,包括最后一个.
local player = {
name = "Jack",
class = "Rogue",
}
3.2 Strings
使用" "字符串;在编写包含双引号的字符串时使用' ''
local name = "LuaRocks"
local sentence = 'The name of the program is "LuaRocks"'
3.3 Table 属性
访问已知属性时使用点表示法
local luke = {
jedi = true,
age = 28,
}
-- bad
local is_jedi = luke["jedi"]
-- good
local is_jedi = luke.jedi
4 注释
最好的代码应当本身就是文档. 有意义的类型名和变量名, 要远胜过要用注释解释的含糊不清的名字.
4.1 注释语言
注释可以用中文或者英文, 前提是必须让读者看得懂。例如算法中有很多专有名词和概念来自于英文论文, 那相关注释我们可以选用中文.又如软件逻辑中, 某些逻辑我们可以用中文描述.
5 其它
5.1 范围
尽可能使用局部变量而不是全局变量. 全局变量具有更大的范围和生命周期,因此会增加[耦合]和复杂性. 在 Lua 中,访问局部变量也比全局变量更快, 因为全局变量需要在运行时进行表查找.
local x = 0
local function count()
x = x + 1
print(x)
end
有时,使用 do-end 进一步限制局部变量的范围是有用的.
local v
do
local x = u2*v3-u3*v2
local y = u3*v1-u1*v3
local z = u1*v2-u2*v1
v = {x,y,z}
end
local count
do
local x = 0
count = function() x = x + 1; return x end
end
5.2 end
由于 " end" 是许多不同结构的终止符,所以如果使用注释来阐明哪个结构被终止,可以帮助读者(尤其是在大块中).
for i,v in ipairs(t) do
if type(v) == "string" then
...lots of code here...
end -- if string
end -- for each t
5.3 惯用写法示例
- 判断变量是否为nil
判断变量是否不为nil,只写变量名而不是显式地与nill进行比较. Lua在条件中将nil 和false视为false(其他值视为true)
local line = io.read() if line then -- instead of line ~= nil ... end ... if not line then -- instead of line == nil ... end
当变量可能是nil也可能是false时,如果必须区分两个条件,则需要使用:line == nil 或 line == false.
- and 和 or可以用于简洁代码
local function test(x) x = x or "idunno" -- rather than if x == false or x == nil then x = "idunno" end print(x == "yes" and "YES!" or x) -- rather than if x == "yes" then print("YES!") else print(x) end end
复制一个较小的table
u = {unpack(t)}
判断table 是否为空
if nil == next(t) then ... end
table的追加 更简洁、更高效
t[#t+1] = 1 -- rather than table.insert(t, 1)
i, k, v, 和 t 常用如下 ```lua for k,v in pair (t) ... end
for i,v in ipairs (t) ... end
mt.__newindex = function (t, k, v) ... end ```