Download presentation
Presentation is loading. Please wait.
1
第三部分 面向对象模型 GOM Generic Object Model 类型系统与对象系统 GOM 的结构定义 元组结构 聚集结构 对象的标识 子对象的共享 对象的持久性 Sort 类型上的复合结构 第七章 对象类型的结构
2
7.1 类型系统与对象系统 类型系统( sort type )的发展 – 类型: – 早期语言只提供简单类型 – 进一步复杂类型 - > 简单类型、结构类型、串、指针... –Ada 提出抽象数据类型 ADT ( abstract data type ) 用户自己定义结构、操作 系统提供打包功能 以类型方式提供使用
3
几种简单 sort 类型
4
类型的使用、特点、局限 变量说明:指明一个变量的类型 变量赋值:类型的实例化操作 – 实例化结果:指定一个值 – 在实例的整个生命周期,值是不变的,因此类 型的实例无需标识,值就是其本身的标识 – 变量的重新赋值是重新实例化过程,原实例已 消亡。 类型系统的问题:无法描述实例的状态变化,即 不同的值代表了某个实例在不同时刻的不同状态 数据库的应用是最突出的不协调
5
面向对象类型 对象系统强调的是对象状态的变化 对象的生命周期种的某一瞬间是一个状 态(对象属性的某个值集) 但对象属性值被修改时,表明该对象由 一个状态转化为另一个状态 为了能识别不同状态下的对象,必须进 行标识。 —— 唯一性约束 对象状态的转化时内部变化,因此必须 进行封装 —— 完整性约束 对象 O 由( id#, Type, Rep) 三元组表示
6
7.2 GOM 对象类型框架定义 对象类型名唯一,超类 型名可选。 Public 子句提供外部说明 Body 子句描述结构主体 操作子句描述接口说明 – 操作名(唯一性) – 参数说明 操作实现子句 —— 描述 操作体
7
7.3 元组结构的对象类型 结构主体由三种基本结构及其组合 而成 – 元组结构 (tupe_structure) – 集合结构 (set_structure) – 表结构 (list_structure)
8
元组结构定义 Type i 可以是 简单 sort ; 组合 sort ; 对象类型;混合类 型;集合类型;表 类型;直接递归类 型等
9
内嵌的属性值读写操作 VCO 操作( Value receiving operation ) 值接收操作 Declare attri:->type i; 读取当前第 i 个属性状态 VTO 擦作( Value returning operation ) 值返回操作 Declare attri:<-type i; 将类型为 Type i 的状态写入第 i 个属性中
10
示例 ( 一 ) 直接递归示例 维护 person 的对象实例状态的操作 Var p:person … p.age:=p.age+1 (p.age p.age->+1)
11
示例(二) 立方体对象模型的正文: * 定义 “ 点 ” 的对象类型 * 定义原材料的对象类型 * 定义立方体的对象类型
12
7.4 GOM 类型的实例化 一个对象类型框架可产生一系列对象实例 内嵌的创建对象操作 ——“ create ” GOM 类型的实例化过程 – 第一步 * Var myCuboid :Cuboid ; / 说明对象变量 – 第二步 * 执行赋值语句 : ( 1 ) myCuboid:=Cuboid$create; 或( 2 ) myCuboid.create;
13
赋值语句的作用 ( 1 )产生了一个初始化的空壳实例; ( 2 )对该空壳实例赋予了一个对象标记 OID ; ( 3 )将 OID (或实例地址)赋给变量 myCuboid ; ( 4 )将空壳属性值初始化为: Int : 0 ; float : 0.0 ; char : ’ \0 ’ ; bool : false ;复杂对 象类型: NULL ; ( 5 )当前该 OID 还仅是逻辑表示,不能被用户访问。 * 产生了一个仅仅与 OID 相联系的一个空对象。 -第三步:对空对象的每个属性进行实际值的 初始化工作
14
示例 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 : NULL value : 0.0 v1 : NULL v2 : NULL v3 : NULL v4 : NULL v5 : NULL v6 : NULL v7 : NULL v8 : NULL id1Cuboid
15
7.5 对象标识 表示对象的三种方法: – 内容标识 — 关键字标识符 – 地址标识 — 物理对象标识符 – 逻辑对象标识符 内容标识的问题(内容依赖) – 概念的混淆:将两对象相等与两对象内容相等混为一谈。 – 一致性管理的困难。 例 1 :对大商场中,同一商品在不同柜组有不同售价,商品的 主 key 为(商品号 + 柜组号)。 例 2 :若主 key 为(人名 + 地址),当搬家而修改库时,给完整 性维护带来困难。
16
地址标识 — 用对象所分配的地址空间表示对象。 地址标识问题(地址依赖) – 存储空间的重用导致引用错误且无法查找。 例如新对象占用已删除对象空间。 – 分布式系统中对象经常被移动位置。 –DB 性能调整时常常需要重构硬盘存储区。
17
逻辑对象标识符 OID Logical Object Identity 对于 GOM ,每个对象可以描述为下述三元组 O = ( id # , Type , Rep ) Id # :系统产生的对象 O 的逻辑标识符 Type :对象 O 的类型 Rep :对象的内部状态,即属性的当前值。 OID 的特点 对象实例初始化时,系统产生一个唯一的 OID 一个对象的 OID 在整个生命周期都永远保持 当对象删除后,其 OID 值永不复用
18
7.6 共享的队象 Share Subject 标准的 RDBMS :由于 INF 约束,不支持队象的 引用 扩展的 INF 2 的 RDBMS ,只能支持层次结构, 不支持网状结构 从需求而言,复杂 DB 应用要求支持网络结构 O-O 模型中,一个对象模型可以不受限制地引 用其他对象,同时也可以被其他对象引用-- 构造出网状拓扑结构 GOM 模型通过多对象共享机制,支持网络结 构应用
19
共享子对象示例
20
共享子对象的副作用-修改可见 对象的状态变化会被其他引用对象可见 例:一个对 Material 对象的修改: anotherCuboid.mat.name = ” Copper ” ; anotherCuboid.mat.SpecWeight = 0.90 会被 myCuboid 所指 id1 可见
21
7.7 引用和重引用 Referencing and Dereferencing 复制( copy )语义:将一个值真实地复制到一个 sort 类型的变量或属性中。 引用( referencing )语义:赋值语句处理的是一个对 象时,只将该对象的 OID 赋值到相应的变量或属性中。 引用语句与 C 中的指针赋值相似,是一个间址操作。 重引用( Dereferencing )语义:引用语义沿着引用链 的传递。 重引用语义是通过 “” 操作符的重载,构造的引用链 实现的 整个对象结构可以通过引用语义构成一个网状结构 一个引用查找的实现是沿引用链,导航式地对逐个对 象实例的查询。
22
Var someMaterial:Material; w:float; muCuboid:Cuboid; … (1)someMaterial.create; (2)someMaterial.name:= “ Carbo n ” ; (3)someMaterial.specWeight:=0. 75; (4)myCuboid.mat:=someMateria l; (5)w:=myCuboid.mat.specWeigh t; mat:id 88 value:39.99 v1:id 11 … name: ” Carbon ” specWeight:0.75 … Materialid 88 id 1 Cuboid myCuboid someMaterial
23
7.8 聚合类型 collection GOM 模型提供 body 的二种内嵌的聚集类 型的类型构造子: — 集合结构 — 表结构
24
集合结构的对象类型 集合结构的对象类型是一个集合对象 表达如下: Type set typeName is public … body {Element type} … end 集合元素类型 ElementType 可以是 sort 类型,也可以 是对象类型
25
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);
26
集合结构的对象类型特点 需要定义一个元素 Element 的类型 集合对象类型本身可以用于定义对象属性的类型 集合对象类型支持数学上的 Set 概念,即不允许有相 同元素存在。( GOM 要作唯一性检查) 当 Element 是 sort 类型时,插入概念是复制语义,插入 值; 当 Element 是对象类型时,插入概念是引用语义,插 入 OID 集合对象允许共享,当有共享发生时,为共享子对象。 共享概念的引入,使集合对象的概念可以作为对象库 概念。 共享的副作用 — 修改可见
27
对象类型的扩展 GOM 通过 with extension 子句隐式地产生并维护一个特定对 象类型的集合对象类型,用以管理该类型实例化的对象集合。 例 type Cuboid is with extention is … end type Cuboid 则系统自动产生一个 set Cuboid 对象类型 Cuboids 。并将所有 Cuboid 的实例化对象自动插入到 Cuboids 中。 Cuboids 类型只允许用户使用 ext (Cuboid) 进行访问。 不允许任何显式地修改、删除、插入等操作 利用扩展概念建立对象实例库
28
type CuboidSet is {Cuboid}; var workPieceCuboids:CuboidSet; valuableCuboids:CuboidSet; … workPieceCuboids.insert(myCuboid); … valuableCuboids.insert( … ); type CuboidSet with extension is … end type Cuboid;
29
表结构对象类型 表结构对象类型的特点 — 列表中的元素是有序的 — 类标的数学概念是 bag ,即允许相同的元素在表 中不同位置多次出现 — 列表中元素的类型可以是 sort type 或 object type 表结构对象类型的定义方式 type Name is public … body …
30
CuboidSetid 59 workPiece Cuboids {id 1,id 2,id 3 } {id 3 } name: ” Iron ” specWeight:0.89 name: ” Gold ” specWeight:1.32 valuable Cuboids id 60 CuboidSet id 77 id 99 Cuboid Material Vertex id 1 mat: id 77 value:39.99 v1:id 11 v2:id 12 v3:id 13 v4:id 14 v5:id 15 v6:id 16 v7:id 17 v8:id 18 id 11 x: 0.0 y: 0.0 z: 0.0 id 1 mat: id 99 value:89.90 v1:id 31 v2:id 32 v3:id 33 v4:id 34 v5:id 35 v6:id 36 v7:id 37 v8:id 38 id 2 mat: id 77 value:19.95 v1:id 21 v2:id 22 v3:id 23 v4:id 24 v5:id 25 v6:id 26 v7:id 27 v8:id 28 id 18 x: 0.0 y: 1.0 z: 1.0 id 21 x: 0.0 y: 0.0 z: 0.0 id 28 x: 0.0 y: 2.0 z: 2.0 id 31 x: 0.0 y: 0.0 z: 0.0 id 38 x: 0.0 y: 3.0 z: 3.0
31
mat: id 77 value: 250.00 vertices: id 899 Cuboid2id 299 id 899 VertexList type VertexList is Public … body operations … implementation … end type VertexList; type Cuboid2 is Public … body[mat: Material; value: float; vertices:VertexList;] operations … implementation … end type Cuboid2;
32
7.9 类型安全 非类型安全数据类型:数据库的组件 (属性,变量,集合元素等),并不限 制为一个特定的类型(不需要类型说 明),即编译时不对它们进行类型检查, 好处是使用灵活。 问题:大量的错误只能在运行时被检测 出来
33
类型安全(续) 类型安全数据类型:对所有构件均限制了数据类 型。 — 强类型语言 — GOM 为强类型的 优点 1. 类型安全 2. 高效,在运行时无需作类型检查。 3. 支持结构化设计 4. 类型约束的组件为:属性、变量、操作参数、 表和集合类型的元素。 5. 强类型语言编译时检查表达式中类型的兼容 性。
34
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;Perso n; …
35
name: “ Los Angeles ” mayor: id 188 inhabitants: id 115 id 571 City cityOfLA {id 193,id 188,id 372 } id 115 PersonSet name: “ Mickey Mouse ” age: 60 spouse: id 372 livesIn: id 571 Personid 188 name: “ Mini Mouse ” age: 50 spouse: id 188 livesIn: id 571 Personid 372 name: “ Donald Duck ” age: 45 spouse: NULL livesIn: id 571 Personid 193 donaldmickey
36
var totalAge,ageOfSomeBod y:int; anyBody:Person; name:string; … (1) ageOfSomeBody:=cityOf LA.mayor.spouse.age; (2) foreach(anyBody in cityOfLA.inhabitants) totalAge:=totalAge+any Body.age; foreach(anyBody in cityOfLA.inhabitants) totalAge:=totalAge+anyBody.age; ageOfSomeBody:=cityOfLA. mayor. spouse. age; intCity Person int PersonCity PersonSet int Person
37
7.10 持久性 Persistence 持久性:当程序的执行终止后,其创建的构件和数据 仍然存在。 需进行持久化构件 — 持久化对象类型 — 持久化对象实例 — 持久化变量 处理持久化数据采用的方式 — 嵌入式 SQL 语言 — 持久化程序设计语言 嵌入式 SQL 语言:持久性数据的存取操作,必须由设 计者显式地用 SQL 提供的语句进行 DB 读写。
38
持久化程序设计语言 — 查询语言与宿主语言完全无缝联接 优点 — 对象在 DB 中的创建、存储无需任何格式联接。 — 用户对持久化数据的操纵与一般数据一样,无需 进行显式的读 / 写。 缺点 — 由于宿主语言过强,对 DB 数据的一致性维护更加 困难。 — 由于语言的复杂性,数据查询的优化处理变得更 困难。 — 与 SQL 的无缝联接目前作的并不理想。
39
GOM 持久性构件 — 类型的持久化 类型的持久化:类型的持久性由 Persistence 定义符 说明。 例: Persistence Type Vertex is 其中,持久性类型名称不能被重定义 持久性类型的依赖关系 — 在元组结构类型中,持久化类型的所有属性都 必须是持久的。 — 在聚合结构类型中,其元素类型也必须持久。 — 在继承的 is-a 层次内部,一个持久类型的超类型 (祖先)必须是持久的。
40
对象的持久性 一个对象实例的持久化可以采用以下几种途 径: 1. 按类型持久:一个持久化类型的实例可以自 动确认为持久的。 缺点:使用极不方便,在需要持久和临时共 存时,操作困难。有的系统采用持久意向概 念,即持久类型实例化的对象可能潜在变为 持久。 2. 按创建持久 — 将持久操作与初始化操作绑定, 即将持久对象与临时对象采用不同的初始化 子。
41
对象的持久性(续) 3. 提供一个持久化操作,即用显式的持久化操 作将对象持久化。即将持久化声明延迟到对 象创建之后。 4. 按引用声明持久:仅对一个(或多个)对象 显式的声明为持久对象(根对象)。其他对 象的持久化定义为沿着根对象的引用链进行 持久化扩展。 优点:持久化定义简洁。 缺点:系统确定持久化对象的代价较大。
42
GOM 的对象持久化方法 GOM 采用 2 , 3 两种方法: –GOM 提供一个持久化操作子( persistence ) 例如: aVertex.persistence aVertex 在持久化操作之前仍然是临时对象 –GOM 提供初始化阶段的持久化操作 GOM 不支持第 4 种方法,带来的危险行 为 – 当用户从一个持久化对象中引用了一个临时 对象时,会导致浮动引用
43
持久对象的实现方法 地址依赖方法: – 当声明一个对象持久化时,系统初始化一特 定的外存区域,并提供一个持久化地址指针 OID 持久方法: – 对持久化对象的标识进行持久化
44
持久对象的存储和访问 有三种访问策略: – 名字法:在持久化区域内按名字查找 —— 不 适合有大量对象的情况 – 通过 OID 或持久化指针查找 – 系统对每一个持久类型提供一个持久性容 器 —— 其区间存放同类型的持久对象 GOM 支持 2 , 3 种方法
45
变量的持久化 变量的持久化声明: –Persistence var myVertices:Vertexset; »aVertex:Vertex ; – 使用要求: 变量名必须保持唯一性,无二义性 变量类型必须已定义为持久性 – 持久性变量由系统管理:它的值在定义它的程序结 束后,仍然有定义 – 问题:系统不能保证持久性变量引用一个临时对象, 因此会产生悬空引用,即它的值在再次赋值前是未 定义的
46
7.11 垃圾回收( Garbage Collection ) 对于不再被使用的对象,应当及时从 DB 库中删除, 删除的复杂性由以下原因引起: – 对象的共享 – 不可及对象的检查困难 对象 O 既不是任何集合或列表的成员,又不被任何 属性或变量引用; 对无递归引用的对象,一般采用引用计数器法; 对递归引用,采用 Garbage 算法。
47
删除的复杂性由以下原因引起 (续) – 提供一个对象的显示删除操作,该操作需要 不但能删除最外层的对象,也能删除它的引 用对象 – 因此 delete 操作需定义一个重载操作进行引 用链的捆绑删除 问题:显示删除容易造成共享对象的悬空 访问
48
o o2o2 o1o1
49
7.12 sort 类型的复合定义 Sort 类型的基本类型是简单类型 Sort 类型可以组合定义构成抽象类型 ADT Sort 类型的体有三种类型: – 元组类型 [ ] – 集合类型 { } – 表类型 〈 〉
50
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 类型不允许递归定义
51
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;childr en:childSet;];
Similar presentations
© 2024 SlidePlayer.com Inc.
All rights reserved.