UML面向对象设计原则.pptxVIP

  • 2
  • 0
  • 约3.24千字
  • 约 78页
  • 2023-12-15 发布于湖北
  • 举报

第11章;本章将介绍建立健壮的类层次结构应遵循的两项重要原则:类型一致性和闭合行为。;11.1 类型一致性与闭合行为;11.1.1 类与类型;11.1.2 类型一致性原则;在完善的面向对象设计中,每个类的类型必须与其超类相一致,即类或子类的继承层次结构必须遵循类型一致性原则。;为了做到每个子类的类型能够真正可信地与其超类的类型一致,引入类型一致性的两个重要子原则:抗变性与协变性。;必须保证满足下列三个操作限制条件:

每个超类的操作必须与其子类中一个操作相对应,它们具有相同的名字和函数原则。

每个子类操作的前置条件不应强于其超类操作的前置条件,这就是抗变性原则。

每个子类操作的后置条件至少要和其相应超类操作的后置条件一样强,这就是协变性原则。;类型一致性原则要求子类S必须为类T的真子类型,并且满足下列六个限制条件(前两个条件适用于所有类,后四个条件适用于单个操作):

S的状态空间必须与T的状态空间一致。

在S和T的共享空间中,S的状态空间必须等同于或位于T的状态空间之内。;(3)S.op必须与T.op名称相同。

(4)S.op的形式函数原型的参数必须与 T.op的形式函数原型的参数表一一对应。

(5)S.op的前置条件必须等同于或弱于T.op的前置条件。

(6)S.op的后置条件必须等同于或强于T.op的后置条件。;11.1.3 闭合行为原则;如果你发送消息并作一般(超类)条件假设,则目标对象可能拒绝该消息或不作任何操作便返回。如果出现该问题,则在发送消息前,可以采取下列步骤:;检查运行时的目标类。

限制与目标有关的变量的多态性。

设计消息时假设目标是有关层次结构中最特殊、最底层的类--即对其行为具有最高限制条件的类。;11.2 封装与共生性;11.2.1 封装结构;制定标准管理各个封装级别之间的相互作用。表11-1概括了一些传统结构设计标准。该表显示了应用于每一对封装级别的相应标准。;表11-1;表11-2是表11-1的扩展,其中包括了2级封装,所以五个框的内容需要去命名和描述。;表11-2;11.2.2 共生性;静态的共生性有以下几种方式 :

类型或类的共生性

名称共生性

常量共生性

算法共生性

位置共生性;动态共生性是一种??赖于运行代码的执行模式:对象。动态共生性同样具有很多形式:

执行共生性

数值共生性

同步共生性

标识共生性;11.2.3 面向对象系统中共生性的滥用;11.2.4 共生性的术语;11.3 领域、依附集和内聚;11.3.1 对象类的领域;11.3.2 依附集;依附集表示

(1)可以用图形方法说明依附集。用一个箭头来表示一种直接类引用。如图11-1所示,类A的直接引用是A1、A2、A3。因而类A的直接依附集就是3。;图11-1;(2)图11-2表示的是类A的间接类引用集。你会发现类A的间接依附集是通过计算这个图表中所有的类而得到的,也就是说,在树状视图中所有类的总和,这些类的根节点都是A并且叶子节点都是底部的基础类(用字母F等表示的,如F1)。;图11-2;依附集的使用。依附集提供了一种衡量类的复杂程度的方法。类是处于基础领域之上有多高的程度。因而,处于高级别领域的类具有较高的间接依附集,处于低级别的类则具有较低的间接依附集。;Demeter规则 。一个Demeter规则的惯用语是如下描述的:

假设A的一个对象为obj,并且假设定义对象obj的所有操作运算为op,那么在执行op操作过程中,一条消息的每一个目的地一定是下面的对象之一。

对象obj本身是一个特别的例子,self和super(在smalltalk工具中),this(在C++和Java语言中),或者Current(在Eiffel工具中)。;在op标记符范围内通过一个参数引用一个对象。

通过对象obj的一个变量来引用一个对象。

通过操作运算ob创建的一个对象。

通过一个全局变量引用的一个对象。;11.3.3 类的内聚:一个类和它的特性;混合事例型内聚定义:一个混合事例型内聚的类具有这样的特性:对于类的对象来说这些特性是未被定义的。;混合领域型内聚的定义:一个混合领域型内聚的类包含这样的一个元素,这个元素是一个不同领域的非本征类的直接依附集。;混合角色型内聚的定义:一个具有混合角色型的类A包含了这样一个元素,这个元素直接依附集于与A同一领域的类的一个非本征类。;11.4 继承与多态性的危险性;11.4.1 继承的滥用;11.4.2 错误的聚集;图11-3;11.4.3 倒置的层次结构;图11-4;11.4.4 混淆类及其实例;图11-5;图11-6;11.4.5 误用;图11-7;问题出在Room从Cuboid继承的行为上,该行为来源于Cuboid的操作,如stretch、rotate等,由于该行为对于Room不合法,则必须在Room中覆盖

文档评论(0)

1亿VIP精品文档

相关文档