• 沒有找到結果。

第二章 文獻探討

2.1 U NIFIED M ODELING L ANGUAGE

2.1.2 Meta Object Facility (MOF)

MOF是OMG用 來 描 述OCL 、QVT與UML 的基礎, MOF由Meta-Class 與 Meta-Association等類似於類別圖與關聯線所組成的集合[5],其定義UML模型的 Meta-Model;M1 透過描述的屬性以及類別塑模出類別圖,M0 屬於描述類別圖 中屬性資料部分。

Class

Attribute Class

Title:String Book Title:String

Book

Title=‘ABC’

M0 M1 M2

M3

<<instance of>>

<<instance of>> <<instance of>>

<<instance of>> <<instance of>>

圖5. 類別圖之 MOF 架構 2.2 模型驅動架構

OMG在2001年提出MDA開發模式,其關鍵是將軟體開發過程中每個階段的 產出設為下一階段的輸入,MDA發展生命週期與其它的開發模式並無太大不 同,在流程方面一樣由需求→分析→設計→程式撰寫→部署,主要強調的差別在 於各階段的產出是由電腦可理解的正規模式表達[2],主要是使用UML,通常包 含動態的循序圖和靜態的類別圖,以及OCL來呈現[29]。圖6說明MDA軟體發展 週期的內容與產出,MDA在需求階段主要的產出大部分為文字,也是就是 Computation Independent Model (CIM),透過分析,將該階段的產出建構出 Platform-Independent Model (PIM),一樣的,PIM是進行低階設計的輸入,之後 產出Platform-Specific Model (PSM),而PSM是進行程式編輯的輸入,該階段的產 出為程式碼。

需求

Model)、來源模型的Meta-Model(Source Meta-Model)、目標模型(Target Model)、 目標模型的Meta-Model(Target Meta-Model)。

執行轉換

(表3),市面上大致可分為 Open Source Tools 與 Commercial Tools 兩種 [4]。比 較知名的有Borland Together、Power Designer 與 Rational Rose。Borland Together 為Borland 公司所開發的一個整合型 CASE 工具,支援 UML 2.0 版的圖形,也支 援圖形轉換程式碼的功能以及 OCL 的語法檢測 [3],而本研究使用 Borland Together 來進行 QVT 的語法檢測並執行 PIM 模型的轉換。

表3. MDA 轉換工具列表

Open Source Tools Commercial Tools

AndroMDA (J2EE code generation) ArcStyler (MDA tool from Interactive Objects)

ATL (Eclipse plugins) iQgen 3.0 (Template-based generator) GMT (Generative Model Transformer) MCC (Model Component Compiler,

J2EE)

KMF (Kent Modeling Framework) MDWorkbench (Text and model transformation toolset)

Middlegen (Database driven code

generator) MetaEdit+ (Modeling and Metamodeling tool)

