《 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 ```

results matching ""

    No results matching ""