Upload
others
View
18
Download
0
Embed Size (px)
Citation preview
1
第三章 类型与对象
Related to text book Chp. 7 (English book)
2
• 对象与值
• 对象类型
• 基于元组的对象类型
• 实例
• 对象标识符
• 引用
• 对象类型扩展
• etc
目录
3
类型与对象
• 基于Generic对象模型(GOM)• 类型系统(sort type)的发展
– 类型:<类型名,{值域},{操作}>– 早期语言只提供简单类型
– 进一步复杂类型简单类型、结构类型、串、指针...
– Ada提出抽象数据类型ADT(abstract data type)
• 用户自己定义结构、操作
• 系统提供打包功能
• 以类型方式提供使用
4
几种简单sort类型
5
类型-续
• 变量说明:指明一个变量的类型
• 变量赋值:类型的实例化操作
– 实例化结果:指定一个值
– 在实例的整个生命周期,值是不变的,因此类型的实例无需标识,值就是其本身的标识
– 变量的重新赋值是重新实例化过程,原实例已消亡。
• 类型系统的问题:无法描述实例的状态变化,即不同的值代表了某个实例在不同时刻的不同状态
6
面向对象类型
• 对象系统强调的是对象状态的变化
• 对象生命周期中的某一瞬间是一个状态
(对象属性的某个值集)
• 当对象属性值被修改时,表明该对象由一
个状态转化为另一个状态
7
面向对象类型-续
• 为了能识别不同状态下的对象,必须进行
标识 ——唯一性约束
• 对象状态转化时内部变化必须合理,因此
需要进行封装——完整性约束
• 对象O由(id#, Type, Rep)三元组表示
8
GOM对象类型框架定义
• 对象类型名唯一
• Public子句提供外部说明
• Body子句描述结构主体
• 操作子句描述接口说明
– 操作名(唯一性)
– 参数说明
• 操作实现子句——描述
操作体
9
对象结构
• 结构主体由三种基本结构及其组合而
成
–元组结构(tupe_structure)
–集合结构(set_structure)
–列表结构(list_structure)
10
元组结构定义
Typei 可以是
• 简单sort;
组合sort;
• 对象类型;混合类
型;集合类型;表类
型;直接递归类型等
11
内嵌的属性值读写操作
• VCO操作(Value receiving operation)– 值接收操作
– Declare attri: → type i; – 读取当前第i个属性状态
• VTO操作(Value returning operation)– 值返回操作
– Declare attri: ← type i; – 将类型为Type i的状态写入第i个属性中
12
举例
• 直接递归示例
• 维护person的对象实例状态的操作
Var p:person…p.age:=p.age+1 p.age (p.age+1)
13立方体对象模型的定义
• 定义“顶点”的对象类型 • 定义立方体的对象类型
• 定义原材料的对象类型
14
类型的实例化
• 一个对象类型框架可产生一系列对象实例
• 内嵌的创建对象操作——“create”
• GOM类型的实例化过程
– 第一步 说明对象变量
Var myCuboid :Cuboid;
– 第二步 执行赋值语句:
myCuboid:=Cuboid$create;
或 myCuboid.create;
15
赋值语句的作用
(1)产生了一个初始化的空壳实例;
(2)对该空壳实例赋予一个对象标记OID;
(3)将OID(或实例地址)赋给变量myCuboid;(4)将空壳属性值初始化为:
Int:0;float:0.0;char:’\0’;bool:false;复杂对象类型:NULL;
(5)当前该OID还仅是逻辑表示,不能被用户访问。
*产生了一个仅仅与OID相联系的一个空对象。
-第三步:对空对象的每个属性进行实际值
的初始化工作
16
图7.2 The Topological Representation Of a Cuboid
图7.3 The “Skeleton” of a New Cuboid Instance
y
x
V4
V8
V1
V3
V6
V7
V2
V5
myCuboid
mat:NULLvalue:0.0v1:NULLv2:NULLv3:NULLv4:NULLv5:NULLv6:NULLv7:NULLv8:NULL
id1 Cuboid
17
对象标识
标识对象的三种方法:
– 内容标识—关键字标识符
– 地址标识—物理对象标识符
– 逻辑对象标识符
18
内容标识
• 内容标识的问题(内容依赖)
– 概念的混淆:将两对象相等与两对象内容相等混为一谈。
– 一致性管理的困难。
例1:大商场中,同一商品在不同柜组有不同售价,商品的主key为(商品号+柜组号)。
例2:若主key为(人名+地址),当搬家而修改
库时,给完整性维护带来困难。
19
地址标识
• 地址标识
– 用对象分配的地址空间表示对象。
• 地址标识问题(地址依赖)
– 存储空间的重用导致引用错误且无法查找。
例如新对象占用已删除对象空间。
– 分布式系统中对象经常被移动位置。
– DB性能调整时常常需要重构硬盘存储区。
20
逻辑对象标识符 OID
• 对于GOM,每个对象可以描述为下述三
元组
O = (id#,Type,Rep)– Id# :系统产生的对象O的逻辑标识符
– Type:对象O的类型
– Rep:对象的内部状态,即属性的当前值。
21
OID的特点
• 对象实例初始化时,系统产生一个唯一的
OID
• 一个对象的OID在整个生命周期都永远保
持
• 当对象删除后,其OID值永不复用
• 对象的存储位置与OID值有唯一的映射
22
共享子对象
• 标准的RDBMS:由于INF约束,不支持对象的引用
• 扩展的INF2的RDBMS,只能支持层次结构,不支持
网状结构
• 从需求而言,复杂DB应用要求支持网络结构
• O-O模型中,一个对象模型可以不受限制地引用其他
对象,同时也可以被其他对象引用--构造出网状
拓扑结构
• GOM模型通过多对象共享机制,支持网络结构应用
23
共享子对象例子
24
共享子对象的副作用
• 对象的状态变化会被其他引用对象可见
• 例:一个对Material对象的修改:
anotherCuboid.mat.name = ”Copper”;
anotherCuboid.mat.SpecWeight = 0.90
• 会被myCuboid所指id1可见
25
Referencing
• 复制(copy)语义:将一个值真实地复制到一
个sort类型的变量或属性中;
• 引用(referencing)语义:赋值语句处理的是
一个对象时,只将该对象的OID赋值到相应的
变量或属性中;
• 引用语句与C中的指针赋值相似,是一个间址
操作。
26
Dereferencing
• Dereferencing语义:引用语义沿着引用链
的传递。
• Dereferencing语义是通过“•”操作符的重
载,构造的引用链实现
• 整个对象结构可以通过引用语义构成一个
网状结构
• 一个引用查找的实现是沿着引用链,导航
式地对逐个对象实例的查询
27
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:id88value:39.99v1:id11…
name:”Carbon”specWeight:0.75…
id88
id1Cuboid
myCuboid
Material
someMaterial
28
聚合类型 collection
• GOM模型提供body二种内嵌的聚合类型
的类型构造子:
– 集合(set)结构
– 列表(list)结构
29
集合结构的对象类型
• 集合结构的对象类型是一个集合对象
表达如下:
Type set typeName ispublic …body {Element type}…end
• 集合元素类型 Element Type 可以是 sort 类型,也可以是对象类型,或用户定义类型
30
type SetTypeName isPublic…body
{Element Type}…
end type SetTypeName;
type TelephoneNumbers is{int};
type TelephoneNumbers isPublic…body
{int}operations
…implementation
…end type TelephoneNumbers;
声明一个变量并赋值
var guidosTelephoneNumbers: TelephoneNumbers;…
(1) guidosTelephoneNumbers.create;(2) guidosTelephoneNumbers.insert(6082080);(3) guidosTelephoneNumbers.insert(28833);
31
声明一个变量
var theGOM24HourSupportHotLine : guidosTelephoneNumbers;…
theGOM24HourSupportHotLine := guidosTelephoneNumbers;theGOM24HourSupportHotLine.insert (6083968);
{6082080,6083968,28833}
TelephoneNumbersid4711
guidosTelephoneNumbers theGOM24HourSupportHotLine
Fig. 7.7 Object Base Extension with a Shared Set Object
32
var workPieceCuboids:CuboidSet;valuableCuboids:CuboidSet;…
workPieceCuboids.insert(myCuboid);…
valuableCuboids.insert(…);
type CuboidSet is{Cuboid};
…end type Cuboid;
type SetTypeName isPublic…body
{ElementType}…
end type SetTypeName;
集合结构的类型也可以是复杂类型
33
集合结构的对象类型特点
• 需要定义一个元素(Element)的类型
• 集合对象类型本身可以用于定义对象属性的类型
• 集合对象类型支持数学上的Set概念,即不允许有相同元素存在。(GOM要作唯一性
检查)
• 当Element是sort类型时,插入概念是复制语义(插入值);
34
集合结构的对象类型特点-续
• 当Element是对象类型时,插入概念是引用语义(插入OID);
• 集合对象允许共享,当有共享发生时,为共享子对象。
• 共享概念的引入,使集合对象的概念可以作为对象库概念。
• 共享的副作用 — 修改可见
35
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
id1
mat: id77value:39.99v1:id11 v2:id12v3:id13 v4:id14v5:id15 v6:id16v7:id17 v8:id18
id11x: 0.0y: 0.0z: 0.0
id3
mat: id99value:89.90v1:id31 v2:id32v3:id33 v4:id34v5:id35 v6:id36v7:id37 v8:id38
id2
mat: id77value:19.95v1:id21 v2:id22v3:id23 v4:id24v5:id25 v6:id26v7:id27 v8:id28
id18x: 0.0y: 1.0z: 1.0
id21x: 0.0y: 0.0z: 0.0
id28x: 0.0y: 2.0z: 2.0
id31x: 0.0y: 0.0z: 0.0
id38x: 0.0y: 3.0z: 3.0
… … …
36
对象类型的扩展
• GOM通过with extension子句隐式地产生并维护一个特定对象类型的集合对象类型,用以管理该类型实例化的对象集合。
• 例 type Cuboidwith extention is…end type Cuboid
系统自动产生一个set Cuboid对象类型Cuboids。并将所有Cuboid的实例化对象自动插入到Cuboids中。
• Cuboids类型只允许用户使用ext (Cuboid)进行访问。
• 不允许任何显式地删除、插入等操作
• 利用扩展概念建立对象实例库
37
列表结构对象类型
• 列表结构对象类型的特点– 列表中的元素是有序的
– 列表的数学概念是bag,即允许相同的元素在表中不同位置多次出现
– 列表中元素的类型可以是sort type或object type
• 表结构对象类型的定义方式type Name ispublic …body <Element type>…
38
mat: id77value: 250.00vertices: id899
id299 Cuboid2
<id111,id112,id113,id114,id115,id116,id117,id118>id899 VertexList
type VertexList isPublic…body
<vertex>operations
…implementation
…end type VertexList;
type Cuboid2 isPublic…body [mat: Material;
value: float;vertices:VertexList;]
operations…
implementation…
end type Cuboid2;
39
类型安全
• 非类型安全数据类型:数据库的组成(属性,变量,集合元素等),并不限制为一个特定的类型(不需要类型说明),即编译时不对它们进行类型检查,好处是使用灵活。
• 问题:大量的错误只能在运行时被检测出来
40
类型安全-续
• 类型安全数据类型:对所有构件均限制了数据类型。
– 强类型语言
– GOM为强类型
• 优点
– 类型安全
– 高效,在运行时无需作类型检查。
– 支持结构化设计
– 类型约束的组件为:属性、变量、操作参数、表和集合类型的元素。
– 强类型语言编译时检查表达式中类型的兼容性。
41
type City isPublic…body [name: string;
mayor: Person;inhabitants: PersonSet;]
operations…
implementation…
end type City;
type Person isPublic…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,donald;Person;
…
42
name: “Los Angeles”mayor: id188inhabitants: id115
id571City
cityOfLA
{id193,id188,id372}id115
PersonSet
name: “Mickey Mouse”age: 60spouse: id372livesIn: id571
Personid188
name: “Mini Mouse”age: 50spouse: id188livesIn: id571
Personid372
name: “Donald Duck”age: 45spouse: NULLlivesIn: id571
Personid193
donaldmickeyFig7.11 Person和City 的对象库
43
vartotalAge,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;
intCity
PersonPerson
int
int
Person City
PersonSet
int int Person
44
持久性
• 持久性Persistence :当程序的执行终止
后,其创建的构件和数据仍然存在
• GOM中持久化构件
– 对象类型
– 对象实例
– 变量
45
类型的持久化
• 类型的持久性由Persistence定义符说明
– 例:Persistence Type Vertex is其中,持久性类型名称不能被重定义
• 持久性类型的依赖关系
– 在元组结构类型中,持久化类型的所有属性都必须是持久的
– 在聚合结构类型中,其元素类型也必须持久。
– 在继承的is-a层次内部,一个持久类型的超类型(祖先)必须是持久的
46
对象的持久性
• 一个对象实例的持久化可以采用以下几种途径:
– 按类型持久:一个持久化类型的实例可以自动确认为持久
• 缺点:使用不方便,在需要持久和临时共存时,操作困难。有的系统采用持久意向概念,即持久类型实例化的对象可能潜在变为持久
– 按创建持久—将持久操作与初始化操作绑定,
即将持久对象与临时对象采用不同的初始化子
47
对象的持久性-续
– 提供一个持久化操作,即用显式的持久化操作
将对象持久化。即将持久化声明延迟到对象创
建之后
– 按引用声明持久:仅对一个(或多个)对象显
式的声明为持久对象(根对象)。其他对象的
持久化定义为沿着根对象的引用链进行持久化
扩展
• 优点:持久化定义简洁
• 缺点:系统确定持久化对象的代价较大
48
GOM的对象持久化方法
• GOM采用创建持久和提供一个持久化操作两种方法:– GOM提供一个持久化操作子(persistence)
• 例如:aVertex.persistenceaVertex在持久化操作之前仍然是临时对象
– GOM提供初始化阶段的持久化操作
• GOM不支持按引用声明持久方法,GOM不能确保持久对象不引用临时对象,带来的危险行为是:– 当用户从一个持久化对象中引用了一个临时对象时,会导致浮动引用
49
持久对象的实现方法
• 地址依赖方法:
– 当声明一个对象持久化时,系统初始化一特定的外存区域,并提供一个持久化地址指针
• OID持久方法:
– 对持久化对象的标识进行持久化
50
持久对象的存储和访问
• 有三种访问策略:– 名字法:在持久化区域内按名字查找——不适
合有大量对象的情况
– 通过OID或持久化指针查找
– 系统对每一个持久类型提供一个持久性容器——其区间存放同类型的持久对象
• GOM支持名字法和通过OID或持久化指针
查找种方法
51
变量的持久化
• 变量的持久化声明:– Persistence var myVertices:Vertexset;
aVertex:Vertex;– 使用要求:
• 变量名必须保持唯一性,无二义性
• 变量类型必须已定义为持久性
– 持久性变量由系统管理:它的值在定义它的程序结束后,仍然有定义
– 问题:系统不能保证持久性变量引用一个临时对象,因此会产生悬空引用,即它的值在再次赋值前是未定义的
52
垃圾回收
• 对于不再被使用的对象,应当及时从DB库中删除,
• 删除的复杂性由以下原因引起:
– 对象的共享
– 不可及对象的检查困难• 对象O既不是任何集合或列表的成员,又不被任何
属性或变量引用;
• 对无递归引用的对象,一般采用引用计数器法;
• 对递归引用,采用Garbage算法。
53
垃圾回收-续
– 提供一个对象的显示删除操作,该操作需要不
但能删除最外层的对象,也能删除它的引用对
象
– 因此delete操作需定义一个重载操作进行引用
链的捆绑删除
问题:显示删除容易造成共享对象的悬空访问
54
o
o2o1
55
• 习题
7.27.47.9