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