解釋器模式本質(zhì):為某一款軟件設(shè)計一種腳本語言,序列化軟件中的方法,以便通過腳本來操作軟件。最典型的例子就是Windows的Powershell,據(jù)說作者當(dāng)年結(jié)果很悲催,利用空閑時間開發(fā),還被微軟認(rèn)定為不務(wù)正業(yè),做降薪降級處理。
本文目錄
一、解釋器模式簡介
??????????????????????二、解釋器模式范例
三、需要安裝的軟件、工具包
四、共享代碼
一、解釋器模式簡介
解釋器模式解決的實(shí)際問題:
在軟件開發(fā)中,會遇到有些問題多次重復(fù)出現(xiàn),而且有一定的相似性和規(guī)律性。如果自己設(shè)計一個簡單的腳本語言,就可以靈活的處理問題,遇到特殊需求可以在軟件頂層自定義和擴(kuò)展功能。使用解釋器模式是比較好選著。
解釋器模式的定義:
解釋器(Interpreter)模式的定義:給分析對象定義一個語言,并定義該語言的文法表示,再設(shè)計一個解析器來解釋語言中的句子?!S基百科
解釋器模式的優(yōu)點(diǎn)如下:
1、擴(kuò)展性好。由于在解釋器模式中使用類來表示語言的文法規(guī)則,因此可以通過繼承擴(kuò)展功能,符合開閉原則。
2、容易實(shí)現(xiàn)。在語法樹中的每個表達(dá)式節(jié)點(diǎn)類都是相似的,所以實(shí)現(xiàn)其擴(kuò)展較為容易。
3、組合復(fù)用??梢酝ㄟ^組合復(fù)用已有的功能實(shí)現(xiàn)新的功能(在性能要求不高的前提下)。
解釋器模式的缺點(diǎn)如下:
1、比正常的生成的代碼執(zhí)行效率低。解釋器模式中通常使用大量的循環(huán)和遞歸調(diào)用,當(dāng)要解釋的句子較復(fù)雜時,其調(diào)用效率低,適當(dāng)約束使用范圍,不要將其完全當(dāng)通用編程語言使用,限制遞歸調(diào)用次數(shù),使系統(tǒng)邏輯清晰,更容易調(diào)試。
2、會增加很多類。解釋器模式中的每條規(guī)則至少需要定義一個類,當(dāng)系統(tǒng)包含的規(guī)則越多,類的個數(shù)就越多,會導(dǎo)致類級數(shù)膨脹,盡量使用當(dāng)前功能組合,除非特別強(qiáng)調(diào)性能才新添語法規(guī)則。
解釋器模式包含以下主要角色:
1、AbstractExpression(抽象表達(dá)式):在抽象表達(dá)式中聲明了抽象的解釋操作,它是所有終結(jié)符表達(dá)式和非終結(jié)符表達(dá)式的公共父類。(抽象編程下可以一直遞歸下去主要包含解釋方法 )
2、終結(jié)符表達(dá)式(Terminal Expression)角色:是抽象表達(dá)式的子類,用來實(shí)現(xiàn)文法中與終結(jié)符相關(guān)的操作,文法中的每一個終結(jié)符都有一個具體終結(jié)表達(dá)式與之相對應(yīng)。(不可以遞歸的點(diǎn)的節(jié)點(diǎn),直接得到結(jié)果)
3、非終結(jié)符表達(dá)式(Nonterminal Expression)角色:也是抽象表達(dá)式的子類,用來實(shí)現(xiàn)文法中與非終結(jié)符相關(guān)的操作,文法中的每條規(guī)則都對應(yīng)于一個非終結(jié)符表達(dá)式。(作為一個語法轉(zhuǎn)折點(diǎn),可以持續(xù)遞歸,和抽象表達(dá)式相通)
4、Context(環(huán)境類):環(huán)境類又稱為上下文類,保存中間變量等功能。
解釋器的UML關(guān)系圖如下:
二、解釋器模式范例
我們以計算為例來寫一個解釋器模式,具體UML關(guān)系如下圖:
1、終結(jié)符:Variant T:
1.1、Variant T:Double T、String T;
2、非終結(jié)符:Calc T、System T兩類。
2.2、System:Show Variable。
計算的文法規(guī)則為FUN,V1,V3,V3,......:其中首個字符串FUN為表達(dá)式名稱,V1,V2,V3....為變量,輸入輸出為FUN規(guī)定,其中用逗號隔開,為了方便使用中英文逗號均可。
例子:SUB,a,b,c含義為a+b=c =>ADD,第一個字符串為表達(dá)式名稱,a,b類型為變量或常數(shù),c為變量或空字符,為變量時保存數(shù)據(jù),為空字符不保存結(jié)果,變量不能以數(shù)字開頭。
下邊開始編程。
1、創(chuàng)建三個類AbstractExpression、Noterminal Expression和Terminal Expression,其中Noterminal Expression和Terminal Expression繼承至AbstractExpression。當(dāng)前類關(guān)系如下圖:
2、創(chuàng)建一個類命名為Context。
3、在AbstractExpression添加兩個動態(tài)VI Interpert(Info)和Tostring()提供給子類重寫。
4、創(chuàng)建類Variant T、Calc T、System T繼承至Terminal Expression,當(dāng)前類關(guān)系如下圖:
5、創(chuàng)建類Double T、String T繼承至Variant T,當(dāng)前類關(guān)系如下圖:
6、創(chuàng)建類ADD Sub繼承至Calc T,當(dāng)前類關(guān)系如下圖:
7、創(chuàng)建類Show Variable繼承至System T,當(dāng)前類關(guān)系如下圖:
8、為Context添加私有屬性和方法。
8.1、添加一個數(shù)據(jù)引用,值類型為變體,命名為Variable Map;
8.2、添加字符串引用并命名為Log ref,創(chuàng)建其數(shù)據(jù)成員訪問;
8.3、添加靜態(tài)VI命名為Get Variabe,用于獲取數(shù)據(jù)中的表達(dá)式。
8.4、添加靜態(tài)VI命名為Set Variabe,用于保存數(shù)據(jù)中的表達(dá)式。
8.5、添加一個靜態(tài)VI命名為Do Interpert,用于執(zhí)行文本表達(dá)式,其工作方式是先獲取表達(dá)式,然后執(zhí)行Interpert()動態(tài)方法。
8.6、創(chuàng)建Write Log方法,用于打印執(zhí)行各種狀態(tài)。
8.7、創(chuàng)建Initial Variable方法,初始化數(shù)據(jù)引用。
8.8、創(chuàng)建Dispose Variable方法,銷毀其數(shù)據(jù)引用。
先創(chuàng)建終結(jié)表達(dá)式的成員方法:
9、在Double T中添加數(shù)值控件并創(chuàng)建其數(shù)據(jù)成員訪問、重寫Double T父類方法Interpert(Info)和Tostring(),先在表達(dá)式尋找是否存在,如果存在則為變量,不存在則為常量。
10、在String T中添加字符控件并創(chuàng)建其數(shù)據(jù)成員訪問、重寫Double T父類方法Interpert(Info)和Tostring()。
11、在ADD的私有數(shù)據(jù)中添加三個AbstractExpression命名為x,y,Result并創(chuàng)建其數(shù)據(jù)成員訪問,三個數(shù)據(jù)分別表示計算輸入和輸出結(jié)果。然后重寫Interpert(Info)和Tostring()。
11、在SUB的私有數(shù)據(jù)中添加三個AbstractExpression命名為x,y,Result并創(chuàng)建其數(shù)據(jù)成員訪問,三個數(shù)據(jù)分別表示計算輸入和輸出結(jié)果。然后重寫Interpert(Info)和Tostring()。
12、重寫Show Variable的動態(tài)方法,如果是變量就對變量執(zhí)行Tostring操作然后顯示,如果不是就直接顯示。
下邊使用使用上邊的類編寫運(yùn)行代碼:
13、創(chuàng)建一個VI命名為Example,放置Context、double T、String T、ADD、SUB、Show Variable。如下圖連線,其中a、b、c為double T。
14、創(chuàng)建一個字符串顯示控件,創(chuàng)建其引用設(shè)置到Context中,在后端添加Do Interpert和文本表達(dá)式后,在前后添加創(chuàng)建和銷毀引用方法。文本注釋:
ADD,100,10,a//a=100+10
Show,ADD//顯示ADD的計算過程
Show,a//顯示參數(shù)a的值
SUB,a,b,c//c=a+b
Show,SUB//顯示SUB的計算過程
Show,c//顯示參數(shù)c的值
15、下邊圖片是輸出結(jié)果:
小結(jié):上面的代碼完全實(shí)現(xiàn)了開始的設(shè)想,運(yùn)行時將文本表達(dá)式翻譯成代碼執(zhí)行結(jié)果,將結(jié)果保存到定義的變量中。
上面代碼還存在一些問題:
1、當(dāng)函數(shù)輸入錯誤時的處理;
2、參數(shù)輸入錯誤的處理,參數(shù)的表達(dá)式定義;
3、邏輯控制 if for call SubContext。
本文是自動化測試架構(gòu)的核心內(nèi)容,本來想放到Pro里講解,但是覺得沒意義,直接在這里寫完,Pro里會有部分優(yōu)秀的設(shè)計加進(jìn)去完善部分功能,這個也是我寫文章的核心宗旨:寫一些有用的設(shè)計,而且可以幫助讀者實(shí)際工作中應(yīng)用,不會只講大道理。
-
軟件
+關(guān)注
關(guān)注
69文章
4944瀏覽量
87500 -
腳本語言
+關(guān)注
關(guān)注
0文章
48瀏覽量
8225 -
工具包
+關(guān)注
關(guān)注
0文章
46瀏覽量
9537 -
解釋器
+關(guān)注
關(guān)注
0文章
103瀏覽量
6513
原文標(biāo)題:LabVIEW的編程之道—解釋器模式
文章出處:【微信號:LabVIEW的編程之道,微信公眾號:LabVIEW的編程之道】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論