使用 Eclipse Xtext 简化移动应用开发

  • Jean-Jacques Dubray
  • 张龙

2010 年 8 月 24 日

话题:架构文化 & 方法

近日,Daniel Schneller 通过创建一种语法介绍了 Xtext,该语法提供了:

易于使用且可靠的方式来配置移动 Java 应用的导航。

过去,Daniel 的团队对应用的导航路径进行硬编码,但由于应用快速增长的复杂性,他们需要新的解决方案:

首先,我们想到了基于 XML 的配置,但这么写实在是太麻烦了(读起来也是如此),同时我们还需要在每个应用启动时进行解析,这么做的代价太高了。

最近,他们偶然发现了Eclipse Xtext

Xtext 是个基于 Eclipse 的框架 / 库,用于构建基于文本的 DSL。
简而言之,你只需提供适合需要的新 DSL 的语法描述,然后点几下鼠标就能生成一个带有内容辅助、语法高亮以及大纲视图的 Eclipse 编辑器,此外,还能生成一个基于该语言的代码生成器。

Xtext最初是由Sven Efftinge开发的,作为openArchitectureWare的一部分,今年则成为了 Eclipse 的组成部分。它基于EMF(Eclipse Modeling Framework)ANTLR

Daniel 创建了如下语法

navigation rules for MyApplication

mappings {



 map permission AdminPermission to "privAdmin"

 map permission DataAccessPermission to "privData"

 map coordinate Login to "com.danielschneller.myapp.gui.login.LoginController"



in "com.danielschneller.myapp.login"

 map coordinate LoginFailed to "com.danielschneller.myapp.gui.login.LoginFailedController"

in "com.danielschneller.myapp.login"

 

 map coordinate MainMenu to "com.danielschneller.myapp.gui.menu.MainMenuController"

in "com.danielschneller.myapp.menu"

 map coordinate UserAdministration to "com.danielschneller.myapp.gui.admin.UserAdminController"



in "com.danielschneller.myapp.admin"

 map coordinate DataLookup to "com.danielschneller.myapp.gui.lookup.LookupController"

in "com.danielschneller.myapp.lookup"

}

navigations {



 define navigation USER_LOGON_FAILED

 define navigation USER_LOGON_SUCCESS

 define navigation OK

 define navigation BACK

 define navigation ADMIN

 define navigation DATA_LOOKUP

}

navrules {



 from Login

  on navigation USER_LOGON_FAILED

   go to LoginFailed

  on navigation USER_LOGON_SUCCESS

   go to MainMenu

 from LoginFailed



  on navigation OK

   go to Login

 from MainMenu



  on navigation ADMIN

   go to UserAdministration

   with AdminPermission

  on navigation DATA_LOOKUP

   go to DataLookup

   with DataAccessPermission

 

 from UserAdministration

  on navigation BACK

   go to MainMenu

 from DataLookup



  on navigation BACK

   go to MainMenu

}

凭借 Xtext,你可以同时定义语法及语法后的元模型。Xtext 会据此生成 Eclipse 插件的代码,开发者可以使用插件创建元数据:

生成的编辑器具有很高的智能性,还具备代码着色、语法错误检测等功能,甚至还能跨越多个元数据文件检测出坏掉的引用。

接下来,使用 Xpand 解析语法并将其转换为基于 HashMap 的数据结构:

public class NaviRules {

    private Map navigationRules = new Hashtable();

    // ...

    public NaviRules() {



        NaviDestination naviDest;

        naviDest = new NaviDestination();

        naviDest.action = "USER_LOGON_FAILED";

        naviDest.targetClassname = "com.danielschneller.myapp.gui.login.LoginFailedController";

        naviDest.targetBundleId = "com.danielschneller.myapp.login";

       

        store("com.danielschneller.myapp.gui.login.LoginController", naviDest);

       

        naviDest = new NaviDestination();

        naviDest.action = "USER_LOGON_SUCCESS";

        naviDest.targetClassname = "com.danielschneller.myapp.gui.menu.MainMenuController";

        naviDest.targetBundleId = "com.danielschneller.myapp.menu";

       

        store("com.danielschneller.myapp.gui.login.LoginController", naviDest);

       

  // =============================================================================



       

        naviDest = new NaviDestination();

        naviDest.action = "OK";

        naviDest.targetClassname = "com.danielschneller.myapp.gui.login.LoginController";

        naviDest.targetBundleId = "com.danielschneller.myapp.login";

       

        store("com.danielschneller.myapp.gui.login.LoginFailedController", naviDest);

       

        // .... and so on ...

    }

}

Daniel 认为对于移动应用来说,这么做要比 XML 好很多:

在应用启动时无需再进行 XML 解析了,可以提前进行导航规则的验证,防止运行时解析错误的发生。

访问信息时无需使用其他库了,只需将所有东西放在简单的 HashMap 中即可,无需再依赖任何非标准的类了。

文本 DSL 正变得越来越成熟,在不同的平台上都有很多的用武之地。你在实际的工作中是否使用过文本 DSL 呢?用在什么地方呢?感觉如何?

查看英文原文:Using Eclipse Xtext to Simplify Mobile Application Development

架构文化 & 方法