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

近日,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插件的代码,开发者可以使用插件创建元数据:

使用Eclipse Xtext简化移动应用开发_第1张图片

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

接下来,使用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

你可能感兴趣的:(使用Eclipse Xtext简化移动应用开发)