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 printprinttest 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這樣迭代地爬資料。如果伺服器不做訪問限制,很輕易就能把所有資料就能爬下來。而且...