`
庄表伟
  • 浏览: 1150527 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

敲响OO时代的丧钟——DJ对于数据持久化的支持(1)

阅读更多
请首先注意这篇文章标题,在DJ的语言中,有天生的持久化的概念。但是,与通常对于持久化的理解不同的是,这不是“对象的持久化”,而是“数据的持久化”。
 
在我看来,正统的OO概念中,对象=数据+方法。那么,对象内部的数据可以持久化,对象的相关方法如何持久化呢?有没有必要持久化呢?对于“对象的持久化”,更加准确的定义是:“以对象为单位的,对象内部数据的持久化”。
 
对于DJ来说,自然也存在一个持久化的单位问题。OO的持久化单位仅仅只有对象,而DJ的持久化分为两类:动态对象数据的持久化;动态对象之间关系的持久化。如果按照典型的关系型数据库分析的E-R模型来理解,将会相当容易。关系数据库中的实体=>DJ中的动态对象;实体间的关系=>DJ中的关系。
 
说到数据持久化,自然应该包含两类、三个部分:一个全新的实体(关系)如何建立;一个老的实体(关系)如何从持久化介质中获取;一个已经在内存中被修改的实体(关系)如何保存。在这其中,最为复杂的问题是,被修改的实体与关系,何时应该被保存?这个时机如何判断,最为困难。
 
OO对于数据持久化的支持相当成问题:
1、对象的初始化,被简简单单的一“new”了事。到后来设计模式中的重要的一类“创建型模式”,其实都是在解决这方面的难题。
 
这个问题DJ的解决方案是,每个动态对象,都需要定义一个,而且是唯一的一个InitChannel。在InitChannel中,开发者必须实现create(); load(); save(); delete();这四个与持久化有关的函数。假设这个动态对象不需要被持久化,则开发者可以写完全不工作的load(); save(); delete();但是create则是必须要有的。因为,一个对象在被初始化的时候,有两种形式,dnew UserObj();以及dget UserObj(key);dnew是一个创建新动态对象的关键字,这个操作会去调用InitChannel中的create()方法,并且要确保方法执行完成之后的动态对象内部的数据,的确实dclass定义时指定的类型。
 
2、如何区分两个同类型的对象,也是一个难题。在java中,相等的判定有两个方法:“==”和“equals”。前一个方法,基本上没有意义,两个对象是否同为一个地址,其实应该是叫做“同一性”判断,而不能叫做“相等性”判断。而“equals”,则完全是自定义的,没有限制。通常的惯例是:比较两个对象中部分或全部的内部数据。在DJ中,这个问题是这样被解决的:
 
key_datatype:dclass定义中,允许包含key_datatype域,如果在dclass的定义中,没有这个部分的定义,则这个动态对象,将是一个天然的单例对象。如果包含key_datatype域,则不同的KeyData,自然对应不同的动态对象,两个对象如果KeyData相同,则一定是指向内存中的同一个对象。
dnew与dget:DJ的语法中有区分创建与获取操作。
  有key_datatype域 无key_datatype域
dnew User() 创建一个新的动态对象,在尚未持久化之前,KeyData为空值 获得一个单例对象
dnew User(key) 以指定key值为KeyData创建一个新的动态对象,如果这个对象原本已经存在,则会抛出异常 不正确的用法,因为key值无意义
dget User() 不正确的用法,因为没有指定KeyData 获得一个单例对象
dget User(key) 以指定key值为KeyData,查找一个对象,如果内存中没有,则load(key),如果load结果为空,则抛出异常 不正确的用法,因为key值无意义
所有的dnew与dget操作,都是与DJ内置的一个动态对象容器打交道,因此实现单例模式,数据缓存之类的工作,自然易如反掌。
 
(未完待续)
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics