第三部分 面向对象模型 gom generic object model 类型系统与对象系统 gom...
Post on 20-Dec-2015
379 views
TRANSCRIPT
第三部分 面向对象模型 GOM Generic Object Model
• 类型系统与对象系统• GOM 的结构定义
• 元组结构 • 聚集结构
• 对象的标识• 子对象的共享• 对象的持久性• Sort 类型上的复合结构
第七章 对象类型的结构
7.1 类型系统与对象系统• 类型系统( sort type )的发展
– 类型: < 类型名, { 值域 } , { 操作 }>– 早期语言只提供简单类型– 进一步复杂类型 - > 简单类型、结构类型、串、指针 ...– Ada 提出抽象数据类型 ADT ( abstract data
type )• 用户自己定义结构、操作• 系统提供打包功能• 以类型方式提供使用
几种简单 sort 类型
类型的使用、特点、局限• 变量说明:指明一个变量的类型• 变量赋值:类型的实例化操作
– 实例化结果:指定一个值– 在实例的整个生命周期,值是不变的,因此类
型的实例无需标识,值就是其本身的标识– 变量的重新赋值是重新实例化过程,原实例已
消亡。• 类型系统的问题:无法描述实例的状态变化,即
不同的值代表了某个实例在不同时刻的不同状态• 数据库的应用是最突出的不协调
面向对象类型• 对象系统强调的是对象状态的变化• 对象的生命周期种的某一瞬间是一个状态(对象
属性的某个值集)• 但对象属性值被修改时,表明该对象由一个状态
转化为另一个状态• 为了能识别不同状态下的对象,必须进行标识。
——唯一性约束• 对象状态的转化时内部变化,因此必须进行封装
——完整性约束• 对象 O 由( id#, Type, Rep) 三元组表示
7.2 GOM 对象类型框架定义• 对象类型名唯一,超类型
名可选。• Public 子句提供外部说明• Body 子句描述结构主体• 操作子句描述接口说明
– 操作名(唯一性)– 参数说明
• 操作实现子句——描述操作体
7.3 元组结构的对象类型
• 结构主体由三种基本结构及其组合而成– 元组结构 (tupe_structure)
– 集合结构 (set_structure)
– 表结构 (list_structure)
元组结构定义
Type i 可以是• 简单 sort ; 组合 sort ;• 对象类型;混合类
型;集合类型;表类型;直接递归类型等
内嵌的属性值读写操作• VCO 操作( Value receiving operation ) 值接收操作
Declare attri:->type i;
读取当前第 i 个属性状态• VTO 擦作( Value returning operation ) 值返回操作
Declare attri:<-type i;
将类型为 Type i 的状态写入第 i 个属性中
示例 ( 一 )
• 直接递归示例
• 维护 person 的对象实例状态的操作 Var p:person … p.age:=p.age+1 (p.agep.age->+1)
示例(二)• 立方体对象模型的正文:
* 定义“点”的对象类型
* 定义原材料的对象类型
* 定义立方体的对象类型
7.4 GOM 类型的实例化• 一个对象类型框架可产生一系列对象实例• 内嵌的创建对象操作——“ create”• GOM 类型的实例化过程
– 第一步 * Var myCuboid :Cuboid ; / 说明对象变量– 第二步 * 执行赋值语句 :
( 1 ) myCuboid:=Cuboid$create;
或( 2 ) myCuboid.create;
赋值语句的作用( 1 )产生了一个初始化的空壳实例;( 2 )对该空壳实例赋予了一个对象标记 OID ;( 3 )将 OID (或实例地址)赋给变量 myCuboid ;( 4 )将空壳属性值初始化为: Int : 0 ; float : 0.0 ; char :’ \0’ ; bool : false ;
复杂对象类型: NULL ;( 5 )当前该 OID 还仅是逻辑表示,不能被用户访问。
* 产生了一个仅仅与 OID 相联系的一个空对象。 -第三步:对空对象的每个属性进行实际值的
初始化工作
示例
y
x
V4
V8
V1
V3
V6
V7
V2
V5
图 7.2 The Topological Representation Of a Cuboid
myCuboid
图 7.3 The “Skeleton” of a New Cuboid Instance
mat : NULLvalue : 0.0v1 : NULLv2 : NULLv3 : NULLv4 : NULLv5 : NULLv6 : NULLv7 : NULLv8 : NULL
id1 Cuboid
7.5 对象标识
• 表示对象的三种方法:– 内容标识—关键字标识符– 地址标识—物理对象标识符– 逻辑对象标识符
• 内容标识的问题(内容依赖)– 概念的混淆:将两对象相等与两对象内容相等混为一谈。– 一致性管理的困难。例 1 :对大商场中,同一商品在不同柜组有不同售价,商品
的主 key 为(商品号 +柜组号)。例 2 :若主 key 为(人名 + 地址),当搬家而修改库时,给
完整性维护带来困难。
地址标识• 地址标识 — 用对象所分配的地址空间表示对象。• 地址标识问题(地址依赖)
– 存储空间的重用导致引用错误且无法查找。例如新对象占用已删除对象空间。
– 分布式系统中对象经常被移动位置。– DB 性能调整时常常需要重构硬盘存储区。
逻辑对象标识符 OIDLogical Object Identity
对于 GOM ,每个对象可以描述为下述三元组O = ( id# , Type , Rep )
• Id# :系统产生的对象 O 的逻辑标识符• Type :对象 O 的类型• Rep :对象的内部状态,即属性的当前值。
OID 的特点• 对象实例初始化时,系统产生一个唯一的 OID• 一个对象的 OID 在整个生命周期都永远保持• 当对象删除后,其 OID 值永不复用
7.6 共享的队象Share Subject
• 标准的 RDBMS :由于 INF 约束,不支持队象的引用
• 扩展的 INF2 的 RDBMS ,只能支持层次结构,不支持网状结构
• 从需求而言,复杂 DB 应用要求支持网络结构• O-O 模型中,一个对象模型可以不受限制地引
用其他对象,同时也可以被其他对象引用--构造出网状拓扑结构
• GOM 模型通过多对象共享机制,支持网络结构应用
共享子对象示例
共享子对象的副作用-修改可见
• 对象的状态变化会被其他引用对象可见• 例:一个对 Material 对象的修改:
anotherCuboid.mat.name = ”Copper”;
anotherCuboid.mat.SpecWeight = 0.90
• 会被 myCuboid所指 id1 可见
7.7 引用和重引用Referencing and Dereferencing
• 复制( copy )语义:将一个值真实地复制到一个sort 类型的变量或属性中。
• 引用( referencing )语义:赋值语句处理的是一个对象时,只将该对象的 OID 赋值到相应的变量或属性中。
• 引用语句与 C 中的指针赋值相似,是一个间址操作。• 重引用( Dereferencing )语义:引用语义沿着引用链的传递。
• 重引用语义是通过“•”操作符的重载,构造的引用链实现的
• 整个对象结构可以通过引用语义构成一个网状结构• 一个引用查找的实现是沿引用链,导航式地对逐个对
象实例的查询。
Var someMaterial:Material;
w:float;
muCuboid:Cuboid;
…
(1)someMaterial.create;
(2)someMaterial.name:=“Carbon”;
(3)someMaterial.specWeight:=0.75;
(4)myCuboid.mat:=someMaterial;
(5)w:=myCuboid.mat.specWeight;
mat:id88
value:39.99v1:id11
…
name:”Carbon”specWeight:0.75
…
Materialid88
id1Cuboid
myCuboid
someMaterial
7.8 聚合类型 collection
• GOM 模型提供 body 的二种内嵌的聚集类型的类型构造子:
— 集合结构— 表结构
集合结构的对象类型
• 集合结构的对象类型是一个集合对象表达如下:
Type set typeName ispublic …body {Element type}…end
• 集合元素类型 ElementType 可以是 sort 类型,也可以是对象类型
type SetTypeName is
Public…
body
{ElementType}
…
end type SetTypeName;
type TelephoneNumbers is
{int};
type TelephoneNumbers is
Public…
body
{int}
operations
…
implementation
…
end type TelephoneNumbers;
声明一个变量var guidosTelephoneNumbers: TelephoneNumbers;
…
(1) guidosTelephoneNumbers.create;
(2) guidosTelephoneNumbers.insert(6082080);
(3) guidosTelephoneNumbers.insert(6082080);
集合结构的对象类型特点• 需要定义一个元素 Element 的类型• 集合对象类型本身可以用于定义对象属性的类型• 集合对象类型支持数学上的 Set 概念,即不允许有相
同元素存在。( GOM要作唯一性检查)• 当 Element 是 sort 类型时,插入概念是复制语义,插
入值;当 Element 是对象类型时,插入概念是引用语义,插入 OID
• 集合对象允许共享,当有共享发生时,为共享子对象。• 共享概念的引入,使集合对象的概念可以作为对象库
概念。• 共享的副作用 — 修改可见
对象类型的扩展• GOM通过 with extension 子句隐式地产生并维护一个特定对
象类型的集合对象类型,用以管理该类型实例化的对象集合。• 例 type Cuboid is
with extention is…end type Cuboid
则系统自动产生一个 set Cuboid 对象类型 Cuboids 。并将所有 Cuboid 的实例化对象自动插入到 Cuboids 中。
• Cuboids 类型只允许用户使用 ext (Cuboid) 进行访问。• 不允许任何显式地修改、删除、插入等操作• 利用扩展概念建立对象实例库
type CuboidSet is
{Cuboid};
var workPieceCuboids:CuboidSet;
valuableCuboids:CuboidSet;
…
workPieceCuboids.insert(myCuboid);
…
valuableCuboids.insert(…);
type CuboidSet
with extension is
…
end type Cuboid;
表结构对象类型• 表结构对象类型的特点
— 列表中的元素是有序的— 类标的数学概念是 bag ,即允许相同的元素在表中不同位置多次出现— 列表中元素的类型可以是 sort type 或 object type
• 表结构对象类型的定义方式type Name ispublic …body <Element type> …
CuboidSetid59
workPiece Cuboids
{id1,id2,id3} {id3}
name:”Iron”specWeight:0.89
name:”Gold”specWeight:1.32
valuable Cuboids
id60 CuboidSet
id77id99
Cuboid
Material
Vertex
id1mat: id77
value:39.99v1:id11 v2:id12
v3:id13 v4:id14
v5:id15 v6:id16
v7:id17 v8:id18
id11
x: 0.0y: 0.0z: 0.0
id1mat: id99
value:89.90v1:id31 v2:id32
v3:id33 v4:id34
v5:id35 v6:id36
v7:id37 v8:id38
id2mat: id77
value:19.95v1:id21 v2:id22
v3:id23 v4:id24
v5:id25 v6:id26
v7:id27 v8:id28
id18
x: 0.0y: 1.0z: 1.0
id21
x: 0.0y: 0.0z: 0.0
id28
x: 0.0y: 2.0z: 2.0
id31
x: 0.0y: 0.0z: 0.0
id38
x: 0.0y: 3.0z: 3.0
mat: id77
value: 250.00vertices: id899
Cuboid2id299
<id111,id112,id113,id114,id115,id116,id117,id118>
id899 VertexList
type VertexList is
Public…
body
<vertex>
operations
…
implementation
…
end type VertexList;
type Cuboid2 is
Public…
body [mat: Material;
value: float;
vertices:VertexList;]
operations
…
implementation
…
end type Cuboid2;
7.9 类型安全• 非类型安全数据类型:数据库的组件
(属性,变量,集合元素等),并不限制为一个特定的类型(不需要类型说明),即编译时不对它们进行类型检查,好处是使用灵活。
• 问题:大量的错误只能在运行时被检测出来
类型安全(续)• 类型安全数据类型:对所有构件均限制了数据类
型。— 强类型语言— GOM 为强类型的
• 优点1. 类型安全2. 高效,在运行时无需作类型检查。3. 支持结构化设计4. 类型约束的组件为:属性、变量、操作参数、
表和集合类型的元素。5. 强类型语言编译时检查表达式中类型的兼容
性。
type City is
Public…
body [name: string;
mayor: Person;
inhabitants: PersonSet;]
operations
…
implementation
…
end type City;
type Person is
Public…
body [name: string;
age: int;
spouse:Person;
livesIn: City;]
operations
…
implementation
…
end type Person; type PersonSet is
Public…
body {Person}
operations
…
implementation
…
end type PersonSet;
Var cityOfLA: City;
mickey,mini,dinald;Person;
…
name: “Los Angeles”mayor: id188
inhabitants: id115
id571City
cityOfLA
{id193,id188,id372}
id115PersonSet
name: “Mickey Mouse”age: 60spouse: id372
livesIn: id571
Personid188
name: “Mini Mouse”age: 50spouse: id188
livesIn: id571
Personid372
name: “Donald Duck”age: 45spouse: NULLlivesIn: id571
Personid193
donaldmickey
var totalAge,ageOfSomeBody:int;
anyBody:Person;
name:string;
…
(1) ageOfSomeBody:=cityOfLA.mayor.spouse.age;
(2) foreach(anyBody in cityOfLA.inhabitants)
totalAge:=totalAge+anyBody.age;
foreach(anyBody in cityOfLA.inhabitants)
totalAge:=totalAge+anyBody.age;
ageOfSomeBody:=cityOfLA. mayor. spouse. age;
int City
Person
Person
int
int
Person City
PersonSet
int int Person
7.10 持久性 Persistence
• 持久性:当程序的执行终止后,其创建的构件和数据仍然存在。
• 需进行持久化构件— 持久化对象类型— 持久化对象实例— 持久化变量
• 处理持久化数据采用的方式— 嵌入式 SQL 语言— 持久化程序设计语言
• 嵌入式 SQL 语言:持久性数据的存取操作,必须由设计者显式地用 SQL 提供的语句进行 DB 读写。
持久化程序设计语言—查询语言与宿主语言完全无缝联接
• 优点— 对象在 DB 中的创建、存储无需任何格式联接。— 用户对持久化数据的操纵与一般数据一样,无需 进行显式的读 / 写。
• 缺点— 由于宿主语言过强,对 DB 数据的一致性维护更加 困难。— 由于语言的复杂性,数据查询的优化处理变得更 困难。— 与 SQL 的无缝联接目前作的并不理想。
GOM 持久性构件—类型的持久化
• 类型的持久化:类型的持久性由 Persistence 定义符说明。例: Persistence Type Vertex is其中,持久性类型名称不能被重定义
• 持久性类型的依赖关系— 在元组结构类型中,持久化类型的所有属性都 必须是持久的。— 在聚合结构类型中,其元素类型也必须持久。— 在继承的 is-a层次内部,一个持久类型的超类型 (祖先)必须是持久的。
对象的持久性一个对象实例的持久化可以采用以下几种途径:
1. 按类型持久:一个持久化类型的实例可以自动确认为持久的。缺点:使用极不方便,在需要持久和临时共存时,操作困难。有的系统采用持久意向概念,即持久类型实例化的对象可能潜在变为持久。
2. 按创建持久—将持久操作与初始化操作绑定,即将持久对象与临时对象采用不同的初始化子。
对象的持久性(续)3. 提供一个持久化操作,即用显式的持久化操
作将对象持久化。即将持久化声明延迟到对象创建之后。
4. 按引用声明持久:仅对一个(或多个)对象显式的声明为持久对象(根对象)。其他对象的持久化定义为沿着根对象的引用链进行持久化扩展。优点:持久化定义简洁。缺点:系统确定持久化对象的代价较大。
GOM 的对象持久化方法• GOM采用 2 , 3 两种方法:
– GOM 提供一个持久化操作子( persistence )• 例如: aVertex.persistence• aVertex 在持久化操作之前仍然是临时对象
– GOM 提供初始化阶段的持久化操作• GOM 不支持第 4 种方法,带来的危险行为
– 当用户从一个持久化对象中引用了一个临时对象时,会导致浮动引用
持久对象的实现方法• 地址依赖方法:
– 当声明一个对象持久化时,系统初始化一特定的外存区域,并提供一个持久化地址指针
• OID 持久方法:– 对持久化对象的标识进行持久化
持久对象的存储和访问• 有三种访问策略:
– 名字法:在持久化区域内按名字查找——不适合有大量对象的情况
– 通过 OID 或持久化指针查找– 系统对每一个持久类型提供一个持久性容器
——其区间存放同类型的持久对象• GOM支持 2 , 3 种方法
变量的持久化• 变量的持久化声明:
– Persistence var myVertices:Vertexset;» aVertex:Vertex ;
– 使用要求:• 变量名必须保持唯一性,无二义性• 变量类型必须已定义为持久性
– 持久性变量由系统管理:它的值在定义它的程序结束后,仍然有定义
– 问题:系统不能保证持久性变量引用一个临时对象,因此会产生悬空引用,即它的值在再次赋值前是未定义的
7.11 垃圾回收( Garbage Collection )• 对于不再被使用的对象,应当及时从 DB
库中删除,• 删除的复杂性由以下原因引起:
– 对象的共享– 不可及对象的检查困难
• 对象 O既不是任何集合或列表的成员,又不被任何属性或变量引用;
• 对无递归引用的对象,一般采用引用计数器法;• 对递归引用,采用 Garbage算法。
删除的复杂性由以下原因引起(续)
– 提供一个对象的显示删除操作,该操作需要不但能删除最外层的对象,也能删除它的引用对象
– 因此 delete 操作需定义一个重载操作进行引用链的捆绑删除
问题:显示删除容易造成共享对象的悬空访问
o
o2o1
7.12 sort 类型的复合定义• Sort 类型的基本类型是简单类型• Sort 类型可以组合定义构成抽象类型
ADT
• Sort 类型的体有三种类型:– 元组类型 [ ]– 集合类型 { }– 表类型 〈 〉
Sort 类型的特点• Sort 类型的成员可以是对象类型• Sort 类型的实例化是一个值,因此,它是复制语义 例: sort data is [ day : int; month : int; year : int ] . .Var d1: data ; ---- 系统分配给 d1 一个 data 类型的空间 d1.day=1; d1.month=1,d1.year=2002;当 d2=d1 时, d2也获得一个值当 d1.day=d1.day+1 时, d2 不变• Sort 类型不允许递归定义
sort data is
[day: int;
month: int;
year: int;];
var d1: date;
d1.day := 1;
d1.month := 1;
d1.year := 1980;
d2 := d1
d1.day := d1.day +1;
type Car is
[creationDate:data;
chassis:Chassis;];
sort s is [a: u;];
sort t is [b: s;];
sort u is [c: t;];
sort s is [a: u;];
type T is [b: s;];
sort u is [c: T;];
sort childSet is {Person};
type Person is [age:int;spouse:Person;children:childSet;];