通过XWorker的发展历程,可以了解XWorker的编程是如何一步一步的发展的,也可以比较容易理解事物编程的本质。
如果你是一个Java程序员,那么一定听过说Spring、Hibernate等框架,XWorker原始目标就是想做这样的框架。
那么什么是框架呢?我认为可以简单的理解为:框架 = 解释引擎 + 配置文件。比如当我们使用Spring或Hibernate时会先编写一些配置文件,然后使用Spring或Hibernate的API装载这些配置文件,然后执行一些操作等。
因此框架的本质就是框架的解释引擎根据配置文件实现某种特定的功能。
现在在Java代码里可以使用注解代替配置文件,但在早期我们通常是使用XML来编写框架的配置文件的,XWorker正是在那个时候建立的,它也用XML编写配置文件。
比如一个Spring的配置文件。
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd" default-autowire="byName" default-lazy-init="true"> <!-- 配置数据源 --> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName"> <value>com.mysql.jdbc.Driver</value> </property> <property name="url"> <value> jdbc:mysql://localhost/ssh?characterEncoding=utf-8 </value> </property> <property name="username"> <value>root</value> </property> <property name="password"> <value>123</value> </property> </bean> ....... </beans>
在编写XWorker的框架时,为了偷懒,想做一个XML编辑器,这样就不用手工编写配置文件了,这样就有了事物编辑器的原型。
编辑器的原理是通过XML的结构动态生成编辑界面来编辑符合结构的XML实例,由于觉得DTD或Schema太复杂,所以XWorker精简了XML的结构定义,使用了新的结构,比如:
<thing name="Person" descriptors="xworker.lang.MetaDescriptor3" label="Person"> <attribute name="name" ></attribute> <attribute name="age" type="int" ></attribute> <thing name="Child" extends="xworker.example.otandoo.example.Person"></thing> </thing>
比如上面的XML是一个Person的结构定义,可以看到它只定义了Person的属性和子节点,使用它可以生成编辑表单,如下。
为了偷懒,为什么不把编辑器整合到框架引擎中?因为编辑器会装载所有的配置,如果整合到框架引擎中,这样框架就不用写如何读取配置的程序了。
请注意,从这里开始XWorker就慢慢与众不同的了,我想是因为没有人会比我更懒了,但是这样却造就了现在的XWorker。
既然把编辑器整合到了框架引擎中,为了偷懒更上一层,XWorker想到了把框架的解释引擎嵌入到配置文件中的做法,因为这样可以统一引擎的调用,也可以避免编写大量的Java Bean。
比如下面的配置:
<Shell name="HelloWorld" descriptors="xworker.swt.widgets.Shell" text="Hello World" RESIZE="true" width="800" height="600" label="HelloWorld"> <FillLayout></FillLayout> <Browser url="http://www.baidu.com" WEBKIT="true"></Browser> </Shell>
按照传统的配置和引擎分离的做法,那么在调用它通常会是这样的:
//假设有一个SwtEngine SwtEngine engine = new SwtEngine(); //装载配置 SwtModel swtModel = engine.load(“HelloWorld.xml"); //执行模型 swtModel.run();
在这里有一个缺点就是有多少个框架就有多少个不同的Enging,它们可能是SwtEngine,也可能是WebEngine,或是SpringEngine、HerbinateEngine等,并且调用时也要写不同的代码,为什么不整合在一起呢?比如XWorker中现在的做法:
//获取事物模型 Thing thing = World.getInstance().getThing("HelloWorld.xml"); //执行 thing.doAction("run");
可以看到在XWorker中无论什么框架,都转化为了事物,并且调用时隐藏掉了框架引擎,这个时候我们只需关注事物就可以了。
在XWorker的框架编程发展中,可以看到Thing(事物)本身就是配置数据,而当把引擎嵌入到配置中后,就有了thing.doAction("run")这样的形式,而这可以理解为事物的行为,因此事物模型也就是对象了。
发现事物也可以作为对象后,紧接着XWorker也发展了类和继承的概念。
类和描述者:由于XWorker前身是XML的编辑器,因此在XWorker里把XML的结构当作了实例的类,由于同时又结构和类的作用,所以XWorker采用了描述者这个名词。
继承:为了定义复杂的结构,XWorker引入了继承的概念,如果A集成B,那么A继承A的属性和子事物。
有了对象、类和继承的概念后,XWorker也发展了行为继承的概念,既一个事物继承它的描述者行为,也继承它的继承者的行为,这样就形成了一个完整的面向对象的编程方法。
XWorker在推广过程中自身遇到了很大的麻烦,下面是这些麻烦产生的原因和解决。
上面提到XWorker的前身是XML的编辑器,为了偷懒XWorker自定义了新的XML的结构,由于XWorker定义的结构非常简单,因此很容易计算出任何XML的结构,结果在计算中发现了任何XML的结构的结构是唯一的,我们称这个结构为元结构。
计算方法很简单,用<thing name="xxx"/>来表示一个XML节点的名字,用<atrribute name="xxx"/>来表示节点中的属性的名字,最后用嵌套关系表示节点和属性以及父节点和子节点的关系,就可以计算任意XML的结构了。
具体计算过程这里就不说了,总是用上面的结构定义,可以发现任意XML的结构的结构是相同的。
由于XWorker把框架引擎嵌入到了配置文件中,并且XWorker也实现了在运行是编译和装载Java文件,也实现了用Groovy脚本来编写引擎,所以XWorker的编程就是动态的了。
XWorker的动态性体现在使用元结构可以直接或间接的编辑器任意配置,而由于引擎可以动态编译和加载,所以配置可以随时更改,而框架也可以在运行时自动更新,这样就实现了动态编程。
由于XWorker的编程具有动态性,比如用一个框架表示了一个对像,而由于配置是可变的,因此对象也是可变的,并且在XWorker中还能随时改变对象的类和行为,这样再用对象这个词就不能完全表示它的特性了。
因此,XWorker引入了事物这个词,用于代替对象这个词。
当XWorker引入了事物这个词后,XWorker本身就遇到了一个无法解决的问题,那就是哲学问题。
因为使用了事物这个词,所以XWorker也就引入了世界这个词,由于任何事物可以通过元结构直接或者间接的构造出来,因此这个系统就好像具有了无限的认知能力,从而陷入了哲学思考中。
总之,为了搞清楚哲学问题,XWorker花了8年时间,这个哲学问题即简单又深奥,如果对哲学不感兴趣,那么也可以完全不用去研究它。
综合这几年的经验教训,XWorker最终定义为是一个动态系统,也就是XWorker简介所说的那个可以随时变化的系统。
Copyright © 2007-2014 XWorker.org 版权所有