在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
每个语言都有他自己的代码规范,如何写好一个易懂又美观的代码,
空行加空行:
不加空行:
空格加空格:
不加空格:
代码示例a > b and a or b -- 良好的风格 a > b and a or b -- 不良的风格 local a, b, c, max -- 良好的风格 local a,b,c,max -- 不良的风格 if a > b then -- 良好的风格 max = a end if a>b then max=a end -- 不良的风格 data = dataTable[index] -- 良好的风格 data = dataTable [ index ] -- 不良的风格 function(posX, posY) -- 良好的风格 function (posX,posY) -- 不良的风格
长行拆分
-- 良好的风格 local newBuindingBtn = UI.newButton({ text = btnName, x = self.x, y = self.y, parent = self, style = { normal = ResConfig.png.commonBtnBlue } }) -- 不良的风格 local newBuindingBtn = UI.newButton({text = btnName,x = self.x,y = self.y,parent = self, style = {normal = ResConfig.png.commonBtnBlue}}) -- 良好的风格 if veryLongerVariable1 >= veryLongerVariable2 and veryLongerVariable3 <= veryLongerVariable5 and veryLongerVariable4 <= veryLongerVariable6 then doo() end -- 不良的风格 if veryLongerVariable1 >= veryLongerVariable2 and veryLongerVariable3 <= veryLongerVariable5 and veryLongerVariable4 <= veryLongerVariable6 then doo() end
共性规则
文件命名
类的命名
变量命名
local data -- 良好的风格 local oldData -- 良好的风格 local newData -- 良好的风格 local pairs = pairs -- 良好的风格 local posx,posX -- 不良的风格 local btn1,btn2 -- 不良的风格 local TABLE = {} -- 不良的风格 local uILabel -- 不良的风格
类的成员变量
例如:function init() self.mainPanel = false -- 常用格式 topPanel = false -- 这样是全局变量,占用全局资源,而且难以区分于局部变量 ... end
全局变量全局变量使用双下划线(““)开头以及结尾,中间的命名以名词拼接,或”形容词+名词”拼接,不同单词之间用(”“)隔开; 例如: _VERSION_CODE = "1.0.0.0" 局部变量M常用做模块里面表示模块本身 module("MainGame.Module.IntegrationTest.MapModule",package.seeall) local M = class(SceneView,"MapScene") 数据的初始化 function M:init() ... end ... return M 引用进来的类或模块,用大驼峰法命名,引用路径统一带括号; module(“MainGame.Module.IntegrationTest.MapModule”,package.seeall) local M = class(SceneView,”MapScene”) local Surface = require(“xx.xx”) local TestButtonPanel = require(“xx”)
临时变量
for _,v in ipairs(t) do print(v) end i,k,v,t --常做临时变量 for k,v in pairs(t) ... end for i,v in ipairs(t) ... end mt.__newindex = function(t, k, v) ... end
常量,事件名的命名常量,事件名所用单词均大写,单词用下划线(‘_‘)分割;例如: for _,v in ipairs(t) do print(v) end i,k,v,t --常做临时变量 for k,v in pairs(t) ... end for i,v in ipairs(t) ... end mt.__newindex = function(t, k, v) ... end
枚举的命名
例如:ControllerViewType = { SCENE = "SCENE", PANEL = "PANEL", POP = "POP", }
文件组织文件描述
-- MapModule.lua --Author:xx --Email:xx@flamingo-inc.com --20xx年x月x日 xx:xx --Using:创建地图 module("MainGame.Module.IntegrationTest.MapModule",package.seeall) ...
文件中变量的定义如果在文件中需要多次使用的某些导入文件,可以在文件开头用局部变量存储导入信息,而不是在每次使用的时候都重新导入一次; ... local Surface = require("xx.xx") local TestButtonPanel = require("xx") function M:xx() local testBtn = TestButtonPanel.newCC() ... end function M:yy() local panel = TestButtonPanel.newCC() local surface = Surface.newCC() ... end ...
类变量的定义
函数参数的定义
--[[ 普通按钮 可缩放 scale9 @param #string text 按钮名称 @param #table style 按钮样式 ]] function UI.newButtonScale9(params) ... end
函数的定义规则
注释的使用
编码技巧应该尽量使用local变量而非global变量
for k1,v1 in pairs(tbl) do for k2,v2 in pairs(v1) do ... end end do local pairs = pairs for k1,v1 in pairs(tbl) do for k2,v2 in pairs(v1) do ... end end end
由于pairs是一个全局变量应用的函数,所以写法2在这里有稍微效率上的提升,但要是单层遍历的没有这个效果了。 临时变量的处理
例如:local description = "" for i = 1,20 do description = description.."xxx" end
这样会生成21份string的copy,但实际上我们只需要最后那一份 如果是轻量级的简单连接还是可以使用的,因为影响不大,但要是大量的类似拼接,推荐使用string.format 类似于字符串的管理机制,表也存在类似的临时变量copy:函数传参数 function func({x,y})
...
end
这种传参方式,每次都会生成一份copy,所以推荐以下的用法: function func(x,y) ... end function func({posX = x, posY = y}) ... end
利用逻辑运算的短路效应
function foo(arg) arg = arg or "default" ... end
但要注意当赋值为bool值时候,容易出bug
另外,巧妙使用 and or 还可以实现类似 C 语言中的 ?: 三元操作: function max(a,b) return a > b and a or b end
这里相当于 return (a > b) ? a : b; 代码建议代码的调试用Luastudio工具调试,代替Sublime调试Lua代码; 复杂度和性能问题写代码时尽可能写的简单,考虑性能时先做好推断,看看能提升多少,增加的复杂度以及造成的代码晦涩有多严重,然后再决定如何做; 函数的优化思考
提交代码的检查提交代码前,在svn commit中验证提交的代码,去掉或注释掉无关的代码,保证提交的代码无误; 表结构的引用尽量减少表中的成员是另个表的引用; |
请发表评论