Nop平台提供了面向语言编程的编程范式,即我们解决问题时总是倾向于先设计一个领域特定语言(DSL),然后再利用该DSL来具体描述业务逻辑。Nop平台中极大简化了创建自定义DSL的过程。
领域特定语言的价值在于它精炼了领域内特有的逻辑关系,定义了专属于该领域的原子语义概念,至于具体语法形式,并不是关键。程序代码经过Lexer和Parser解析后会得到抽象语法树(AST),所有的程序语义原则上都是由AST来承载。XML和JSON都是树形结构,可以直接表达AST,从而完全避免编写特殊的Lexer和Parser。
我们使用XDef元模型定义语言来约束DSL的语法结构,例如 beans.xdef。相比于XML Schema或者JSON Schema,XDef定义更加简单直观,而且可以表达更复杂的约束条件。
XDef不仅仅定义了XML格式的DSL语法,它还规定了一种XML和JSON之间的双向转换规则。因此,只要定义了XDef元模型,就可以自动得到JSON表示,可以直接用于前台可视化编辑器的输入输出。
在没有定义XDef元模型的情况下,Nop平台也定义了一种紧凑的约定转换规则,可以实现无Schema约束情况下XML和JSON的双向转换。具体参见前端AMIS页面的XML表示:
将所有的DSL都归一化为XML格式之后,就可以统一提供模块分解、差量合并、元编程等高级机制了。Nop平台定义了统一的XDSL扩展语法,自动为所有通过XDef元模型定义的DSL语言增加可逆计算扩展语法,具体XDSL语法的内容由xdsl.xdef这一元模型来定义。
XDSL的主要语法元素示例如下:
<orm x:schema="/nop/schema/orm/orm.xdef"
x:extends="base.orm.xml" x:dump="true"
xmlns:x="/nop/schema/xdsl.xdef" xmlns:xpl="/nop/schema/xpl.xdef">
<x:gen-extends>
<pdman:GenOrm src="test.pdma.json" xpl:lib="/nop/orm/xlib/pdman.xlib"
versionCol="REVISION"
createrCol="CREATED_BY" createTimeCol="CREATED_TIME"
updaterCol="UPDATED_BY" updateTimeCol="UPDATED_TIME"
tenantCol="TENANT_ID"
/>
</x:gen-extends>
<x:post-extends>
<orm-gen:JsonComponentSupport xpl:lib="/nop/orm/xlib/orm-gen.xlib"/>
</x:post-extends>
<entities>
<entity name="io.nop.app.SimsClassFee" x:override="remove"/>
</entities>
</orm>
<< · Back Index ·>>