• 沒有找到結果。

第三章 QVT 轉換規則

3.2 模式轉換規則:QVT 語言表示法

3.2.3 資料層轉換規則

object{

supplier := LinkSupplier;

} }

3.2.3 資料層轉換規則

規則D1

D1轉換規則與 P3以及 B5規則一樣,均屬於類別圖之型別以及屬性之轉換,

其轉換規則以圖形化呈現如 圖 30,所對應之 QVT 程式如 表 20。使用 toClass 函數轉換類別圖,將Persistent entity class 轉換成 Table 類別圖,並呼叫 toAttributes 函數轉換屬性以及屬性型別。

來源模型 目標模型

D1 規則

圖30. D1規則之轉換圖 表20. D1 規則與其對應語法

D1:當 PSM 為關聯資料庫技術時,將 PIM 中的 Persistent entity class 轉換成 Table 類別圖至 PSM,Persistent entity class 中的屬性型別轉換為與關聯資 料庫技術相對應的屬性型別至PSM 中。

mapping uml20::classes::Class::toClass(): uml20::classes::Class{

init {

result:= self.resolve(uml20::classes::Class)-> any(true);

} object {

name := self.name;

stereotypes+= PHPstereotype(self.stereotypes);

attributes+= self.ownedAttributes.toAttributes();

} }

query PHPstereotype(in name: OrderedSet(String)): OrderedSet(String){

if name = 'Boundary class'->asOrderedSet() then 'Client Page'->asOrderedSet() else

if name = 'Persistent entity class'->asOrderedSet() then 'Table'->asOrderedSet() else

if name = 'Association class'->asOrderedSet() then 'Table'->asOrderedSet() else

if name = 'Non-persistant entity calss'->asOrderedSet() then 'JavaBean'->asOrderedSet() else

if name = 'Control class'->asOrderedSet()

then 'Server Page'->asOrderedSet() else name->asOrderedSet() endif

mapping uml20::kernel::Property::toAttributes() : uml20::kernel::Property {

init {

result := self.resolve(uml20::kernel::Property)-> any(true);

} object {

name := self.name;

type := object uml20::kernel::PrimitiveType{

name := uml2PHP(self.type.name,self.name);

}

表20. D1 規則與其對應語法 (續)

} }

query uml2PHP(in name : String,in propertyname:String) : String{

if name = 'String' then 'VARCHAR2' else toAttributes 函數轉換屬性以及屬性型別(表 21)。

來源模型 目標模型

圖31. D2規則之轉換圖 表21. D2規則與其對應語法

D2:當 PSM 為關聯資料庫技術時,將 PIM 中的 Association class 轉換成 Table 類別圖至PSM,Association class 中的屬性型別轉換為與關聯資料庫技術 相對應的屬性型別至PSM 中。

與上述D1相同。

D2 規則

規則D3

規則D3進行關聯類別之轉換,其轉換規則以圖形化方式呈現如 圖 32,所對 應之 QVT 程式如 表 22。首先在 transD3 函數使用 when 子句呼叫 query 函數判 斷關聯關係是否為多對多,init 程式區塊首先將多對多關係中產生的關聯類別圖 放 至 depsupplier 變 數 中 以 便 在 後 續 傳 入 函 數 進 行 應 用 , 接 著 呼 叫 兩 次 D3associations 函 數 , 分 別 傳 入 client 與 depsupplier 以 及 傳 入 supplier 與 depsupplier,D3associations 函數將傳入的元素呼叫 toClass 函數進行類別圖轉換 並分別存放至clientClass 與 supplierClass 變數中,Object 程式區塊則將 clientClass 與supplierClass 分別存放至目標關聯線類別 client 與 supplier 端並定義兩端基數。

來源模型 目標模型

圖32. D3規則之轉換圖 表22. D3規則與其對應語法

D3:在 PIM 中兩個 Persistent entity class(類別 A 與類別 B)與其之間多對多 的關聯關係所產生的Association class(類別 C),將會轉換為三張 Table 類別圖,類別A 轉成 Table A;類別 B 轉成 Table B;類別 C 轉成 Table C,

其多對多關聯線將轉換為兩條關聯線:Table A 連結至 Table C 的一對多 關聯線,與Table B 連結至 Table C 的一對多關係。

mapping uml20::kernel::KernelAssociation::transD3() : uml20::kernel::KernelAssociation

when{

self.clientCardinality.isMany() and

self.supplierCardinality.isMany()

D3 規則

表22. D3 規則與其對應語法 (續)

} { init{

var depsupplier :=

dependencies.supplier.oclAsType(uml20::classes::Class) ->any(true);

result := D3associations(supplier,depsupplier);

result := D3associations(client,depsupplier);

} }

mapping D3associations(in client : uml::kernel::Element, in depsupplier:uml20::classes::Class)

: uml20::kernel::KernelAssociation{

init{

var clientClass :=

client.oclAsType(uml20::classes::Class).toClass();

var supplierClass :=

depsupplier.oclAsType(uml20::classes::Class).toClass();

}

query String::isMany() : Boolean { ((self.substring(1, 1) <> '1') and

(self.substring(1, 1) <> '0')) or

(self.substring(self.size(), self.size()) <> '1') } D3associations 函數類似,將傳入元素呼叫 toClass 函數進行類別圖轉換並在 Object 程式區塊分別存放至目標 client 與 supplier 端並定義兩端基數。

來源模型 目標模型

圖33. D4規則之轉換圖 表23. D4規則與其對應語法

D4:在PIM中Persistent entity class將轉換為Table類別圖,其關聯線將以相同基 數轉換至PSM中。

mapping uml20::kernel::KernelAssociation::transD4() : uml20::kernel::KernelAssociation

result := D4associations(client,supplier);

} }

mapping D4associations(in client : uml::kernel::Element, in supplier :uml::kernel::Element)

: uml20::kernel::KernelAssociation{

init{

query String::isone() : Boolean { ((self.substring(1, 1) = '1'))}

D4 規則