指南:实施类
该指南描述了如何使用 RAD6.0 建模环境实施类。
关系
相关元素
主要描述

实施操作

要实施操作,请执行以下操作:

  • 选择算法。
  • 选择适用于算法的数据结构。
  • 在必要时定义新的类和操作。
  • 为操作编写代码。
选择算法

许多操作很简单,可以从操作及其规范中实施。

需要重要的算法,主要基于两个原因:实施给定规范的复杂操作和优化将简单但低效的算法用作定义的操作。

选择适用于算法的数据结构

选择算法包括选择使用的数据结构。许多实施数据结构是容器类,如数组、列表、队列、堆栈、集合、包和它们的变体。大多数面向对象的语言和编程环境提供具有这些种类的可重用组件的类库。

在必要时定义新的类和操作

例如,可找到新的类来保存中间结果。可以在类上添加新的低级操作来分解复杂操作。这些操作通常是类私有的,即在类的外部不可见。

为操作编写代码

为操作编写代码,从接口语句开始。遵循适用的编程指南。

实施状态

对象的状态可通过引用它的属性值来实施,在表示上没什么特别之处。 此类对象的状态转移在不断变化的属性值中将是隐含的,并且通过条件语句对可变行为编程。此解决方法对于复杂行为不适合,因为前者通常会带来复杂结构,当添加更多状态或行为变化时,这些结构会很难改变。

如果设计元素(或它的组成部分)的行为是依赖状态的,那么通常情况下将存在一个或多个状态表图,这些图描述设计元素中模型元素的行为。这些状态表图用作实施期间的重要输入。

状态表图中显示的状态机使对象的状态显而易见,并清晰地描绘了状态转移和所需行为。状态机可按以下方法实施:

  • 简单的状态机可通过定义属性(该属性枚举可能状态)并使用该属性选择入局消息的行为来实施。例如 Java 或 C++ 中的 switch 语句。此解决方法对于复杂的状态机不能很好调整,并会导致较差的运行时性能。有关此方法的示例,请参阅 [DOUG98],第 4 章 4.4.3
  • 更复杂的状态机可能要使用“状态”模式。有关状态模式的描述,请参阅 [GAM94]。[DOUG98],第 6 章 6.2.3 状态模式也描述了此方法
  • 表驱动方法对于非常复杂的状态机运行良好,在这些复杂的状态机中,易于更改是一个条件。在此方法中,对于每一种状态,表中都存在条目,表中每个条目将输入映射到后续状态和关联的转移操作。关于此方法的示例,请参阅 [DOUG98],第 6 章 6.2.3 状态表模式

可通过将状态管理委托给活动对象(一个对象对应一个并发子状态)来实施具有并发子状态的状态机,因为并发子状态表示独立的计算(不过各个计算之间可以交互)。可使用上述技术之一管理每个子状态。

使用委托来复用实施

如果可通过复用现有类来实施类或类的各部分,则使用委托,而不使用继承。

委托意味着依靠其他类的帮助来实施类。该类通过使用变量来引用其他类的对象。当调用操作时,操作调用引用的(复用类的)对象中的操作,用于实际执行。这样,它将职责委托给其他类。

实施关联

单向关联是用指针实施的 - 一个包含对象引用的属性。如果多重性是,则它作为一个简单的指针实施。如果多重性是,则它是指针的集合。如果端是有序的,则可使用列表来代替集合。

双向关联是使用单向关联的技术、作为两个方向的属性实施的。

限定关联作为符合条件的对象中的查找表实施(例如,Smalltalk 字典类)。查找表中的选择器值是限定符,而目标值是其他类的对象。

如果限定符值必须按顺序访问,则可将限定符排列在有序数组或树中。 在这种情况下,访问时间将与 log N 成比例,其中 N 是限定符的值的个数。

如果限定符是从压缩的有限集合中提取的,则限定符值可映射到整数范围,并且关联可作为数组高效地实施。如果关联几乎填满而不是稀疏地填充,则此方法更具吸引力,并且对于完全填满的有限集合非常理想。

大多数面向对象的语言和编程环境提供具有可重用组件的类库来实施不同种类的关联。

实施属性

用三种方法之一实施属性:使用内置基本类型,使用现有类或定义新的类。 定义新的类通常更灵活,但会引入不必要的间接性。例如,员工的社会保障号可以作为类型为字符串的属性或新的类实施。

备选属性实施图示

属性的备选实施。

可能也有这样的情况,将各组属性组合到新的类中,如以下示例所示。两种实施都是正确的。

点类行实施属性

“行”中的属性作为与“点”类的关联来实施