关于对象持久类框架的构架设计
用语定义:
1. 世界:在本文中世界定义为系统范围内的所有,包括数据库、数据库记录、对象实例、对象等(名词)
2. 类:是定义一组相似对象的共同特征标准集合,表现为数据结构(属性与关系)与行为(操作与)。(名词)
3. 对象:一个通过状态与行为区别于其他实体的实体,其封装了状态与行为,状态表现为关系与属性,行为则通过操作与方法来体现。对象是一个类的概念上的实体(也就是现实存在的类)。(名词)
4. 对象元数据:描述对象属性的数据组,它包含的了对象数据的状态以及位于持久机制上的状态。在本文中指的是一组数据可以表示对象的属性(名词)
5. 属性对象:作为一个对象的属性而存在的对象(名词)
6. 对象集:一组同一类的对象。(名词)
7. 实例:在内存中存在的一个具体的对象。(名词)
8. 实例集:一组对象的实例。(名词)
9. 数据库记录:在数据库中储存的具体对象(也就是对象属性与关系)以及对象集。为一条记录或包括一组记录(来记录关系对应)(名词)
10. 实例化:创建一个对象并设置其属性与关系(通过数据库记录或其他方式)。(动词)
11. 对象存贮:将对象的属性与关系映射为数据库记录的操作。(动词,名词)
12. 对象引用:若可以通过一项或几项对象属性的具体特征,在一组对象中得到一个具体的对象(并不一定是实例),则称这一项或几项对象属性的特征为对象引用。(名词)
13. 程序:本文中的程序特指Borland公司的Delphi Object Pascal语言所编制的程序,也许在文中有其他的语言出现,我将会特别指明。
框架的构想:
需要建立一个持久框架以完成对象以及其与其它对象的关系的保存获取,主要针对关系型数据库,目的是使对象独立于数据库以及数据存取机制,简化面向对象程序的编写,使得对象的设计、实现得以一致化。
根据《The Design of a Robust Persistence Layer For Relational Databases》[i]以及《Implementing Business Objects》[ii]、《Persistence Brings Success》[iii]、《Rolling your own Object Persistence Framework》[iv] 这些文章的表述我们知道应该分离对象本身以及其持久化机制,可以保持灵活性。因此我们可以锁定四个问题域:对象、对象元数据以及持久化和映射机制。(关于上述文章描述的持久化系统的讨论我将在后面进行)
对象
为了建立持久对象框架,我们必须对对象应具有的通用属性以及操作做出统一的规划,也就是定义对象类的属性与操作:
l 对象应具有一个唯一的(针对世界而言)标识(ID);由于数据库的不同ID的表表现方式也不一致,可能是字符也可能是数字
l 对象可以通过统一的Getter/Setter机制,得到其属性;在其他语言中也许有动态映射(反射机制)的实现,但在Delphi中没有,我认为使用反射机制可能会损失系统设计的一致性。
l 对象可以通过对其自己的元数据对象操作以保存,载入,以及从世界中删除。
l 对象具有如下的状态:新创建(New),空载入(NULL Loading),元数据载入(Metadata Loading),持久载入(Persistence Loading),操作中(Operating),元数据保存 (Metadata Save),持久保存(Persistence Save),元数据修改(Modify Metadata),持久修改(Modify Persistence)。
对象的元数据
对象的元数据可以分离对象的数据实例与对象实例,可以在内存中对于数据本身作映射,同时也可以通过数据构建对象。它是实现灵活的对象持久机制的关键。
对象的元数据需要:
以一个通用的形式描述对象的属性以及数据。
可以以列表的形式描述对象组的属性以及数据。
保存类的信息
根据属性数据构造对象(也就需要保存类的信息)
持久化
持久化分为:对象的属性到持久机制的映射以及对象关系到持久机制的映射。
持久化应该可以:
1. 提供对应多种的映射机制,可以对于文本、关系数据库进行持久操作。
2. 完整的封装持久机制,对象只需要对持久化对象发送Save、Retrieve、Delete等消息就可以完成自身的保存、获取、删除等工作。
3. 针对条件进行对象的操作。
4. 提供一个关系处理机制来处理对象间关系的持久化。
5. 提供事务支持,由于对于属性,持久化需要:保持对象属性的数据完整,进行对象属性的原数据保护;同步实例的属性与数据库中的属性值(世界中的多任务并发操作)。
6. 妥善处理实例与世界中其他实例(也许不在同一台机器上)的一致性。