元数据、开放数据模型及动态系统--形而上学篇
引言在JavaEye潜水多年,这是我第一次发帖。我想在这里介绍一下我最近几年的编程实践,一套比较另类的技术。如果详细地写,恐怕篇幅太大.所以我尽量压缩篇幅,如果阅读时有跳跃的感觉,权且把它当作一个提纲而不是一篇文章。具体的细节,可以在讨论中展开。如果有人愿意尝试,我可以考虑把现有的代码修改后开源。我的奢望是,你读完以后,你会同意,或者部分同意,Java其实也可以很简洁,Java其实也可以很动态,Java其实也可以很高产。
这一套东西,我不知道怎么称呼它,所以我甚至不能给这篇文章起一个满意的名字,也不知道放在哪一个版块合适。它是数据结构,设计模式,构架(architecture),REST框架(framework),还是一种SOA技术?反正都沾边。它到底是什么,还是由你们来告诉我吧。也许它比较另类,其实也未必,最近坛子上就有许多类似想法的讨论。比如:[讨论]Java中的ActiveRecord实现(我实现了一点儿)以及 一种Java Web框架的设计和实现,大家觉得能够快速开发吗?但是我在这里介绍的,是比较成熟的技术,用它实现的系统已经运行好几年了。
不管它叫做什么,它的核心在于认识数据,尤其是元数据,通过将数值与元数据分离,构造出一个普适的,弱类型的,开放的,动态的数据结构/数据模型/数据容器,(形容词的意义会在后面明了)。在它的基础上,借助XML技术(Schema, XSLT, XPath, ...)而开发出来的一整套技术。技术的实现上,借用了SAX 2。但你的项目可以完全不用XML。
我这里说的元数据编程,和通常的元数据编程,不是一回事。通常所说的元数据编程,是将代码中人机对话(对机器的指令,把 J2EE容器看成是特殊的虚拟机)的内容分离出来另行处理的代码生成技术。我这里说的是利用元数据简化数据模型,简化编程,降低系统耦合,增强系统稳定性和动态性的技术。
感觉国内XML的应用不多,此文也可以看作是对XML应用的介绍和推动。其实在Java 6以前,Java平台就已经支持脚本语言了,我都已经用了五年了,这个脚本语言就是XSLT。XSLT就是我们项目中的DSL。网友testhubo在主题: ??提问:使用策略模式的烦恼,要实现208个类 中提出的问题,如果用XSLT的话,不用那几十几百的类,只要一个XSLT文件就搞定了。单从可读性和维护性上讲,就比那几十几百个类 要强太多了。而且可以动态修改,动态部署,连J2EE容器都不必重启。
数据、元数据及注解什么是数据—ata)?大概每一个软件人对此都是再熟悉不过了。比如下面的例子,可能是(静态类型)程序语言中最简单的数据形式了。
Robbin以前在 http://www.iteye.com/post/139771 这篇文里提到的: "Java足够死板!" 这一特性其实也正帮助促成了它作为工业语言的地位 - 这个说法我觉得颇有感触.
In theory, practice and theory are one and the same. In practice, they're not. 5 楼 pojo 2007-01-18 引用
借鉴ResultSet的特性,在数据容器中同时携带元数据,思路挺新颖的。
不过对于HashMap和POJO的比较,我觉得就是HashMap缺少了每个成员的类型,而这个类型就是你说的元数据,不知道这是不是你的意思。
是这个意思。但是我想强调的是:仅仅从数据的角度看,带有元数据的普适容器和专有容器(类型)的表达能力是一样的,但是专有容器是固态的。另外,在分布系统中,数据在它的生命周期中,会穿梭往来于系统的各层和各节点之间,对在这个路途当中的多数驿站来说,定义在类型中的操作是没有意义的,所以类型也是没有意义的。无论你用哪一种流行的框架作的Web应用,数据从UI开始一直到数据库,它要改头换面多少次?它的本质改变了吗?我们程序员非得这样伺候它吗? 6 楼 iiley 2007-02-01 引用数据从UI开始一直到数据库,它要改头换面多少次?它的本质改变了吗?我们程序员非得这样伺候它吗?
这话让人深思啊~~~~~~~~~~ 7 楼 RyanPoy 2007-02-28 看了开始的发言,感到有点意思。听新颖的。
但看了“<>无论你用哪一种流行的框架作的Web应用,数据从UI开始一直到数据库,它要改头换面多少次?它的本质改变了吗?我们程序员非得这样伺候它吗?”就完全迷糊了。 8 楼 basicbest 2007-02-28 pojo 写道
但是我想强调的是:仅仅从数据的角度看,带有元数据的普适容器和专有容器(类型)的表达能力是一样的,但是专有容器是固态的。另外,在分布系统中,数据在它的生命周期中,会穿梭往来于系统的各层和各节点之间,对在这个路途当中的多数驿站来说,定义在类型中的操作是没有意义的,所以类型也是没有意义的。无论你用哪一种流行的框架作的Web应用,数据从UI开始一直到数据库,它要改头换面多少次?它的本质改变了吗?我们程序员非得这样伺候它吗?
不错,同感,类型本身没有什么意义,所以我也是抛弃了各种O,转而使用基本的Container。
Ref:http://www.iteye.com/topic/51522?page=5
basicbest 写道
OO关注的是行为。往往我们觉得麻烦,或者困扰的都在PO,VO等无有效行为的对象上。这些对象只是每个层里面自己使用的中间产物,所以,我觉得VO什么的可以不用,直接用data container,在不同层进行传递数据的时候反而更加方便。
另外,我发现很多时候用Object不用data container的理由是可以取名字。有趣的现象。
似乎JavaEye可以看到几个本质上一样的实现了。
我这里综合使用其他技术后实践的结果是,效率由大约200LOC每人日上升到约550LOC每人日。
9 楼 magic_seek 2007-03-09 今天在Google搜索时发现了这个帖子,发现我研究的东西和你讲的东西本质上有共同之处。可以参看www.xworker.org。
我在XWorker中定义的数据对象正好也是一个兼顾Hash, Tree,和ResultSet特点的数据结构,它具有你所说的那些特征。
XWorker中定义的数据对象也引入了O的概念,它可以具有行为,另外对于元数据和结构的概念我们也进行了泛化,即任何一个数据都可以非本身之外的任何数据做为自己的元数据或结构。
算法的设计是取决于数据的逻辑结构的,OO是固定结构所以算法固定,算法固定程序的功能也就固定了,而Hash里保存的内容是非固定的所以内容的结构也不固定的,所以如果能够把Hash里的内容的结构动态绑定,那么就有可能构造出动态的系统了。
然而算法总是要依赖结构的,也就是系统已有的算法(程序)必须是建立在已知的数据结构上的,通过结构编写算法是很独立的事,这时如果我们把结构和Hash关联在一起,那么我们就可以灵活的动态配置系统了。
按照这样的思路走下去一定会需要一个兼顾Hash, Tree,和ResultSet特点的数据结构,因为Hash带来动态、Tree扩展了结构复杂性、ResultSet代表结构(算法)绑定。