- 面向对象分析与设计 教程
- 面向对象分析与设计 - 首页
- 面向对象分析与设计 - 面向对象范式
- 面向对象分析与设计 - 面向对象模型
- 面向对象分析与设计 - 面向对象系统
- 面向对象分析与设计 - 面向对象原则
- 面向对象分析与设计 - 面向对象分析
- 面向对象分析与设计 - 动态建模
- 面向对象分析与设计 - 功能建模
- 面向对象分析与设计 - UML分析模型
- 面向对象分析与设计 - UML基本符号
- 面向对象分析与设计 - UML结构图
- 面向对象分析与设计 - UML行为图
- 面向对象分析与设计 - 面向对象设计
- 面向对象分析与设计 - 实现策略
- 面向对象分析与设计 - 测试与质量保证
- 面向对象分析与设计 有用资源
- 面向对象分析与设计 - 快速指南
- 面向对象分析与设计 - 有用资源
面向对象分析与设计 - 功能建模
功能建模提供了面向对象分析模型的过程视角,以及对系统应该做什么的概述。它借助数据流图 (DFD) 定义了系统内部过程的功能。它描述了数据值的函数推导,而没有说明它们在计算时是如何推导出来的,或者为什么需要计算它们。
数据流图
功能建模通过 DFD 的层次结构来表示。DFD 是一个系统的图形表示,它显示了系统的输入、对输入的处理、系统的输出以及内部数据存储。DFD 说明了对对象或系统执行的一系列转换或计算,以及影响转换的外部控制和对象。
Rumbaugh 等人将 DFD 定义为:“数据流图是一个图形,它显示数据值从对象中的源流向转换它们的进程,再到其他对象上的目标。”
DFD 的四个主要部分是:
- 进程,
- 数据流,
- 参与者,以及
- 数据存储。
DFD 的其他部分是:
- 约束,以及
- 控制流。
DFD 的特征
进程
进程是转换数据值的计算活动。整个系统可以被视为一个高级别进程。一个进程可以进一步分解成更小的组件。最低级别的进程可能是一个简单的函数。
DFD 中的表示 - 进程表示为一个椭圆形,其名称写在其中,并包含固定数量的输入和输出数据值。
示例 - 下图显示了一个名为 Compute_HCF_LCM 的进程,它接受两个整数作为输入,并输出它们的 HCF(最大公约数)和 LCM(最小公倍数)。
数据流
数据流表示两个进程之间的数据流动。它可能存在于参与者和进程之间,或者数据存储和进程之间。数据流表示数据项在计算的某个点上的值。此值不会因数据流而改变。
DFD 中的表示 - 数据流由带方向的弧或箭头表示,并用其携带的数据项的名称进行标记。
在上图中,Integer_a 和 Integer_b 表示到进程的输入数据流,而 L.C.M. 和 H.C.F. 是输出数据流。
数据流可能在以下情况下被分叉:
输出值被发送到多个位置,如下图所示。此处,输出箭头未标记,因为它们表示相同的值。
数据流包含聚合值,并且每个组件都被发送到不同的位置,如下图所示。此处,每个分叉的组件都已标记。
参与者
参与者是主动对象,通过产生数据并将其输入到系统或使用系统产生的数据来与系统交互。换句话说,参与者充当数据源和数据汇。
DFD 中的表示 - 参与者用矩形表示。参与者连接到输入和输出,并位于 DFD 的边界上。
示例 - 下图显示了柜台销售系统中的参与者,即客户和销售员。
数据存储
数据存储是被动对象,充当数据的存储库。与参与者不同,它们不能执行任何操作。它们用于存储数据并检索存储的数据。它们表示数据库中的数据结构、磁盘文件或表。
DFD 中的表示 - 数据存储用包含数据存储名称的两条平行线表示。每个数据存储至少连接到一个进程。输入箭头包含修改数据存储内容的信息,而输出箭头包含从数据存储检索的信息。当要检索部分信息时,输出箭头将被标记。未标记的箭头表示完全数据检索。双向箭头表示检索和更新。
示例 - 下图显示了一个数据存储 Sales_Record,它存储所有销售的详细信息。对数据存储的输入包括销售的详细信息,例如商品、计费金额、日期等。要查找平均销售额,该过程检索销售记录并计算平均值。
约束
约束指定需要随时间满足的条件或限制。它们允许添加新规则或修改现有规则。约束可以出现在面向对象分析的所有三个模型中。
在对象建模中,约束定义对象之间的关系。它们还可以定义对象在不同时间可能采用的不同值之间的关系。
在动态建模中,约束定义不同对象的状态和事件之间的关系。
在功能建模中,约束定义对转换和计算的限制。
表示 - 约束以花括号内的字符串形式呈现。
示例 - 下图显示了计算公司员工工资的 DFD 的一部分,该公司已决定向销售部门的所有员工提供奖励,并增加人力资源部门所有员工的工资。可以看出,约束 {Dept:Sales} 导致仅当部门为销售时才计算奖励,而约束 {Dept:HR} 导致仅当部门为人力资源时才计算加薪。
控制流
一个进程可能与某个布尔值相关联,并且仅当该值为真时才进行评估,尽管它不是进程的直接输入。这些布尔值称为控制流。
DFD 中的表示 - 控制流由从产生布尔值的进程到受其控制的进程的虚线弧表示。
示例 - 下图表示算术除法的 DFD。测试除数是否为非零。如果它不为零,则控制流 OK 的值为 True,随后 Divide 进程计算商和余数。
开发系统的 DFD 模型
为了开发系统的 DFD 模型,构建了 DFD 的层次结构。顶级 DFD 包含单个进程以及与其交互的参与者。
在每个后续的较低级别,逐渐包含更多详细信息。一个进程被分解成子进程,识别子进程之间的数据流,确定控制流并定义数据存储。在分解进程时,进程的输入或输出数据流应与 DFD 的下一级别的输入或输出数据流匹配。
示例 - 让我们考虑一个软件系统,批发商软件,它使批发商店的交易自动化。该商店批量销售,客户包括商人、零售店店主。每个客户都被要求注册其个人信息,并被分配一个唯一的客户代码 C_Code。一旦销售完成,商店就会注册其详细信息并发送货物进行发货。每年,商店都会向其客户分发圣诞礼物,根据总销售额和店主决定,礼物包括银币或金币。
批发软件的功能模型如下所示。下图显示了顶级 DFD。它将软件显示为单个进程以及与其交互的参与者。
系统中的参与者是:
- 客户
- 销售人员
- 店主
在下一级 DFD 中,如下图所示,识别了系统的主要进程,定义了数据存储,并建立了进程与参与者和数据存储的交互。
在系统中,可以识别三个进程,它们是:
- 注册客户
- 处理销售
- 确定礼物
需要的数据存储是:
- 客户详细信息
- 销售详细信息
- 礼物详细信息
下图显示了“注册客户”进程的详细信息。其中有三个进程:验证详细信息、生成 C_Code 和更新客户详细信息。当输入客户的详细信息时,会对其进行验证。如果数据正确,则生成 C_Code 并更新数据存储“客户详细信息”。
下图显示了“确定礼物”进程的扩展。它有两个进程:查找总销售额和决定礼物硬币类型。查找总销售额进程计算每个客户的年度总销售额并记录数据。以该记录和店主决定作为输入,通过“决定礼物硬币类型”进程分配礼物硬币。
DFD 的优缺点
优点 | 缺点 |
---|---|
DFD 描述了系统的边界,因此有助于描绘外部对象与系统内部进程之间的关系。 | 创建 DFD 需要很长时间,这对于实际目的来说可能不可行。 |
它们帮助用户了解系统。 | DFD 没有提供任何关于时间相关行为的信息,即它们没有指定何时执行转换。 |
图形表示用作程序员开发系统的蓝图。 | 它们没有阐明计算的频率或计算的原因。 |
DFD 提供了有关系统进程的详细信息。 | DFD 的准备工作是一个复杂的过程,需要相当的专业知识。此外,对于非技术人员来说,也很难理解。 |
它们用作系统文档的一部分。 | 准备方法是主观的,并留有很大的空间不精确。 |
对象模型、动态模型和功能模型之间的关系
对象模型、动态模型和功能模型对于完整的面向对象分析是互补的。
对象建模以对象的形式开发软件系统的静态结构。因此,它显示了系统的“执行者”。
动态建模开发对象响应外部事件的时间行为。它显示了对对象执行的操作序列。
功能模型概述了系统应该做什么。
功能模型和对象模型
从对象模型的角度来看,功能模型的四个主要部分是:
进程 - 进程意味着需要实现的对象的方法。
参与者 - 参与者是对象模型中的对象。
数据存储 - 这些要么是对象模型中的对象,要么是对象的属性。
数据流 − 数据流向或来自参与者表示对对象的操作或由对象执行的操作。数据流向或来自数据存储表示查询或更新。
功能模型和动态模型
动态模型说明操作何时执行,而功能模型说明操作如何执行以及需要哪些参数。由于参与者是主动对象,因此动态模型必须指定其何时采取行动。数据存储是被动对象,它们仅响应更新和查询;因此,动态模型不需要指定它们何时采取行动。
对象模型和动态模型
动态模型显示对象的状态以及在事件发生时执行的操作以及随后的状态变化。对象模型显示了由于这些变化而导致的对象状态。