lua代码组织或说风格 见过用过的两大类,面向对象(指喜欢用元表模拟class、数据方法结合成对象)、模块化(数据方法彻底分离)。
服务器
好比游戏中一个角色,
模块化
数据和方法结合成对象 函数
player = {} player.x = 0 -- 坐标 player.y = 0 --坐标 function player:move(x,y) --操做 end
数据和方法分离性能
player_controler = {} player = {} player.x = 0 -- 坐标 player.y = 0 --坐标 function player_contorler.move(player) --操做 end
这两种方法没有好坏可是我的认为 第二种更适合用来作热更新。ui
主要的缘由是服务器热理新时都会保存当前的数据并再更新以后数据能够延用,可是数据所对应的方法即要尽量的可更新,此时若是角色是一个对象那么对象内的方法就难以更新(也可方法和数据用父子类来处理)。 lua
lua模块之间都有会有引用关系总会有前后,这时大多都会在初始化时写定好前后,当咱们要加入新的模块时就须要注间依赖关系spa
为了在开发时不改要时时关注我定义了如下规则来实现自动加载模块code
强制一个文件一个模块orm
文件名与模块名必须要一至对象
增长全部lua文件的的路径 package.path = string.format("%s;%s?.lua;", package.path, "路径")
除入口外模块都以auto_import
function auto_import() local mt = {} mt.__index = function (t,k) local mod = _G[k] if not mod then mod = require(k) if not mod then error("加载模块失败 "..k) end _G[k]= mod end t[k] = mode --性能考虑在lua中提升不少 ,luajit基本无差 return t[k] end return setmetatable({},mt) end
--模块A A.lua local A = auto_import() --能够自动组织起模块依赖,包括一些全局的非模块的变量或函数 setfenv(1,A) --为当前文件设置环境 因此文件中的因此全局变量都成了A的成员 function test () --同等 A.test end return A