多类对象模型中的行为安全
1. 受限对象结构与行为安全定义
对象 SRp = SpP pRpSR+ 有时被称为在 P p 上的受限积。为简化类型描述,我们省略 上标中的 P p,只写出参与积运算的类型。不过,适用时不能忘记扩展交换性和唯一性条件。SRp 的结构可以有多种表达方式:
- SRp = SpRpSR+(以最具体类表示 SR 的结构)
- SRp = P pSpRpSR+(以所有超类型表示 SR 的结构)
- SRp = P pS+R+SR+(以其组件表示 SR 的结构)
在集合中,其结构为:SRp = {(p; s; r; sr) | p ∈ P p; s ∈ S+; r ∈ R+; sr ∈ SR+}。
在支持多重继承和方法重定义的模型中,可能存在多个具有最具体行为的方法。虚拟方法没有明确实现的情况被称为行为安全。虚拟方法明确的条件定义如下:
定义 2(方法明确性) :方法 m 明确当且仅当对于所有类型 T = T1 T2 … Tn(其中 T1, T2, …, Tn 是 T 的所有超类型),对于任意两个不处于子类型关系且都实现了 m 的 Ti ≠ Tj,总是存在实现 m 的 Tk 以及箭头 πTk:Ti : Tk → Ti 和 πTk:Tj : Tk → Tj。
2. 方法调度的两种基本方法
- 首选类方法 :为每个可以调用方法 m 的上下文 S 和 R 分别定义重新实现 m 的类型的顺序。这种方法支持上下文相关的行为,因为顺序是针对每个调用上下文定义的。
- 参数特异性方法 :比较方法定义的参数,选择与实际参数更匹配的实现。虽然这种方法并不总是能调度方法,但能确保行为的一致性。还有一种基于统计的启发式方法,会调度过去调用更频繁的方法,但这种模型中消息传递机制的语义非常不明确。
3. 受限方法重定义方法
行为冲突往往反映的是数据库模式本身的不一致,而非模型本身的限制。例如,
get_contact
方法在
student
和
lecturer
子类型中被重定义,对于同时具有这两种角色的对象,调用该方法会导致行为冲突。在数据库模式设计阶段就可以解决这种冲突。我们引入受限方法重定义方法,即与独立角色等价的类型只能在严格规则下重定义其方法。
4. 细化模型:方法重定义约束
- 约束作为直接方法继承的属性 :约束与特定方法或类型无关,而是继承本身的属性。在继承层次结构的每个边上添加额外标记(在继承图中用虚线表示),表示通过该边继承的方法不能在后续子类型中重定义。但由于多重继承图可能提供多条方法继承路径,方法仍可能被重定义,这会导致对象可获取类型的更大限制。
graph LR
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
A(person):::process -->|πS:P| B(student):::process
A -->|πR:P| C(reader):::process
A -->|πE:P| D(employee):::process
D -->|πL:E| E(lecturer):::process
D -->|πSec:E| F(secretary):::process
D -->|πFt:E| G(full - time):::process
D -->|πPt:E| H(part - time):::process
B -->|πExt:S| I(external):::process
B -->|πInt:S| J(internal):::process
-
约束与独立角色
:指向某个类型的箭头将其直接子类型划分为两个不相交的子集。例如,
employee的子类型可分为 {full - time,part - time} 和 {lecturer,secretary} 两组。后一组的所有子类型都禁用了方法重定义,我们称其为独立角色集(T ind)。前一组为排他角色集(T ex)。独立角色类型可自由组合形成多类型对象,不会产生行为冲突;而排他角色集需要防止包含多个该集合类型的多类型对象存在,以确保模型中无行为冲突。
5. 可获取类型
如果数据库模式满足方法重定义约束,并且对象只能获取有限的类型集,那么行为冲突将得到避免。
-
直接安全组合集
:T 的直接子类型的行为安全组合是 T ind ∪ {E}(E ∈ T ex)的子集,即独立角色集中的任意类型和排他角色集中最多一个类型。我们将其记为 T dsf。若 T dsf 中的方法在多重继承方面没有歧义,基于该集合的类型组合也不会有歧义。
-
安全组合集
:
定义 3(安全组合集) :对于类型 A ∈ DI,B ∈ Asafe 当且仅当不存在 A 的超类型 G 和 B 的超类型 H(G ≠ H),它们具有不同的直接超类型 F 且 G, H ∈ F ex(G 和 H 不是 F 的排他角色集的元素)。
例如,对于
pt - student
和
ft - lecturer
,存在
part - time
和
full - time
这两个类型,违反了非存在条件,所以
ft - lecturer
不属于
pt - student
的安全组合集。
graph LR
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
A(employee):::process -->|πS:E| B(student):::process
A -->|πL:E| C(lecturer):::process
A -->|πpt:E| D(part - time):::process
A -->|πft:E| E(full - time):::process
D -->|πptS:pt| F(pt - student):::process
E -->|πftL:ft| G(ft - lecturer):::process
F -->|πptS:S| B
G -->|πftL:L| C
6. 受限模型中的行为安全
- 最大安全组合集 :
定义 4(最大安全组合集)
:设 A ∈ DI 是继承层次结构中的一个类型,Asafe 是 A 的安全组合集。则关于类型 A 的最大安全组合集 Amsafe 满足:
- A ∈ Amsafe
- B, C ∈ Amsafe ⇒ B ∈ Csafe(且 C ∈ Bsafe)
- 对于所有满足上述两个条件的 X:Amsafe ⊄ X
每个类型 A 可能有多个最大组合集。
- 行为安全命题 :
命题 1(行为安全) :设 DI 是一个具有方法重定义约束且无行为冲突的类型层次结构。那么对于每个关于类型 A ∈ DI 的最大安全组合集 Amsafe = {A1, A2, …, An},基于 Amsafe 中类型的多类型对象 o(o ∈ MTA = A1A2…An)不存在行为冲突。
这意味着 Amsafe 定义了 A 对象可同时获取的类型,且能确保方法调度没有歧义。
证明
:将多类型 MTA 重写为 MTA = T1 T2 … Tn(其中 {T1, T2, …, Tn} 是 MTA 的所有超类型 Ti ∈ DI)。已知若 πTj:Ti : Tj → Ti 受约束,则 Tj 不会重定义 Ti 的方法。设 Ti 和 Tj 是集合 {T1, T2, …, Tn} 中任意两个不处于子类型关系且都实现了方法 m 的不同元素,有两种情况:
1. 根据定义 2,存在 Tk 以及箭头 πTk:Ti : Tk → Ti 和 πTk:Tj : Tk → Tj,这意味着 Tk 必须实现 m,否则模型中就会有歧义。
2. 不存在 Ti 和 Tj 的子类型 Tk。假设 m 在 Ti 和 Tj 中都被重新实现且首次在 F 中定义,那么必然存在至少两个不同类型 G 和 H(G 是 Ti 的超类型,H 是 Tj 的超类型),且 H 和 G 通过无约束边继承(否则 m 的重定义会受限),这与 Ti 和 Tj 属于最大安全组合集的假设矛盾,所以 m 只能在 Ti 和 Tj 中的一个类型中实现,根据定义 2 是明确的。
综上所述,受限积 MTA 描述了基于类型 A 并由 Amsafe 中所有类型扩展的多类型对象的结构,且无行为冲突风险。
多类对象模型中的行为安全
7. 方法调度问题的解决思路总结
在多类对象模型中,方法调度的歧义问题一直是一个关键挑战。之前提到的几种方法各有特点:
|方法|特点|优势|劣势|
| ---- | ---- | ---- | ---- |
|首选类方法|为每个调用上下文定义类型顺序|支持上下文相关行为|增加数据库模式设计复杂度|
|参数特异性方法|比较参数选择匹配实现|确保行为一致性|不总是能调度方法|
|基于统计的启发式方法|调度过去调用频繁的方法|利用历史数据|消息传递机制语义不明确|
|受限方法重定义方法|在严格规则下重定义方法|从根源解决冲突,简化设计|需要在设计阶段仔细考虑|
8. 方法重定义约束的实际应用意义
方法重定义约束在实际数据库设计中具有重要意义,它可以帮助我们避免许多潜在的行为冲突。通过在继承图中使用虚线标记来限制方法重定义,我们可以在设计阶段就发现并解决问题。以下是一个简单的步骤说明:
1.
分析数据库模式
:确定哪些类型可能存在行为冲突,例如具有多个角色的对象。
2.
划分角色集合
:将类型划分为独立角色集(T ind)和排他角色集(T ex)。
3.
添加约束标记
:在继承图的边上添加虚线标记,限制方法重定义。
4.
检查可获取类型
:根据安全组合集和最大安全组合集的定义,检查对象可获取的类型是否会导致行为冲突。
9. 安全组合集和最大安全组合集的关系
安全组合集和最大安全组合集是确保多类型对象行为安全的重要概念。安全组合集定义了类型之间的安全组合关系,而最大安全组合集则是在安全组合集的基础上,找到最大的可组合类型集合。它们之间的关系可以用以下流程图表示:
graph LR
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
A(类型 A):::process -->|确定安全组合集| B(Asafe):::process
B -->|满足特定条件| C(Amsafe):::process
10. 行为安全命题的实际价值
行为安全命题为我们提供了一种理论保障,确保在受限模型中多类型对象不会出现行为冲突。在实际应用中,我们可以利用这个命题来生成一个有效的运行时检查表,用于检查对象获取类型的操作是否安全。具体步骤如下:
1.
确定类型层次结构
:明确所有类型及其超类型关系。
2.
计算最大安全组合集
:对于每个类型 A,计算其最大安全组合集 Amsafe。
3.
生成检查表
:根据 Amsafe 生成一个检查表,用于在运行时检查对象获取类型的操作。
4.
运行时检查
:在对象获取新类型时,检查该类型是否属于相应的最大安全组合集。
11. 总结与展望
通过引入受限方法重定义和相关的约束条件,我们成功地解决了多类对象模型中的行为冲突问题。这种方法不仅在理论上得到了证明,而且在实际应用中也具有重要的指导意义。然而,仍然有一些问题需要进一步研究:
-
约束规则的优化
:目前的约束规则可能过于严格,需要进一步研究如何在保证行为安全的前提下,放宽规则以提高模型的灵活性。
-
实际环境的测试
:虽然理论上证明了方法的有效性,但还需要在实际数据库环境中进行测试,以验证其性能和实用性。
-
与其他技术的结合
:可以考虑将受限方法重定义方法与其他数据库技术相结合,以进一步提高数据库的性能和安全性。
总的来说,受限方法重定义方法为多类对象模型中的行为安全问题提供了一种有效的解决方案,未来的研究可以在此基础上不断完善和拓展。

被折叠的 条评论
为什么被折叠?