ModFact (MOF Repository and

QVT-like engine) Model-in-Action (code generation and model to model transformation) MOFScript (Eclipse plugin) OptimalJ (PSM transformations,

integrated UML tool) MTF (IBM Model Transformation

Framework Power Designer MTL Engine (Integrates with Netbeans

MDR amd Eclipse EMF) Rational Rose OpenArchitectureWare

(Template-based generator framework) SosyInc (Modeler and Transformation Engine)

OpenMDX (Integrates with several

tools, J2EE, .Net) Together XDoclet (Attribute based code

generation tool for J2EE Xactium XMF Mosiac (Model-based mapping, generation and execution tool)

2.3 QVT 轉換技術介紹

Operational 2.3.1 Object Constraint Language

OCL在1997年由IBM公司所發展,原來是應用在其保險部門的商業塑模語 (Gardner, Griffin, Koehler, &

Hauser, 2003)[16]

針對QVT規格書提出建議,並交互比較討論 其亮點,基於作者本身的實際轉換經驗,建 議其標準制定。

(Graham, 2004)[18] 在MDA架構下,探討QVT在開發過程中的有 用性與複雜性,並以圖形化的方式描述QVT 應用於UML模型至Java程式碼的轉換架構。

表4. QVT 相關研究 (續)

(Greenyer & Kindler, 2007)[19] 探討Triple Graph Grammars (TGGs) 與QVT 兩者的轉換架構以及使用語法,並比較其相 同與相異之處。

(Kurtev, 2008)[22] 總結開發人員對於一般轉換個案所遇到的問 題以及關鍵要求,並描述了QVT目前的架 構、規範和問題,對於架構中的三個子語言 簡單說明並歸納目前可用的轉換工具。

(Laarman, 2009)[23] 探討 QVT 與 ATL 的轉換結構與編譯方式,

並在 ATL 的編譯器上執行 QVT 轉換,實現 兩者的兼容性與互相操作性。

(Barendrecht, 2010)[7] 使用QVT 語法轉換一種描述計算過程與模擬 物理過程的系統模型(hybrid automata),將 其Compositional Interchange Format (CIF) 模 型轉換為Ariadne 模型。

(Bosems , 2011)[10] 探討 ATL 與 QVT 兩種方法的轉換,並建構 出數學模式比較兩者的轉換效率。

(Dongen, 2012) [13] 提出一種以視覺化的方式表達QVT 轉換模型 的方法,藉以了解來源模型與目標模型元素 之間的關係。

對於過去研究的整理,發現部分研究僅片段式的比較語法之間的不同,或是 建立小型個案用以驗證不同語法之間的轉換效率,少有研究以三層式的系統架構 進行完整的個案轉換探討。

2.4 QVT 基本語法

本節介紹 QVT 基本語法,其包含 QVT 的基本操作語法與變數、基本資料 型態、運算式以及集合類型語法,做為進一步介紹轉換語法的基礎。

2.4.1 基本操作語法與變數

QVT 中常用的操作語法為"."符號,通常應用在物件上,呼叫物件之中所包 含的屬性,與Java 語言中的"."一樣,例:下列表示將 The type of the column 字 串存至 myColumn 之 type 屬性。

myColumn.type := 'The type of the column';

QVT 中常用的基本變數有 result 與 self,result 代表目標模型之參照,存放 著轉換結果並回傳至目標模型,例:下列表示Method 函數回傳結果將存放置目 標模型之參照result 中。

result := MethodA();

而self 為則本身之參照,可用來呼叫函數或是物件,例:下列表示將本身之 name 存至新增變數 mySting 中。

var myString := self.name;

2.4.2 基本型態描述

QVT常用的資料型態有Boolean(布林)、Integer(整數)、Real(實數)、String(字 串),表5列出QVT常用的資料型態以及其範例值。

表5. QVT 基本資料型態

型態 範例

Boolean True, false

Integer 1, 2, 3, -7, 48, 25518, ...

Real 2.3, 9.65, 3.141, ...

String 'Hello World', 'Apple'

2.4.3 運算式

QVT提供對基本資料型態執行運算的操作,表6是Integer、Real、Boolean與 String的基本運算符號。表7是Boolean、Integer/Real的基本運算。表8是字串的基 本運算。

表6. QVT 基本運算符號

型態 執行操作

Integer +, -, *, /

Real +, -, *, /

Boolean and, or, xor,not,if-then-else

String substring()

表7. Boolean、Integer/Real 基本運算 String.toLower() 字串轉小寫 String String.toUpper() 字串轉大寫 String String.substring(int,int) 傳回字串中指定位置間的子字串 String String1 = string2 判斷字串是否相等 Boolean String1 <> string2 判斷字串是否不相等 Boolean

2.4.4 條件判斷式語法描述

QVT可以使用if-else運算,描述方法為:if (判斷式) then (敘述) else

(敘述) endif,例:下列表示將來源name字串值做判斷並更改其值。

if name = 'String'

then

'VARCHAR2'

else

name

endif

2.4.5 集合類型

QVT的轉換規則經常會作用在同一類型的元素上,例如類別圖中的類別元素 一併適用某一轉換規則。QVT因此提供集合運算函數方便開發人員進行集合運 算,其相關函數如表9。

表9. 集合表達類型

型態 描述說明

Set() 表示在集合中沒有重複的元素

Sequence() 表示是Bag,但元素有次序性

Bag() 表示在集合中可以存在重複的元素

OrderedSet() 表示是Set,但元素有次序性 2.5 QVT 轉換語法

本研究使用QVT-O將來源模型轉換至目標模型,以下介紹轉換相關語法。

2.5.1 main 程序

QVT程式進入點由main程序開始執行,main程序包含輸入(來源模型)與輸出 參數(目標模型)。圖9是main程序的撰寫語法,括弧內的in表示後面的model是來 源模型,A是來源模型的Meta-Mode,B是目標模型的Meta-Model。

mapping main(in model: A): B {

mapping main(in model: A): B {

進入點來源模型之

行定義,例如定義目標模型名稱或是將其元素呼叫其他轉換函數(如圖11)。

mapping A::A2B() : B{

init{

name := 'A2BModel';

propOfB += d.C2D();

}

mapping A::A2B() : B{

init{

name := 'A2BModel';

propOfB += d.C2D();

}

result := create(propOfA1,propOfA2);

result.propOfB += self.propOfA3.C2D();

}

result := create(propOfA1,propOfA2);

result.propOfB += self.propOfA3.C2D();

}

可以進行條件判斷以決定轉換方式。其運作是將一個或多個來源傳入值後,經由

query change(in name : String) : String{

if name = 'A' then 'B' else

query change(in name : String) : String{

if name = 'A' then 'B' else

法與其呼叫之query判斷函數,在參考Meta-Model定義來源模型(A)與目標模型(B) 後,加上when子句可以對來源模型加以限制,當when子句中所呼叫的query函數 回傳值為false時,後面所定義的轉換操作將不會執行,並且回傳空值。

mapping A::A2B() : B when{self.hasClasses()}

{...}

query A::hasClasses() : Boolean {

name ='Customer_Data' or name='Order_Data' or name='Bag_Data' or name='Lunch_Data';

} mapping A::A2B() : B when{self.hasClasses()}

{...}

query A::hasClasses() : Boolean {

name ='Customer_Data' or name='Order_Data' or name='Bag_Data' or name='Lunch_Data';

}

2.6.3 resolve 新增語法

result := self.resolve(B)-> any(true);

} object {

name := self.name;

}

result := self.resolve(B)-> any(true);

} object {

name := self.name;

}

metamodel 'http://www.borland.com/together/erPhysical';

metamodel 'http://www.borland.com/together/uml';

metamodel 'http://www.borland.com/together/uml20';

mapping main(in model: uml::together::Model): erPhysical::Model { schemas +=

model.allInstances(uml::kernel::packages::Package).toSchema();

}

mapping

uml::kernel::packages::Package::toSchema() : erPhysical::Schema{

init {

var classes :=

self.ownedMembers.oclAsType(uml20::classes::Class);

}

name := self.name;

visibility := self.visibility;

entities += classes.toEntityInitial();

}

mapping

uml20::classes::Class::toEntityInitial() :erPhysical::Entity { init {

result :=

self.resolve(erPhysical::Entity)->any(true);

} object {

name := self.name;

}

mapping main(in model: uml::together::Model): erPhysical::Model { schemas +=

model.allInstances(uml::kernel::packages::Package).toSchema();

}

mapping

uml::kernel::packages::Package::toSchema() : erPhysical::Schema{

init {

var classes :=

self.ownedMembers.oclAsType(uml20::classes::Class);

}

name := self.name;

visibility := self.visibility;

entities += classes.toEntityInitial();

}

mapping

uml20::classes::Class::toEntityInitial() :erPhysical::Entity { init {

result :=

self.resolve(erPhysical::Entity)->any(true);

} object {

name := self.name;

}

2.7.1 Meta-Model 的定義

MDA轉換是在MOF的架構下執行,程式碼必須先定義來源模型與目標模型 的Meta-Model(M2層)。以Borland Together軟體平台為例,程式碼先匯入三個 Borland Together所提供的Meta-Model(erPhysical、uml、uml20)(圖17),QVT 程式才能依據Meta-Model進行轉換。

metamodel 'http://www.borland.com/together/erPhysical';

metamodel 'http://www.borland.com/together/uml';

metamodel 'http://www.borland.com/together/uml20';

圖17. Borland Together 軟體平台中 Meta-Model 的定義

2.7.2 轉換進入點

程式轉換以main程序為起點(如圖18),並在main程序中輸入來源模型之 Meta-Model 參 數 , 該 範 例 為 uml::together::Model ; 並 定 義 輸 出 目 標 模 型 之 Meta-Model參數,該範例為erPhysical::Model,main程序主體叫toSchema函數進 行來源模型的轉換。

mapping main(in model: uml::together::Model): erPhysical::Model { schemas +=

model.allInstances(uml::kernel::packages::Package).toSchema();

}

圖18. 轉換進入點 main 程序

2.7.3 toSchema 函數

toSchema 函 數 中 首 先 定 義 了 來 源 模 型 之 Meta-Model 參 數

( uml::kernel::packages::Package ) 與 輸 出 目 標 模 型 之 Meta-Model 參 數

(erPhysical::Schema)(圖19), init部分透過oclAsType(uml20::classes::Class)將 ownedMembers裡的圖形鎖定在類別圖,並存放至classes變數中,以便在object部 分呼叫函數進行轉換。object部分則是定義轉換目標模型erPhysical::Schema中的 name與visibility,以及將init部分所新增的classes變數呼叫toEntityInitial函數進行 轉換並存放至entities中。

mapping

uml::kernel::packages::Package::toSchema() : erPhysical::Schema when { self.hasClasses() }

{ init {

var classes :=

self.ownedMembers.oclAsType(uml20::classes::Class);

}

object {

name := self.name;

visibility := self.visibility;

entities += classes.toEntityInitial();

}

圖19. toSchema 函數程式碼

2.7.4 toEntityInitial 函數

toEntityInitial函數輸入來源為類別圖,輸出為實體資料表,在init部分使用 resolve語法並輸入新增模型之Meta-Model參數(erPhysical::Entity)(圖20),並 放 入 目 標 模 型 的 結 果 中 (result ), 表 示 目 標 模 型 將 新 增 實 體 資 料 表

(erPhysical::Entity),object則將新增的實體資料表之名稱進行定義,達成轉換 之目的。

mapping

uml20::classes::Class::toEntityInitial() :erPhysical::Entity { init {

result :=

self.resolve(erPhysical::Entity)->any(true);

}

object erPhysical::Entity { name := self.name;

} }

圖20. toEntityInitial 函數程式碼

2.8 小結

透過本章節文獻探討,了解物件導向分析中UML的類別圖形、MDA的轉換 架構與QVT的技術架構,並藉由QVT基本語法與架構之介紹,進一步應用在模 型轉換上,了解模型轉換是從大範圍至小範圍依序使用函數呼叫的方式,階層式 的進行轉換[13],在主要進入點中定義目標模型的內容外,也鎖定其來源模型中 的元素集合並呼叫其他函數進行轉換,例如轉換一個擁有屬性的類別圖,程式碼 首先定義進入點為類別圖後,在主體內容呼叫函數對類別圖所包含的屬性進行轉 換,而被呼叫的函數中可能又會呼叫其他函數來針對屬性中的元素做轉換,QVT 就是依此規則一層一層的將來源模型轉換至目標模型中。

第三章 QVT 轉換規則

本章以第二章的QVT語言為基礎,說明如何將以自然語言表示的模式轉換規 則以QVT程式表達。由於模式轉換規則有無限種需求與可能,本研究以辛信興 [32]所制定的PIM至PSM轉換規則為範圍,其包含三部分:使用者介面轉換規則、

本章以第二章的QVT語言為基礎,說明如何將以自然語言表示的模式轉換規 則以QVT程式表達。由於模式轉換規則有無限種需求與可能,本研究以辛信興 [32]所制定的PIM至PSM轉換規則為範圍,其包含三部分:使用者介面轉換規則、