在軟件團隊開發項目中,要提高開發效率和質量,代碼必然要進行封裝和重用。在使用DolphinDB的腳本進行開發時,可使用module
和use
方法,來聲明和使用可重用模塊。服務器
1. 模塊介紹
在DolphinDB中,模塊是指只包含函數定義的代碼包。它具備如下特色:app
- 以.dos做爲模塊文件的後綴,dos是DolphinDB script的縮寫
- 模塊文件保存在DolphinDB節點的[home]/modules目錄下
- 模塊文件第一行以聲明模塊語句
module moduleName
開頭 - 模塊文件內容僅包含函數定義
2. 定義模塊
2.1 建立模塊目錄函數
默認狀況下,全部的模塊定義在[home]/modules目錄下,[home]由系統配置參數home
決定,能夠經過getHomeDir()函數獲取。好比DolphinDB節點的home目錄爲/root/DolphinDB/server,那麼咱們須要在該目錄下建立modules子目錄來保存模塊文件,最終模塊目錄爲/home/root/DolphinDB/server/modules。spa
2.2 建立模塊文件調試
在modules目錄下建立以.dos爲後綴的模塊文件,好比FileLog.dos。模塊文件的第一行必須是模塊聲明語句。模塊聲明語句的語法以下:日誌
module moduleName
moduleName必須與模塊文件的名稱一致,好比在FileLog.dos中聲明模塊:code
module FileLog
聲明模塊後,咱們能夠開始編寫模塊代碼。例如,FileLog.dos的內容以下:server
module FileLog //向指定日誌文件寫入日誌 def appendLog(filePath, logText){ f = file(filePath,"a+") f.writeLine(string(now()) + " : " + logText) f.close() }
在模塊文件中,僅容許封裝函數定義,其餘非函數定義的代碼將被忽略。blog
3. 導入模塊
在DolphinDB中,使用use
關鍵字來導入一個模塊。注意,use關鍵字導入的模塊是會話隔離的,僅對當前會話有效。導入模塊後,咱們能夠經過如下兩種方式來使用模塊內的自定義函數:ip
(1)直接使用模塊中的函數:
use FileLog appendLog("mylog.txt", "test my log")
(2)經過完整路徑來調用模塊中的函數:
use FileLog FileLog::appendLog("mylog.txt", "test my log")
4. 規劃模塊
DolphinDB database引入了命名空間的概念,支持對模塊進行分類和規劃。
4.1 聲明模塊命名空間
若是咱們須要對模塊進行分類,能夠經過多級路徑爲規劃模塊的命名空間。例如,現有兩個模塊FileLog和DateUtil,它們的存放路徑分別爲modules/system/log/FileLog.dos和modules/system/temperal/DateUtil.dos,那麼這兩個模塊相應的聲明語句以下:
- modules/system/log/FileLog.dos
module system::log::FileLog
- modules/system/temperal/DateUtil.dos
module system::temperal::DateUtil
4.2 調用命名空間模塊
咱們能夠在use
關鍵字後加完整路徑來導入命名空間下的模塊。例如,導入FileLog模塊:
use system::log::FileLog //全路徑調用 system::log::FileLog::appendLog("mylog.txt", "test my log") //直接調用已導入模塊中的函數 appendLog("mylog.txt", "test my log")
5. 在GUI中遠程調試模塊
當工做機和DolphinDB服務器不是同一臺機器時,咱們在工做機上編輯的模塊代碼,不能直接在遠程服務器的DolphinDB上經過use
導入,須要先將模塊文件上傳到[home]/modules的對應目錄,才能經過use
調用模塊。
DolphinDB GUI從0.99.2版本開始提供了遠程同步模塊的功能,具體用法以下圖所示:
此操做會將Modules目錄下的全部文件和子目錄同步到GUI鏈接的DolphinDB節點的[home]/modules目錄下,同步完成後,就能夠直接執行use
導入模塊。
6. 注意事項
6.1 同名函數定義規則
不一樣模塊能夠定義相同名字的函數。若是使用全路徑調用函數,DolphinDB能夠經過模塊命名空間來區分函數名。若是直接調用函數:
- 若是已導入的模塊中只有一個模塊包含該函數,DolphinDB會調用該模塊的函數。
- 若是已導入的模塊中有多個模塊包含該函數,DolphinDB解析腳本時會如下拋出異常:
Modules [Module1] and [Module2] contain function [functionName]. Please use module name to qualify the function.
- 若是已導入模塊中與自定義函數重名,系統會默認使用模塊中的函數。若是要調用自定義函數,須要聲明命名空間。自定義函數和內置函數的默認命名空間爲根目錄,用兩個冒號表示。好比:
//定義模塊 module sys def myfunc(){ return 3 } //自定義函數 login("admin","123456") def myfunc(){ return 1 } addFunctionView(myfunc) //調用 use sys sys::myfunc() //調用模塊的函數 myfunc() //調用模塊的函數 ::myfunc() //調用自定義函數
- 若是已導入的模塊中不包含該函數,DolphinDB會在系統內置函數中搜索該函數。若是內置函數中也沒有該函數,將拋出函數爲定義的異常。
6.2 刷新模塊定義
在開發階段調試模塊代碼時,若是須要反覆修改模塊代碼並刷新定義,只需從新執行模塊文件中的代碼便可,這種方法僅對當前會話有效。
6.3 模塊間的互相調用
模塊之間能夠單向引用,好比模塊a引用模塊b,模塊b引用模塊c,不支持交叉引用,好比模塊a引用模塊b,模塊b引用模塊a。