• 沒有找到結果。

Xtext 使用較輕量的依賴注入(Dependency injection, DI) 架構 Google Guice,

藉此連結了整個程式語言以及開發環境的基礎功能。所謂的依賴注入是透過抽象介面的

Xtend 是一種靜態型別(statically-typed)的程式語言,能夠緊密的與 Java Virtual Machine 進行整合並且在上面執行,所謂的靜態型別是指,對於變數的型別檢查是在程 式編譯時期的語意分析中所進行。Xtend 並非想取代 Java 語言,而是與 Java 保持一種 高度互動的關係,Java 可以直接對 Xtend 的方法與函數進行呼叫,並且對於 Xtend 的編 輯環境也與 Eclipse 上的 JDT 進行整合,所以 Xtend 與 Java 兩者是可以同時存在的,

Xtend 相對於 Java 語言增加了以下幾個概念:

• 允許進行運算子多載(operator overloading)的程式寫作。

• 提供功能較強大的 switch expression。

• 在 Xtend 裡沒有 statements 的描述,全部都是 expression 的描述。

• 對於範本的 expressions 描述,提供智慧的空白區域處裡。

• 對於外部方法(methods)的使用,利用 inject 的方式引入。

• 對於物件屬性的存取語法,提供了 getter 與 setter 的存取方式。

• 提供 multiple dispatch,又名 polymorphic method invocation。

• 編輯完成的 Xtend 模型轉換程式會被轉換成一般的 Java 程式而非 bytecode。

表 2.1 為 Xtend 的基本程式結構,乍看之下容易讓人誤以為是 Java 程式,一個基 本的 Xtend 程式從 package 的宣告開始,接著是 import 的引用區塊,最後是 class 的 定義,class 裡包含的是一些函式、模型轉換規則或模型範本的描述。事實上 Xtend 的 class 與函式會被自動轉換成 Java 的 class 與方法,並且儲存於對應的 Java package 裡。

表 2.1:基本 Xtend 程式結構。

01

package edu.nccu.cs.wta.pimwizarddsl

02

import java.util.*

03

class MyClass

{

04

def String first(List<String> elements) {

05 return elements.get(0)

06 } 07 }

法,所以回傳值型別是可以省略的。在 Xtend 裡對於函式類型加入了「Dispatch 函式」

與「Create 函式」的概念;一般函式的 binding works 對於參數的限制通常是靜態的參 數型別,但有些時候這並非是我們想要的,尤其當我們的參數具有多型(polymorphic) 的特性時,所以 Dispatch 函式主要是用來產生一組 overloaded functions polymorphic,

在程式執行時根據每一個不同的參數型別,再來決定哪一個多載的函式要被呼叫,透過 在「def」後面加入保留字「dispatch」來進行 Dispatch 函式的建立。

Create 函式在 Xtend 裡主要是用來進行模型的轉換,當我們需要產生多個新的物件,

並透過現有的物件給予初始值的時候,一般的程式寫作模式會需要兩個或兩個以上的函 式來完成此動作,但透過 Create 函式的使用可以大大簡化程式碼的複雜度。表 2.2 為 Create 函式的範例,複製一個新的 Person 物件,透過在「def」後面加入保留字「create」

的使用來建立 Create 函式,target 代表的是新宣告的 Person 物件,接著在函式裡進行 新物件的初始化,最後此 Create 函式會以 Person 作為回傳值型別,並且回傳 target 物件。

表 2.2:Create 函式範例。

最後是 Xtend 的程式碼產生器建構方式,Xtend 利用「Rich Strings」來進行模型 轉換範本的描述,Rich Strings 允許可閱讀的字串內容進行串聯,不再只是片段單行的 描述,表 2.3 為 Rich Strings 的範例,產生一個 Java Class 的範本,利用兩個「'''」

01

def create target:new Person() copy(Person p) {

02 target.name = p.name

03 }

最後 Rich Strings 會被轉換成有效的字串串聯,並且以 Java 的 CharSequence 作為回 傳值型態進行回傳。 DSML(Domain-Specific Modeling Language)來描述與定義導引精靈,並進一步產生 相關的導引精靈程式,最後以ASL(Application Specification Language)[14]為例

01

def toClass(Entity e) '''

02

package «e.packageName»;

03

«e.placeImports»

04

public class «e.name» {

05

«FOR e.members»

06

«member.toMember»

07

«ENDFOR»

08

}

09

'''