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




