发信人: 3871()
整理人: leeyg(2001-06-05 22:50:06), 站内信件
|
你可以引用本文,但请注明作者,并请注明出自本论坛。
请大家指正。
二、数据库可以是对象属性的永久保留形式
数据库显然是可以用来保存系统中已实例化的一些对象特征的,如属性。
但是,数据库不能直接将整个对象存贮起来(至少数据库不能直接存贮对象的
服务),也就是说,数据库不能直接作为永久对象的保留媒介。
这是因为:对象是包括了属性与服务的整体,属性与服务是对象不可分割
的两部份。而永久对象是生存期可以跨越程序的执行时间而长期存在的对象。
怎样处理那些不能直接永久化的部份呢(主要是服务),解决这个问题有
两个思路:
1、 以数据库作出发点考虑
就是说,把对象、类的那些不能直接保留在数据库中的部份(如
服务),以数据库的概念及方法间接地保留在数据库中,从数据库中
取出后再还原出来。
比如:我们可以这样考虑:“联系人”的属性是一个数据库,在
这个数据库中增加一个字段“类名”(或类编号),记录属性所属的
类,再新建一个数据库,叫“服务库”,将每一个类的服务记录下来,
这样,就建立了属性-方法的对应关系,每一个独立的联合记录也就
构成了一个完整的对象。
2、 以面向对象的眼光考虑
数据库仅记录对象的属性,仅完成属性的增加、修改、查找、删除
功能,至于对象中的“服务”等,不放入数据库中,而在面向对象的分
析及设计以至最终的实现中解决。从这个意义上来说,数据库仅是永久
对象属性的保留,而不是整个永久对象的保留。
在仔细考虑了这两个出发点,并作了一定量的模型试验后,得出的结论是:
第二种思路是比较现实,也比较可操作的。这是因为:
1、 第一种思路破坏了面向对象概念的完整性,那些保留在数据库中间接部
份及其转换的过程在面向对象的分析及设计时又如何建模呢?
而第二种思路不仅保留了面向对象概念的完整,而且非常清晰。
2、 第一种思路无论是在设计上还是在实现上,都存在很大的复杂性,而第
二种思路实现起来非常容易,目前绝大多数的OO语言都支持。
3、 从充分发挥数据库与面向对象语言的长处来看,第二种思路显然是最合
适的。
基于第二种思路,将数据库与对象的属性联系起来必须解决从对象到数据库
的存贮,及从数据库到对象的恢复两个方法,这两个方法可以这样解决:
1、 从对象到数据库的存贮。
对象属性的改变方式可以划分为种,一是录入性的改变,如增加、
修改一个联系人,二是程序触发性的,如开关的“开”“关”状态,
无论哪种方式,都必须把这个改变永久性地记录到数据库中。
对于录入性的改变,直接设计一个录入画面并将录入的属性存盘即
可。
对于程序触发性的属性改变,在这些属性所在的类模型(类)中设
计改变这些属性的服务。如记录开关状态的State属性,可在开关的模型
中设计ChangeState 的服务,调用 ChangeState服务时,除立即修改内
存中State 属性的状态外,还要查找这一开关对象在数据库中的记录,
更新该记录。
2、 从数据库到对象的恢复。
这就要用到前面所提出的“取出”函数。在永久属性所在的模型中
设计“取出”服务,该服务首先根据属性所在的类,实例化出一个空对
象(所有属性值均为初始值的对象),再根据取出的条件,从数据库中
取出符合条件的对象的属性值,将这些具体的属性值赋予该实例的对应
属性,最终返回这一具有实际意义的对象实体。
注意,当“取出”服务根据属性所在的类,实例化出一个对象时,
这个空对象已经具有了该类所有的一切服务。
待续......
下一节介绍我怎样在数据库中体现类的继承关系。
-- ※ 修改:.3871 于 Sep 24 13:10:43 修改本文.[FROM: 202.96.190.124] ※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.96.190.124]
|
|