《UML第11章面向对象设计原则》由会员分享,可在线阅读,更多相关《UML第11章面向对象设计原则(77页珍藏版)》请在金锄头文库上搜索。
1、第第1111章章 面向对象设计原则面向对象设计原则 11.1 11.1 类型一致性与闭合行为类型一致性与闭合行为 11.2 11.2 封装与共生性封装与共生性 11.3 11.3 领域、依附集和内聚领域、依附集和内聚 11.4 11.4 继承与多态性的危险性继承与多态性的危险性 11.5 11.5 状态空间和行为状态空间和行为本章将介绍建立健壮的类层次结构应遵循的两本章将介绍建立健壮的类层次结构应遵循的两项重要原则:类型一致性和闭合行为。项重要原则:类型一致性和闭合行为。 11.1 11.1 类型一致性与闭合行为类型一致性与闭合行为 本节首先介绍类型与类的关系,然后分别介绍本节首先介绍类型与类
2、的关系,然后分别介绍了类型一致性与闭合行为。了类型一致性与闭合行为。11.1.1 11.1.1 类与类型类与类型 类看作是类型的实现。也就是说,类型包括了类看作是类型的实现。也就是说,类型包括了类的目标以及类的状态空间和行为。类的目标以及类的状态空间和行为。 一个类型可以具体实现为多个类,每个类又包一个类型可以具体实现为多个类,每个类又包括自己独特的内部设计。括自己独特的内部设计。 类型代表着类的外部特征,但子类型的概念和类型代表着类的外部特征,但子类型的概念和子类却是不同的。子类却是不同的。 11.1.2 11.1.2 类型一致性原则类型一致性原则 类型一致性设计原则可表述为:如果类型一致性
3、设计原则可表述为:如果s s为为t t的真的真子类型,则子类型,则s s必须与必须与t t一致,即类型一致,即类型s s的对象可以的对象可以出现在类型出现在类型t t的对象所需要的任何环境中,并且的对象所需要的任何环境中,并且当该对象的任何获取操作执行时,仍能保持其当该对象的任何获取操作执行时,仍能保持其正确性。正确性。 在完善的面向对象设计中,每个类的类型必须在完善的面向对象设计中,每个类的类型必须与其超类相一致,即类或子类的继承层次结构与其超类相一致,即类或子类的继承层次结构必须遵循类型一致性原则。必须遵循类型一致性原则。 为了做到每个子类的类型能够真正可信地与其为了做到每个子类的类型能够
4、真正可信地与其超类的类型一致,引入类型一致性的两个重要超类的类型一致,引入类型一致性的两个重要子原则:抗变性与协变性。子原则:抗变性与协变性。 必须保证满足下列三个操作限制条件:必须保证满足下列三个操作限制条件: (1 1)每个超类的操作必须与其子类中一个操作)每个超类的操作必须与其子类中一个操作相对应,它们具有相同的名字和函数原则。相对应,它们具有相同的名字和函数原则。 (2 2)每个子类操作的前置条件不应强于其超类)每个子类操作的前置条件不应强于其超类操作的前置条件,这就是抗变性原则。操作的前置条件,这就是抗变性原则。 (3 3)每个子类操作的后置条件至少要和其相应)每个子类操作的后置条件
5、至少要和其相应超类操作的后置条件一样强,这就是协变性原超类操作的后置条件一样强,这就是协变性原则。则。 类型一致性原则要求子类必须为类的真子类型一致性原则要求子类必须为类的真子类型,并且满足下列六个限制条件(前两个条类型,并且满足下列六个限制条件(前两个条件适用于所有类,后四个条件适用于单个操作)件适用于所有类,后四个条件适用于单个操作): (1 1)S S的状态空间必须与的状态空间必须与T T的状态空间一致。的状态空间一致。 (2 2)在)在S S和的共享空间中,和的共享空间中,S S的状态空间必须的状态空间必须等同于或位于等同于或位于T T的状态空间之内。的状态空间之内。 (3 3)S.o
6、pS.op必须与必须与T.opT.op名称相同。名称相同。 (4 4)S.opS.op的形式函数原型的参数必须与的形式函数原型的参数必须与 T.op T.op的的形式函数原型的参数表一一对应。形式函数原型的参数表一一对应。 (5 5)S.opS.op的前置条件必须等同于或弱于的前置条件必须等同于或弱于T.opT.op的的前置条件。前置条件。 (6 6)S.opS.op的后置条件必须等同于或强于的后置条件必须等同于或强于.op.op的的后置条件。后置条件。 11.1.3 11.1.3 闭合行为原则闭合行为原则 闭合行为原则是指:在基于类型子类型层次闭合行为原则是指:在基于类型子类型层次结构的继承
7、层次结构中,类结构的继承层次结构中,类C C的任何对象操作的的任何对象操作的执行执行-包括从包括从C C的超类继承的所有操作的超类继承的所有操作应满应满足足C C的类不变式。的类不变式。 如果你发送消息并作一般(超类)条件假设,如果你发送消息并作一般(超类)条件假设,则目标对象可能拒绝该消息或不作任何操作便则目标对象可能拒绝该消息或不作任何操作便返回。如果出现该问题,则在发送消息前,可返回。如果出现该问题,则在发送消息前,可以采取下列步骤:以采取下列步骤: (1 1)检查运行时的目标类。)检查运行时的目标类。 (2 2)限制与目标有关的变量的多态性。)限制与目标有关的变量的多态性。 (3 3)
8、设计消息时假设目标是有关层次结构中最)设计消息时假设目标是有关层次结构中最特殊、最底层的类特殊、最底层的类-即对其行为具有最高限制即对其行为具有最高限制条件的类。条件的类。11.2 11.2 封装与共生性封装与共生性 本节介绍面向对象体系结构的两个基本特性:本节介绍面向对象体系结构的两个基本特性:封装与共生性。面向对象软件的可理解性和可封装与共生性。面向对象软件的可理解性和可维护性,甚至面向对象软件的其他有价值的特维护性,甚至面向对象软件的其他有价值的特性都是以封装与共生性为基础的。性都是以封装与共生性为基础的。 11.2.1 11.2.1 封装结构封装结构 封装的级别封装的级别 :将封装的子
9、程序的级别规定为:将封装的子程序的级别规定为1 1级封装。没有经过封装的原始代码规定为级封装。没有经过封装的原始代码规定为0 0级封级封装。面向对象的方法定义了更高级别的封装。装。面向对象的方法定义了更高级别的封装。类(或对象)是将众多的子程序(称为运算指类(或对象)是将众多的子程序(称为运算指令)集合在一起形成一个高级别的结构体。因令)集合在一起形成一个高级别的结构体。因为运算指令已经高出于为运算指令已经高出于1 1级封装,所以类就是处级封装,所以类就是处于于2 2级封装。级封装。 制定标准管理各个封装级别之间的相互作用。制定标准管理各个封装级别之间的相互作用。表表11-111-1概括了一些
10、传统结构设计标准。该表显概括了一些传统结构设计标准。该表显示了应用于每一对封装级别的相应标准。示了应用于每一对封装级别的相应标准。 表表11-1 11-1 结构设计(或结构设计(或1 1级)标准级)标准 表表11-211-2是表是表11-111-1的扩展,其中包括了的扩展,其中包括了2 2级封装,级封装,所以五个框的内容需要去命名和描述。所以五个框的内容需要去命名和描述。 表表11-2 11-2 表表11-111-1的扩展,其中包括的扩展,其中包括2 2级封装级封装11.2.2 11.2.2 共生性共生性 在两个软件元素在两个软件元素A A和和B B之间,共生性意味着:之间,共生性意味着: (
11、1 1)在)在A A中进行了一些变化,那么为了保持全面中进行了一些变化,那么为了保持全面的正确性,就需要对的正确性,就需要对B B进行同样的改变。进行同样的改变。 (2 2)或者为了保持正确性,需要在)或者为了保持正确性,需要在A A和和B B中同时中同时进行一些变化。进行一些变化。 静态的共生性有以下几种方式静态的共生性有以下几种方式 : (1 1)类型或类的共生性)类型或类的共生性 (2 2)名称共生性)名称共生性 (3 3)常量共生性)常量共生性 (4 4)算法共生性)算法共生性 (5 5)位置共生性)位置共生性 动态共生性是一种依赖于运行代码的执行模式:动态共生性是一种依赖于运行代码的
12、执行模式:对象。动态共生性同样具有很多形式:对象。动态共生性同样具有很多形式: (1 1)执行共生性)执行共生性 (2 2)数值共生性)数值共生性 (3 3)同步共生性)同步共生性 (4 4)标识共生性)标识共生性11.2.3 11.2.3 面向对象系统中共生性的滥用面向对象系统中共生性的滥用 C+C+的友员函数的友员函数 依赖于实现的偶然性依赖于实现的偶然性 无约束的继承无约束的继承 11.2.4 11.2.4 共生性的术语共生性的术语 如果两个对象被迫合成为一个示例,那么说这如果两个对象被迫合成为一个示例,那么说这两个对象具有示例共生性。两个对象具有示例共生性。如果两个对象不得不具有相同的
13、生命期,我就如果两个对象不得不具有相同的生命期,我就说它们具有生命期共生性说它们具有生命期共生性或者被人们表述或者被人们表述为持续时间共生性。为持续时间共生性。 11.3 11.3 领域、依附集和内聚领域、依附集和内聚 本节的开始部分介绍定义类的领域。在本节的本节的开始部分介绍定义类的领域。在本节的第二部分引入依附集(第二部分引入依附集(EncumbranceEncumbrance)作为一种)作为一种定量测算一个类的完整程度的方法。最后,定定量测算一个类的完整程度的方法。最后,定义了一种定量测算一个类的方法。义了一种定量测算一个类的方法。11.3.1 11.3.1 对象类的领域对象类的领域 基
14、础领域基础领域 应用领域应用领域 商业领域商业领域 结构领域结构领域 11.3.2 11.3.2 依附集依附集 依附集简介依附集简介 (1 1)定义)定义1 1:一个类:一个类1 1的直接类引用是指的直接类引用是指1 1直接引直接引用的类。用的类。 (2 2)定义)定义2 2:如果类:如果类1 1的直接类引用集包含了类的直接类引用集包含了类A1A1、A2A2、AnAn,那么,那么,1 1的间接类引用集就是的间接类引用集就是1 1的直接类引用集和的直接类引用集和A1A1、A2A2、AnAn的间接类引的间接类引用集的并集。用集的并集。 依附集表示依附集表示 (1 1)可以用图形方法说明依附集。用一
15、个箭头)可以用图形方法说明依附集。用一个箭头来表示一种直接类引用。如图来表示一种直接类引用。如图11-111-1所示,类所示,类A A的的直接引用是直接引用是A1A1、A2A2、A3A3。因而类。因而类A A的直接依附集的直接依附集就是就是3 3。 图图11-111-1 (2 2)图)图11-211-2表示的是类表示的是类A A的间接类引用集。你会的间接类引用集。你会发现类发现类A A的间接依附集是通过计算这个图表中所的间接依附集是通过计算这个图表中所有的类而得到的,也就是说,在树状视图中所有的类而得到的,也就是说,在树状视图中所有类的总和,这些类的根节点都是有类的总和,这些类的根节点都是A
16、A并且叶子节并且叶子节点都是底部的基础类(用字母点都是底部的基础类(用字母F F等表示的,如等表示的,如F1F1)。)。 图图11-211-2依附集的使用。依附集提供了一种衡量类的复依附集的使用。依附集提供了一种衡量类的复杂程度的方法。类是处于基础领域之上有多高杂程度的方法。类是处于基础领域之上有多高的程度。因而,处于高级别领域的类具有较高的程度。因而,处于高级别领域的类具有较高的间接依附集,处于低级别的类则具有较低的的间接依附集,处于低级别的类则具有较低的间接依附集。间接依附集。DemeterDemeter规则规则 。一个。一个DemeterDemeter规则的惯用语是如规则的惯用语是如下描
17、述的:下描述的: (1 1)假设)假设A A的一个对象为的一个对象为objobj,并且假设定义对,并且假设定义对象象objobj的所有操作运算为的所有操作运算为opop,那么在执行,那么在执行opop操作操作过程中,一条消息的每一个目的地一定是下面过程中,一条消息的每一个目的地一定是下面的对象之一。的对象之一。 (2 2)对象)对象objobj本身是一个特别的例子,本身是一个特别的例子,selfself和和supersuper(在(在smalltalksmalltalk工具中),工具中),thisthis(在(在C+C+和和JavaJava语言中),或者语言中),或者CurrentCurren
18、t(在(在EiffelEiffel工具中)工具中)。 (3 3)在)在opop标记符范围内通过一个参数引用一个标记符范围内通过一个参数引用一个对象。对象。 (4 4)通过对象)通过对象objobj的一个变量来引用一个对象。的一个变量来引用一个对象。 (5 5)通过操作运算)通过操作运算obob创建的一个对象。创建的一个对象。 (6 6)通过一个全局变量引用的一个对象。)通过一个全局变量引用的一个对象。11.3.3 11.3.3 类的内聚:一个类和它的特性类的内聚:一个类和它的特性 类的内聚(类的内聚(class cohesionclass cohesion)是衡量位于一个)是衡量位于一个类外部
19、接口中的特性(属性和操作运算)间相类外部接口中的特性(属性和操作运算)间相互关联的方法。一个低级内聚的类具有一组并互关联的方法。一个低级内聚的类具有一组并不属于一个整体的特性,这些特性通过类来实不属于一个整体的特性,这些特性通过类来实现抽象类型。现抽象类型。 混合事例型内聚定义:一个混合事例型内聚的混合事例型内聚定义:一个混合事例型内聚的类具有这样的特性:对于类的对象来说这些特类具有这样的特性:对于类的对象来说这些特性是未被定义的性是未被定义的 。混合领域型内聚的定义:一个混合领域型内聚混合领域型内聚的定义:一个混合领域型内聚的类包含这样的一个元素,这个元素是一个不的类包含这样的一个元素,这个
20、元素是一个不同领域的非本征类的直接依附集。同领域的非本征类的直接依附集。 混合角色型内聚的定义:一个具有混合角色型混合角色型内聚的定义:一个具有混合角色型的类的类A A包含了这样一个元素,这个元素直接依附包含了这样一个元素,这个元素直接依附集于与集于与A A同一领域的类的一个非本征类。同一领域的类的一个非本征类。 11.4 11.4 继承与多态性的危险性继承与多态性的危险性 在面向对象的初学者看来,他们必须抓住每一在面向对象的初学者看来,他们必须抓住每一个可能的机会采用继承进行设计,以此显示他个可能的机会采用继承进行设计,以此显示他们已经们已经“进入进入”了面向对象的领域。其结果却是:了面向对
21、象的领域。其结果却是:这种本末倒置以适应这种本末倒置以适应“继承设计继承设计”的发展趋势,的发展趋势,致使一些设计方案到了根本无法实现的地步。致使一些设计方案到了根本无法实现的地步。 11.4.1 11.4.1 继承的滥用继承的滥用 许多人由于是第一次采用面向对象的设计方法,许多人由于是第一次采用面向对象的设计方法,造成了一些违背常规的设计方案。这些方案的造成了一些违背常规的设计方案。这些方案的编码既晦涩难懂又令人生厌,有些甚至引起争编码既晦涩难懂又令人生厌,有些甚至引起争论,其后果是导致了项目组的解散。这些设计论,其后果是导致了项目组的解散。这些设计方案刚开始毫无节制地滥用继承,后来发展成方
22、案刚开始毫无节制地滥用继承,后来发展成为晦涩难懂、莫名其妙的使用。为晦涩难懂、莫名其妙的使用。 11.4.2 11.4.2 错误的聚集错误的聚集 图图11-311-3的继承结构图给出了类的继承结构图给出了类AirplaneAirplane及其四及其四个假定的子类:个假定的子类:WingWing、TailTail、EngineEngine及及FuselageFuselage。该。该“设计设计”可能根本无法用代码表示可能根本无法用代码表示出来,因为没有任何切合实际的方法可用来设出来,因为没有任何切合实际的方法可用来设计其子类以满足应用的需要。计其子类以满足应用的需要。图图11-311-311.4.
23、3 11.4.3 倒置的层次结构倒置的层次结构 图图11-411-4所示的关于继承的例子对应于一个普通所示的关于继承的例子对应于一个普通的组织结构图,该结构图表达的实际意义是:的组织结构图,该结构图表达的实际意义是:“雇员是某种经理,而经理是某种董事会成员。雇员是某种经理,而经理是某种董事会成员。”但真实情况与其正好相反,即但真实情况与其正好相反,即“董事会成员是某董事会成员是某种经理,而经理又是某种雇员种经理,而经理又是某种雇员”。图图11-411-411.4.4 11.4.4 混淆类及其实例混淆类及其实例 图图11-511-5给出的多重继承例子更是令人难以捉摸。给出的多重继承例子更是令人难
24、以捉摸。图图11-611-6给出了应该怎样设计以表述某些物种是给出了应该怎样设计以表述某些物种是濒临灭绝的这一事实的答案。濒临灭绝的这一事实的答案。图图11-511-5图图11-611-611.4.5 11.4.5 误用误用这又是一个真实的应用设计,需要考虑的是房这又是一个真实的应用设计,需要考虑的是房间的长度、宽度及高度。假定房间均应视作长间的长度、宽度及高度。假定房间均应视作长方体,还需知道每个房间的空间大小。由于类方体,还需知道每个房间的空间大小。由于类库中已经有了库中已经有了CuboidCuboid类,因此设计了一个类类,因此设计了一个类RoomRoom,该类简单地继承了,该类简单地继
25、承了CuboidCuboid,如图,如图11-711-7所所示。示。图图11-711-7问题出在问题出在RoomRoom从从CuboidCuboid继承的行为上,该行为继承的行为上,该行为来源于来源于CuboidCuboid的操作,如的操作,如stretchstretch、rotaterotate等,等,由于该行为对于由于该行为对于RoomRoom不合法,则必须在不合法,则必须在RoomRoom中中覆盖该行为覆盖该行为即将其取消。即将其取消。 11.4.6 11.4.6 多态性的危险性多态性的危险性 在一个并不完善的设计方案中,多态性可能带在一个并不完善的设计方案中,多态性可能带来危险,即某个
26、对象可能会收到一条无法理解来危险,即某个对象可能会收到一条无法理解的消息并因此引起致命的运行异常事件发生。的消息并因此引起致命的运行异常事件发生。 操作的多态性。操作操作的多态性。操作opop的多态区(的多态区(scope of scope of polymorphismpolymorphism)是其中定义了)是其中定义了opop操作的类的集操作的类的集合,构成继承层次结构图的一个分支的多态区合,构成继承层次结构图的一个分支的多态区(SOPSOP)即类即类A A及其所有子类及其所有子类称作多态称作多态锥(锥(cone of polymorphismcone of polymorphism),其
27、中),其中A A称作多态称作多态锥顶点(锥顶点(apex of polymorphismapex of polymorphism)。图)。图11-811-8描描述了一个类继承树。述了一个类继承树。图图11-811-8变量的多态性。变量的多态性指在不同的时间变量的多态性。变量的多态性指在不同的时间它可以指向不同类的对象。变量它可以指向不同类的对象。变量V V的多态区是的多态区是V V(在(在V V的整个生命周期内)指向的对象所属类的整个生命周期内)指向的对象所属类的集合。的集合。消息中的多态性。消息由指向目标对象的变量消息中的多态性。消息由指向目标对象的变量及表示要调用操作的名称组成。要在操作中
28、安及表示要调用操作的名称组成。要在操作中安全使用多态性,则指向目标对象的变量全使用多态性,则指向目标对象的变量SOPSOP必须必须落在消息中定义的操作落在消息中定义的操作SOPSOP中。中。如图如图11-911-9所示。这个例子代表了一种糟糕的、所示。这个例子代表了一种糟糕的、缺乏健壮性的设计。缺乏健壮性的设计。targobjtargobj在运行时很可能指在运行时很可能指向某个对象,而该对象所属的类中并未定义向某个对象,而该对象所属的类中并未定义targoptargop操作,如果碰到这种情况,程序很可能操作,如果碰到这种情况,程序很可能会崩溃,产生运行时错误。会崩溃,产生运行时错误。 图图11
29、-911-911.5 11.5 状态空间和行为状态空间和行为 本节首先介绍类的两个基本属性:状态空间和本节首先介绍类的两个基本属性:状态空间和行为,然后讨论有关子类的状态空间并且对子行为,然后讨论有关子类的状态空间并且对子类的行为进行分析,接着介绍类的不变式,最类的行为进行分析,接着介绍类的不变式,最后探讨操作运算的前置条件和后置条件后探讨操作运算的前置条件和后置条件 。11.5.1 11.5.1 一个类的状态空间和行为一个类的状态空间和行为抽象性(抽象性(abstractionabstraction)含义是指在软件对象中)含义是指在软件对象中不必考虑到真实世界中事物所表现出来的每一不必考虑到
30、真实世界中事物所表现出来的每一种可能特性。种可能特性。一致(一致(uniformuniform)含义是指选取一个类的抽象性)含义是指选取一个类的抽象性之后,将这种抽象性以相同的方式应用于属于之后,将这种抽象性以相同的方式应用于属于这个类范围之内的每一个对象。这个类范围之内的每一个对象。性质(性质(propertiesproperties)的含义是指类有两个性质)的含义是指类有两个性质即它的状态空间和它所允许的行为。即它的状态空间和它所允许的行为。状态空间的定义:一个类状态空间的定义:一个类C C的状态空间是指属于的状态空间是指属于类类C C的任何对象的允许状态的全部集合,一种状的任何对象的允许
31、状态的全部集合,一种状态空间的大小等同于一个给定对象的指定状态。态空间的大小等同于一个给定对象的指定状态。可以利用处于网格中的多个点来描绘一个类的可以利用处于网格中的多个点来描绘一个类的状态空间,每个点代表着一个状态。每个对象状态空间,每个点代表着一个状态。每个对象即类的一个实例就像一个小圆点,这个小圆点即类的一个实例就像一个小圆点,这个小圆点在它的类状态空间所允许的范围内,在它整个在它的类状态空间所允许的范围内,在它整个生命周期中从一个状态到另一个状态。生命周期中从一个状态到另一个状态。 一个类状态空间的维数概略地等于这个类中定一个类状态空间的维数概略地等于这个类中定义的属性数目。因为部分属
32、性是从其他一些不义的属性数目。因为部分属性是从其他一些不能够被认为是标准状态空间维的属性中演化而能够被认为是标准状态空间维的属性中演化而来的。所以,只能说是来的。所以,只能说是“概略地概略地”等于。等于。11.5.2 11.5.2 子类的状态空间子类的状态空间 如果如果B B是是A A的一个子类,那么的一个子类,那么B B是状态空间必须至是状态空间必须至少包含少包含A A的状态空间的维数的状态空间的维数也可以包含更多也可以包含更多的维数。如果的维数。如果B B的状态空间包含更多维数,那么的状态空间包含更多维数,那么就说就说B B的状态空间是从的状态空间是从A A的状态空间扩展而来的。的状态空间
33、扩展而来的。 11.5.3 11.5.3 子类的行为子类的行为 在一个子类中行为是得到了扩展(或限制)。在一个子类中行为是得到了扩展(或限制)。下面探讨一下扩展的问题,下面探讨一下扩展的问题,B B(子类)所拥有的(子类)所拥有的行为却是行为却是A A(父类)所缺少的。很明显在子类(父类)所缺少的。很明显在子类B B中这样的额外行为是肯定存在的。这说明中这样的额外行为是肯定存在的。这说明B B的状的状态空间是从态空间是从A A的状态空间扩展而来的。的状态空间扩展而来的。 11.5.4 11.5.4 状态空间的一个约束条件:类的不变式状态空间的一个约束条件:类的不变式 一个类的合理状态空间是通过
34、它的类不变式来一个类的合理状态空间是通过它的类不变式来定义的。一个类的不变式是指一种状态,即在定义的。一个类的不变式是指一种状态,即在任何时候该类的每一个对象都满足条件(当这任何时候该类的每一个对象都满足条件(当这个对象处于平衡状态时)。个对象处于平衡状态时)。 下面举一个有关三角形类下面举一个有关三角形类TriangleTriangle的例子。图的例子。图11-1011-10表示了各种类型三角形的一种层次关系。表示了各种类型三角形的一种层次关系。 图图11-1011-1011.5.5 11.5.5 前置条件和后置条件前置条件和后置条件 如果某操作运算开始执行之前该条件必须是正如果某操作运算开
35、始执行之前该条件必须是正确的,若不正确,那么该操作运算就有可能拒确的,若不正确,那么该操作运算就有可能拒绝执行,并且可能产生一些异常情况,则它是绝执行,并且可能产生一些异常情况,则它是前置条件。前置条件。 如果操作运算执行结束时该条件必须是正确的,如果操作运算执行结束时该条件必须是正确的,若不正确,那么操作运算的执行是不完全的,若不正确,那么操作运算的执行是不完全的,并且一定是经过调整的,则此条件为后置条件。并且一定是经过调整的,则此条件为后置条件。一些人将一个操作运算的前置条件和后置条件一些人将一个操作运算的前置条件和后置条件描述为:在一个操作运算和发送给这个操作运描述为:在一个操作运算和发
36、送给这个操作运算消息的客户之间的一种契约关系。这种描述算消息的客户之间的一种契约关系。这种描述暗示着:暗示着: (1 1)如果消息的发送者不能保证前置条件的正)如果消息的发送者不能保证前置条件的正确性,那么整个操作就会停止。确性,那么整个操作就会停止。 (2 2)如果消息的发送者能够保证具有正确的前)如果消息的发送者能够保证具有正确的前置条件,那么操作运算的目标将保证在执行之置条件,那么操作运算的目标将保证在执行之后的后置条件是正确的。后的后置条件是正确的。 11.5.6 11.5.6 类接口中支持的状态类接口中支持的状态 非法状态非法状态不完整状态不完整状态不适当的状态不适当的状态理想状态理想状态11.5.7 11.5.7 类接口中支持的行为类接口中支持的行为 非法行为非法行为危险行为危险行为无关行为无关行为 不完整行为不完整行为 难处理行为难处理行为重复行为重复行为理想行为理想行为 11.5.8 11.5.8 类接口中操作的聚合类接口中操作的聚合 选择聚合选择聚合多种聚合多种聚合功能聚合功能聚合