lua對模組介面擴充套件的一種方法

2021-09-08 17:26:44 字數 1415 閱讀 8337

lua中模組的實現,對於使用者來說就是乙個庫,引用此庫後,可以呼叫庫中實現的任意函式。

使用庫,可以將一類功能相關的介面做封裝,並提供開放介面。

參考:我們實現引用程式,往往要引用若干已經實現的庫檔案, 這些庫大都是開源的,以此來加快應用開發程序

應用庫後, 應用編碼中, 會引用庫的一些api, 例如會是 lfs 庫中的 dir 來list目錄下的檔案和資料夾。

但是在應用維護過程中,我們往往希望給庫的api新增一些過濾規則, 或者對部分api進行過載,

如此,我們對庫的使用和應用的維護,提出如下兩點要求:

1、 不修改庫的**, 因為後續可能會有公升級庫的需要, 如果修改, 後續公升級庫, 往往會丟掉庫的修改, 即使記錄庫的修改, 待公升級庫時候, 再將修改同步到新庫中, 也是耗時, 容易出錯的。

2、 應用**直接使用庫的 api 名稱, 因為開發人員往往利用庫的document, 可以迅速了解api的含義, 利於利用庫進行快速開發,而對庫的api新增的過濾規則,對應用**是透明的。

庫引用後, 為庫新增屬性(old), 記錄原始api函式, 然後對原始api名稱新定義 函式, 函式中呼叫 old屬性記錄的函式,

這樣就可以再 呼叫old屬性記錄的函式之前, 做一些過濾規則, 例如對函式入參做 合法性判斷,新增安全判斷條件。

給出例子:

檔案 modulea.lua 中, 定義了乙個 printa 模組, 模組實現了乙個 printtest 介面

--

------------- modulea.lua -----------------

local

print = print

module ("

printa")

function

printtest()

print("

module in printa print")

end

過載指令碼, 引用 modulea.lua

過載 printtest 介面, 列印測試, 先原始介面列印, 再執行過載介面中列印。

require

"modulea

"printa.printtest_old =printa.printtest

printa.printtest = function

() printa.printtest_old()

print("

printtest of printa module is reimplement")

endprinta.printtest()

列印:

module in printa print

printtest of printa module is reimplement

>exit code: 0

模組間互相呼叫的一種方法

模組間互相呼叫的一種方法 在程式設計中,需要把程式根據功能劃分多個模組,多個模組間免不了互相呼叫一些服務函式,這樣會使模組間剪不斷,理還亂!利用服務中心的思想,可以使各個模組間的關係比較簡單。模組間的呼叫通過中心伺服器交換,彼此沒有聯絡,這樣模組間可以到達低耦合,高內聚。實現方法 class bas...

反射的另外一種方法

t instance default t type type typeof t system.reflection.constructorinfo constructorinfoarray type.getconstructors system.reflection.bindingflags.ins...

混淆id的一種方法

眾所周知,在web應用的api中,總是會出現資料庫item的id。比如get posts 1表示獲取id為1的文章內容。這樣做十分簡潔,但存在被人爬資料的風險。比如我可以大致猜測或者試一下id的範圍,1,2,3.10000這樣迭代地爬資料。如果伺服器不做訪問限制,很輕易就能把所有資料就能爬下來。而且...