BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

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

| 作者 Jean-Jacques Dubray 关注 3 他的粉丝 ,译者 张龙 关注 14 他的粉丝 发布于 2010年8月25日. 估计阅读时间: 11 分钟 | CNUTCon 了解国内外一线大厂50+智能运维最新实践案例。

近日,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

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

对啊,谁用过dsl啊 ? by Shooter Evan

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

对啊,谁用过dsl啊 ?

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

1 讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT