动态模型编程方法是从认知的角度出发的,它认为一个东西可以是先存在的,我们可以通过面向对象的方法来认知和使用它。
一个东西在未认识它前,可以称它为事物。由于一个事物可以处于运动中的状态,因此动态模型认为任何事物都可以转化为动作。动态模型的概念就是从事物和动作开始的。
在这里事物的概念和东西基本相同,只是事物偏向于不知道是什么或不需要知道是什么的时候使用。
事物和动作这两个概念是抽象的,要能够真正编程,需要使用这两个概念实现面向对象的编程方法。
我们需要使用模型来表示对象,下面是使用模型来表示对象的方法。
<Person name="zhangsan" age="40"> <actions> <GroovyAction name="helloWorld" code="println "e;hello world"e"/> </actions> </Person>
如上面的XML是一个模型,它可以作为一个对象:
动态模型中的描述者相当面向对象中的类。
在动态模型中一个模型可以以任意模型作为自己的描述者,其中模型继承描述者的行为。
比如下面的<Person name="zhangsan.../>模型的描述者是<thing name="Person".../>模型
<?xml version='1.0' encoding='utf-8'?> <Person name="Zhangsan" descriptors="xworker.doc.dyanmicmodel.examples.Person" age="40" sex="0"> <Child name="Xiaoming" age="10" sex="0"/> <Child name="Lili" age="5" sex="1"/> </Person>
<?xml version='1.0' encoding='utf-8'?> <thing name="Person" descriptors="xworker.lang.MetaDescriptor3"> <actions> <GroovyAction name="sayHello" descriptors="xworker.groovy.GroovyAction" code="println self.name + " say hello world";"/> </actions> <attribute name="name"/> <attribute name="age"/> <attribute name="sex" inputtype="select"> <value name="男" value="0"/> <value name="女" value="1"/> </attribute> <attribute name="description" inputtype="html"/> <thing name="Child" extends="xworker.doc.dyanmicmodel.examples.Person"/> </thing>
在上面的示例中zhagnsan的描述者是Person。Person可以用来描述zhangsan的行为、属性和子节点。
在动态模型里,一个模型可以继承除了自身之外的其它任意模型,从而继承被继承模型的行为。如果模型作为描述者,那么同时也继承属性和子节点的描述。
继承对于复杂的模型和框架很有用。比如在下面的模型中Child子节点继承了根节点Person,因此Child也是Person,它也有Person所描述的行为、属性和子节点。
<?xml version='1.0' encoding='utf-8'?> <thing name="Person" descriptors="xworker.lang.MetaDescriptor3"> <actions> <GroovyAction name="sayHello" descriptors="xworker.groovy.GroovyAction" code="println self.name + " say hello world";"/> </actions> <attribute name="name"/> <attribute name="age"/> <attribute name="sex" inputtype="select"> <value name="男" value="0"/> <value name="女" value="1"/> </attribute> <attribute name="description" inputtype="html"/> <thing name="Child" extends="xworker.doc.dyanmicmodel.examples.Person"/> </thing>
上面的XML代码里extends属性用来表示继承,如:extends="xworker.doc.dyanmicmodel.examples.Person"。
一个模型是什么,可以用面向对象的方法来解释。即可以把一个模型看成一个对象,使用对象的类来解释它。比如这个东西是什么?它是一个凳子,有四条腿和一个平面,可以用来坐。
需要注意的是,在动态模型里,可以先有对象,然后再指定它的类,并且对象的类是可以随时改变的,也可以使用它自己作为它的类。
总的来说,一个模型是什么是由使用者决定的,一个模型的结构、属性和类型也是随时可变的。
作为一种编程方法,模型必须能够执行,其中模型的执行可以看成运行模型的某个行为。由于动态模型是抽象的,需要依赖其它编程语言来实现。比如动态模型引擎X-Meta是使用Java实现的。
动态模型是一个面向对象的编程方法,模型可以当作对象,运行一个模型,可以看成执行一个对象的行为。
比如XWorker的动态模型引擎是使用Java实现的,类名是JavaAction的模型是由引擎直接执行的。其中JavaAction的作用是执行某个Java方法,或者编译执行模型中给定的代码。
元模型是在编程中无意发现的一个数据结构,它可以解决模型的编辑问题,也具有一点哲学意义。
在XWorker里,模型可以通过模型编辑器编辑出来,其原理如下。
以上是一个迭代过程,要让迭代能够终止,那么需要一个对象,它是自己的类,能够通过自己编辑出自己,也能够编辑出其它任意类。这个对象就是元模型。
在动态模型里对象是使用树形结构的数据表示的,比如可以使用XML来表示,那么一个对象就可以表示成XML。
当使用XML来表示对象时,我们用下面的方式来定义对象的结构。
比如下面的XML。
<Person name="Zhangsan" age="40"> <Child name="Xiaoming" age="10"/> </Person>
这个XML的结构如下。
<thing name="Person"> <attribute name="name"/> <attribute name="age"/> <thing name="Child"> <attribute name="name"/> <attribute name="age"/> </thing> </thing>
通过以上关于XML结构的定义,那么我们可以计算任意XML的结构,可以发现计算出来的结果还是XML,然后可以迭代计算,最后发现可以迭代到一个XML上,这个XML如下。
<thing name="thing""> <attribute name="name"/> <thing name="attribute"> <attribute name="name"/> </thing> <thing name="thing"> <attribute name="name/> <thing name="attribute"> <attribute name="name"/> </thing> <thing name="thing"> .... </thing> </thing> </thing>
这是一个每层节点都一样,并且有无限层的一个XML。
由于这个XML是无限层的,它不能直接表示,为了能够表示它,我们引入继承的概念,这样它就可以简化成下面的XML。
<thing name="thing""> <attribute name="name"/> <attribute name="extends"/> <thing name="attribute"> <attribute name="name"/> </thing> <thing name="thing" extends="_root"/> </thing>
在这里我们增加一个extends属性,在<thing name="thing" extends="_root"/>子节点中,extends="_root"属性表明这个节点继承根节点,这样这个子节点也有根节点下的子节点了,从而在逻辑上它是一个有无限层的XML了。
由于它是任意XML的结构的结构,因此在使用XML的结构来编辑XML的XML编辑器里,就可以使用它直接或者间接的编辑出其它任意XML了,因此它可以作为系统中的第一个模型,即元模型。
元模型本身很简单,元模型的作用也很明确,元模型就是用来定义类模型的。比如可以使用元模型定义凳子、动物、人这样的模型。由于类模型是通过元模型定义的,因此类模型的结构可以通过元模型来解释,元模型具有解释类模型的能力。
元模型的特殊性在于使用它可以定义自己,即元模型可以解释自己,加上任何对象模型都可以通过它的类模型来解释,而类模型又可以通过元模型来解释,这样元模型就可以直接或者间接的解释任何对象模型了。
元模型的自解释能力在语言和认知中可能具有一定的意义,比如元模型和“老子”与“上帝"的巧合。
老子说“无名世界之始,有名万物之母”,以及“道生一,一生二,二生三,三生万物”。
在上面,元模型就是这个一,元模型的核心功能是命名。使用对象语言来解释,元模型用于生成类,通过类可以生成对象,而对象就是组成系统的万物。所以元模型以及对象语言正好对应了老子的上面两句话。
根据以上元模型的作用,以及元模型和‘道’的关系,可以发现元模型具有‘上帝’的般的性质。
Copyright © 2007-2017 XWorker.org 版权所有