动态模型

1.简介

    动态模型编程方法是从认知的角度出发的,它认为一个东西可以是先存在的,我们可以通过面向对象的方法来认知和使用它。

    一个东西在未认识它前,可以称它为事物。由于一个事物可以处于运动中的状态,因此动态模型认为任何事物都可以转化为动作。动态模型的概念就是从事物和动作开始的。

    在这里事物的概念和东西基本相同,只是事物偏向于不知道是什么或不需要知道是什么的时候使用。

2.基本概念

  • 模型(Thing)
    模型是结构化的数据,模型可以用来表示各种东西,有时也称模型为事物。这里的结构化的数据是指树形结构的数据,如XML和JSON等。
     
  • 动作(Action)
    动态模型认为任何模型都可以转化为动作,而动作相当于编程中的函数和方法,动作是可以执行的。动态模型假设任何模型都可以转化为动作。
     
  • 动作上下文(ActionContext)
    有时也称为变量上下文。动作执行时用来存储变量和维护执行状态的。
     
  • 世界(World)
    模型的容器。一般通过World来获取模型。概念是和事物对应的,包含各种事物的容器称为世界。

3.面向对象

    事物和动作这两个概念是抽象的,要能够真正编程,需要使用这两个概念实现面向对象的编程方法。

3.1.对象

    我们需要使用模型来表示对象,下面是使用模型来表示对象的方法。

<Person name="zhangsan" age="40">
    <actions>
        <GroovyAction name="helloWorld" code="println &quote;hello world&quote"/>
    </actions>
</Person>

    如上面的XML是一个模型,它可以作为一个对象:

  • 对象的属性
    在XML中节点可以自带属性和子节点,它们可以当作对象的属性。
     
  • 对象的行为
    在动态模型里XML中的每一个节点都被当作是独立的模型,并且动态模型规定任何模型都可以转化为动作来执行,因此可以人为规定一个模型的某些子节点是对象的行为。
    比如在上面的XML中,actions子节点下的子节点被规定成对象的行为,那么名字是zhangsan这个对象就有一个名为helloWorld的行为了。

3.2.对象的类型

    动态模型中的描述者相当面向对象中的

    在动态模型中一个模型可以以任意模型作为自己的描述者,其中模型继承描述者的行为。

    比如下面的<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 + &quot; say hello world&quot;;"/>
    </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的行为、属性和子节点。

  • 行为
    Person定义了sayHello行为张三也继承该行为。
  • 属性
    Person的<attribute nam="xxx".../>子节点可以用来说明zhangsan有哪些属性。
  • 子节点
    Person的<thing name="xxx" .../>子节点可以用来说明zhagnsan有哪些子节点。

3.3.继承

    在动态模型里,一个模型可以继承除了自身之外的其它任意模型,从而继承被继承模型的行为。如果模型作为描述者,那么同时也继承属性和子节点的描述。

    继承对于复杂的模型和框架很有用。比如在下面的模型中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 + &quot; say hello world&quot;;"/>
    </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"。

4.模型的解释和执行

4.1.模型的解释

    一个模型是什么,可以用面向对象的方法来解释。即可以把一个模型看成一个对象,使用对象的类来解释它。比如这个东西是什么?它是一个凳子,有四条腿和一个平面,可以用来坐。

    需要注意的是,在动态模型里,可以先有对象,然后再指定它的类,并且对象的类是可以随时改变的,也可以使用它自己作为它的类。

    总的来说,一个模型是什么是由使用者决定的,一个模型的结构、属性和类型也是随时可变的。

4.2.模型的执行

    作为一种编程方法,模型必须能够执行,其中模型的执行可以看成运行模型的某个行为。由于动态模型是抽象的,需要依赖其它编程语言来实现。比如动态模型引擎X-Meta是使用Java实现的。

   动态模型是一个面向对象的编程方法,模型可以当作对象,运行一个模型,可以看成执行一个对象的行为。

  1. 在动态模型里模型的行为也是模型,要执行模型的这个行为,需要把它转化成动作来执行。
  2. 模型转化为动作执行时,是执行模型的名字为run的行为。要执行模型名字为run的行为,回到步骤1。
  3. 以上是一个迭代的过程,要让迭代能够终止,需要某些模型是由引擎直接执行的,而不是继续递归执行其名字为run的行为。

    比如XWorker的动态模型引擎是使用Java实现的,类名是JavaAction的模型是由引擎直接执行的。其中JavaAction的作用是执行某个Java方法,或者编译执行模型中给定的代码。

5.元模型

    元模型是在编程中无意发现的一个数据结构,它可以解决模型的编辑问题,也具有一点哲学意义。

5.1.编辑模型的原理

    在XWorker里,模型可以通过模型编辑器编辑出来,其原理如下。

  1. 在面向对象里,对象可以通过类实例化。在模型编辑器里,就是以使用类来动态生成编辑表单,用户可以通过表单编辑一个模型。
  2. 把类作为对象,此时可以通过它(作为对象)的类在模型编辑器中编辑出来。

    以上是一个迭代过程,要让迭代能够终止,那么需要一个对象,它是自己的类,能够通过自己编辑出自己,也能够编辑出其它任意类。这个对象就是元模型

5.2.元模型的发现过程

    在动态模型里对象是使用树形结构的数据表示的,比如可以使用XML来表示,那么一个对象就可以表示成XML。

    当使用XML来表示对象时,我们用下面的方式来定义对象的结构。

  • 使用<thing name="xxx"/>来表示一个XML节点。
  • 使用<attribute name="xxx"/>来表示一个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了,因此它可以作为系统中的第一个模型,即元模型。

5.3.元模型的意义

    元模型本身很简单,元模型的作用也很明确,元模型就是用来定义类模型的。比如可以使用元模型定义凳子、动物、人这样的模型。由于类模型是通过元模型定义的,因此类模型的结构可以通过元模型来解释,元模型具有解释类模型的能力。

    元模型的特殊性在于使用它可以定义自己,即元模型可以解释自己,加上任何对象模型都可以通过它的类模型来解释,而类模型又可以通过元模型来解释,这样元模型就可以直接或者间接的解释任何对象模型了。

    元模型的自解释能力在语言和认知中可能具有一定的意义,比如元模型和“老子”与“上帝"的巧合。

5.3.1.元模型和‘道’

    老子说“无名世界之始,有名万物之母”,以及“道生一,一生二,二生三,三生万物”。

    在上面,元模型就是这个一,元模型的核心功能是命名。使用对象语言来解释,元模型用于生成类,通过类可以生成对象,而对象就是组成系统的万物。所以元模型以及对象语言正好对应了老子的上面两句话。

5.3.2.元模型和‘上帝’

    根据以上元模型的作用,以及元模型和‘道’的关系,可以发现元模型具有‘上帝’的般的性质。

  • 任何对象可以直接或者间接的通过元模型生成,所以元模型是万物的创造者。
  • 可以通过元模型构建出自己,所以元模型是自己的父与子。

 

Copyright ©  2007-2017 XWorker.org  版权所有

沪ICP备08000575号