DolphinDB模塊複用教程

在軟件團隊開發項目中,要提高開發效率和質量,代碼必然要進行封裝和重用。在使用DolphinDB的腳本進行開發時,可使用module和use方法,來聲明和使用可重用模塊。服務器


1. Module(模塊)介紹

在DolphinDB中,模塊是指只包含函數定義的代碼包。它具備如下特色:app

  • 以.dos做爲模塊文件的後綴,dos是"dolphindb script"的縮寫
  • 模塊文件保存在DolphinDB節點的 [home]/modules目錄下
  • 模塊文件第一行以聲明模塊語句module moduleName開頭
  • 模塊文件內容僅包含函數定義


2. 定義模塊

2.1 建立模塊目錄

默認狀況下,全部的模塊定義在[home]/modules目錄下,[home]由系統配置參數home決定,能夠經過 getHomeDir() 函數獲取。好比DolphinDB節點的home目錄爲:ide

/root/DolphinDB/server

那麼咱們須要在該目錄下建立modules子目錄來保存模塊文件,最終模塊目錄爲:函數

/home/root/DolphinDB/server/modules


2.2 建立模塊文件spa

在modules目錄下建立以.dos爲後綴的模塊文件,好比FileLog.dos。模塊文件的第一行必須是模塊聲明語句。模塊聲明語句的語法以下:調試

module moduleName

moduleName必須與模塊文件的名稱一致,好比在FileLog.dos中聲明模塊:日誌

module FileLog

聲明模塊後,咱們能夠開始編寫模塊代碼。例如,FileLog.dos的內容以下:orm

module FileLog
//向指定日誌文件寫入日誌
def appendLog(filePath, logText){
	f = file(filePath,"a+")
	f.writeLine(string(now()) + " : " + logText)
	f.close()
}

在模塊文件中,僅容許封裝函數定義,其餘非函數定義代碼將被忽略server


3. 導入模塊

在DolphinDB中,使用use關鍵字來導入一個模塊。注意,use關鍵字導入的模塊是會話隔離的,僅對當前會話有效。導入模塊後,咱們能夠經過如下兩種方式來使用模塊內的自定義函數:blog

(1)直接使用模塊中的函數:

use FileLog
appendLog("mylog.txt", "test my log")

(2)經過完整路徑來調用模塊中的函數:

use FileLog
FileLog::appendLog("mylog.txt", "test my log")


4. 規劃模塊

DolphinDB引入了命名空間的概念,支持對模塊進行分類和規劃。


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版本開始提供了遠程同步模塊的功能,具體用法以下圖所示:

91da01301a0b5e729517a5cb2d3a2d56.png

此操做會將Modules目錄下的全部文件和子目錄同步到GUI鏈接的DolphinDB節點的[home]/modules目錄下,同步完成後,就能夠在Server上直接執行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。

相關文章
相關標籤/搜索