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

  • 2010-08-24
  • 本文字数:2500 字

    阅读完需:约 8 分钟

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

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

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

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

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

Xtext 是个基于 Eclipse 的框架 / 库,用于构建基于文本的 DSL。

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

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

Danie l 创建了如下语法


navigation rules for MyApplication<p>mappings {</p><br></br> map permission AdminPermission to "privAdmin"<br></br> map permission DataAccessPermission to "privData"<p> map coordinate Login to "com.danielschneller.myapp.gui.login.LoginController"  </p><br></br>                      in "com.danielschneller.myapp.login"<br></br> map coordinate LoginFailed to "com.danielschneller.myapp.gui.login.LoginFailedController"  <br></br>                            in "com.danielschneller.myapp.login"<br></br> <br></br> map coordinate MainMenu to "com.danielschneller.myapp.gui.menu.MainMenuController"  <br></br>                         in "com.danielschneller.myapp.menu"<p> map coordinate UserAdministration to "com.danielschneller.myapp.gui.admin.UserAdminController"  </p><br></br>                                   in "com.danielschneller.myapp.admin"<br></br> map coordinate DataLookup to "com.danielschneller.myapp.gui.lookup.LookupController"  <br></br>                           in "com.danielschneller.myapp.lookup"<br></br>}<p>navigations {</p><br></br> define navigation USER_LOGON_FAILED<br></br> define navigation USER_LOGON_SUCCESS<br></br> define navigation OK<br></br> define navigation BACK<br></br> define navigation ADMIN<br></br> define navigation DATA_LOOKUP<br></br>}<p>navrules {</p><br></br> from Login<br></br>  on navigation USER_LOGON_FAILED<br></br>   go to LoginFailed<br></br>  on navigation USER_LOGON_SUCCESS<br></br>   go to MainMenu<p> from LoginFailed</p><br></br>  on navigation OK<br></br>   go to Login<p> from MainMenu</p><br></br>  on navigation ADMIN<br></br>   go to UserAdministration<br></br>   with AdminPermission<br></br>  on navigation DATA_LOOKUP<br></br>   go to DataLookup<br></br>   with DataAccessPermission<br></br>  <br></br> from UserAdministration<br></br>  on navigation BACK<br></br>   go to MainMenu<p> from DataLookup</p><br></br>  on navigation BACK<br></br>   go to MainMenu<p>}</p>

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

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

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


public class NaviRules {<p>    private Map navigationRules = new Hashtable();</p><p>    // ... </p><p>    public NaviRules() {</p><br></br>        NaviDestination naviDest;<br></br>        naviDest = new NaviDestination();<br></br>        naviDest.action = "USER_LOGON_FAILED";<br></br>        naviDest.targetClassname = "com.danielschneller.myapp.gui.login.LoginFailedController";<br></br>        naviDest.targetBundleId = "com.danielschneller.myapp.login";<br></br>        <br></br>        store("com.danielschneller.myapp.gui.login.LoginController", naviDest);<br></br>        <br></br>        naviDest = new NaviDestination();<br></br>        naviDest.action = "USER_LOGON_SUCCESS";<br></br>        naviDest.targetClassname = "com.danielschneller.myapp.gui.menu.MainMenuController";<br></br>        naviDest.targetBundleId = "com.danielschneller.myapp.menu";<br></br>        <br></br>        store("com.danielschneller.myapp.gui.login.LoginController", naviDest);<br></br>        <p>  // =============================================================================</p><br></br>        <br></br>        naviDest = new NaviDestination();<br></br>        naviDest.action = "OK";<br></br>        naviDest.targetClassname = "com.danielschneller.myapp.gui.login.LoginController";<br></br>        naviDest.targetBundleId = "com.danielschneller.myapp.login";<br></br>        <br></br>        store("com.danielschneller.myapp.gui.login.LoginFailedController", naviDest);<br></br>        <br></br>        // .... and so on ...<br></br>    }<br></br>} 

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

在应用启动时无需再进行 XML 解析了,可以提前进行导航规则的验证,防止运行时解析错误的发生。 访问信息时无需使用其他库了,只需将所有东西放在简单的 HashMap 中即可,无需再依赖任何非标准的类了。

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

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