OOAD - 功能建模

功能建模给出了面向对象分析模型的过程视角以及系统应该做什么的概述。 它借助数据流图(DFD)定义系统内部过程的功能。 它描述了数据值的函数推导,但没有说明它们在计算时是如何推导的,或者为什么需要计算它们。

数据过程图

功能建模通过 DFD 层次结构来表示。 DFD 是系统的图形表示,显示系统的输入、输入的处理、系统的输出以及内部数据存储。 DFD 说明了在对象或系统上执行的一系列转换或计算,以及影响转换的外部控件和对象。

Rumbaugh 等人。 将 DFD 定义为:"数据流图是一个图表,显示数据值从对象中的源通过将数据值转换到其他对象上的目的地的过程的流动。"

DFD 的四个主要部分是 −

  • 过程,
  • 数据流,
  • 参与者,以及
  • 数据存储。

DFD 的其他部分是 −

  • 约束条件,以及
  • 控制过程。

DFD 的功能

过程

过程是转换数据值的计算活动。 整个系统可以可视化为一个高级过程。 一个进程可以进一步分为更小的组件。 最底层的过程可能是一个简单的函数。

DFD 中的表示 − 过程被表示为一个椭圆,其名称写在椭圆内,并包含固定数量的输入和输出数据值。

示例 − 下图显示了一个过程Compute_HCF_LCM,它接受两个整数作为输入并输出它们的HCF(最大公因数)和LCM(最小公倍数)。

DFD 计算 HCM 和 LCM

数据流

数据流表示两个进程之间的数据流。 它可以位于参与者和进程之间,或者数据存储和进程之间。 数据流表示数据项在计算的某个时刻的值。 该值不会因数据流而改变。

DFD 中的表示 − 数据流由有向弧或箭头表示,并标有其所承载的数据项的名称。

上图中,Integer_a和Integer_b代表进程的输入数据流,而L.C.M. 和 H.C.F. 是输出数据流。

在以下情况下数据流可能会分叉 −

  • 输出值被发送到几个地方,如下图所示。 此处,输出箭头未标记,因为它们表示相同的值。

  • 数据流包含一个聚合值,每个组件被发送到不同的地方,如下图所示。 在这里,每个分叉组件都被标记。

分叉数据流

参与者

参与者是通过生成数据并将其输入到系统或消耗系统生成的数据来与系统交互的活动对象。 换句话说,参与者充当数据的源头和汇点。

DFD 中的表示 − 参与者由一个矩形表示。 Actor 连接到输入和输出,位于 DFD 的边界上。

示例 − 下图展示了柜台销售系统中的参与者,即 Customer 和 Sales_Clerk。

DFD 中的参与者

数据存储

数据存储是充当数据存储库的被动对象。 与参与者不同,他们无法执行任何操作。 它们用于存储数据和检索存储的数据。 它们代表数据结构、磁盘文件或数据库中的表。

DFD 中的表示 − 数据存储由包含数据存储名称的两条平行线表示。 每个数据存储都连接到至少一个进程。 输入箭头包含修改数据存储内容的信息,而输出箭头包含从数据存储检索的信息。 当要检索部分信息时,输出箭头被标记。 未标记的箭头表示完整的数据检索。 双向箭头意味着检索和更新。

示例 − 下图显示了一个数据存储 Sales_Record,它存储所有销售的详细信息。 数据存储的输入包括销售详细信息,例如商品、账单金额、日期等。为了查找平均销售额,该过程会检索销售记录并计算平均值。

DFD 中的数据存储

约束

约束指定随着时间的推移需要满足的条件或限制。 它们允许添加新规则或修改现有规则。 约束可以出现在面向对象分析的所有三种模型中。

  • 在对象建模中,约束定义了对象之间的关系。 它们还可以定义对象在不同时间可能采用的不同值之间的关系。

  • 在动态建模中,约束定义了不同对象的状态和事件之间的关系。

  • 在功能建模中,约束定义了对转换和计算的限制。

表示 − 约束呈现为大括号内的字符串。

示例 − 下图显示了DFD的一部分,用于计算某公司员工的工资,该公司决定对销售部门的所有员工进行激励,并增加人力资源部门的所有员工的工资。 可以看出,约束{Dept:Sales}导致仅当部门是销售时才计算激励,约束{Dept:HR}导致仅当部门是HR时才计算增量。

DFD 中的约束

控制过程

一个进程可能与某个布尔值相关联,并且仅当该值为 true 时才进行评估,尽管它不是进程的直接输入。 这些布尔值称为控制流。

DFD 中的表示 − 控制流用虚线弧表示,从产生布尔值的过程到受其控制的过程。

示例 − 下图表示算术除法的 DFD。 测试除数是否非零。 如果不为零,则控制流 OK 的值为 True,随后除法过程会计算商和余数。

DFD 中的控制流

开发系统的 DFD 模型

为了开发系统的 DFD 模型,构建了 DFD 层次结构。 顶层 DFD 由单个进程和与之交互的参与者组成。

在每个连续的较低级别中,都会逐渐包含更多详细信息。 将过程分解为子过程,识别子过程之间的数据流,确定控制流,并定义数据存储。 在分解过程时,进出过程的数据流应与DFD下一级的数据流相匹配。

示例 − 让我们考虑一个软件系统,批发商软件,它可以自动化批发商店的交易。 该商店批量销售,客户群包括商人和零售店老板。 每个客户都被要求注册他/她的详细信息,并获得一个唯一的客户代码 C_Code。 销售完成后,商店会登记其详细信息并将货物发送出去。 每年,商店都会向顾客分发圣诞礼物,根据总销售额和店主的决定,礼物包括银币或金币。

批发软件的功能模型如下。 下图显示了顶层 DFD。 它将软件显示为单个进程以及与其交互的参与者。

系统中的参与者是 −

  • 客户
  • 销售人员
  • 业主
批发商店 DFD

在下一级DFD中,如下图所示,识别系统的主要过程,定义数据存储以及过程与参与者的交互,并建立数据存储。

系统中可以识别出三个进程,分别是 −

  • 注册客户
  • 过程销售
  • 确定礼物

所需的数据存储是 −

  • 客户详细信息
  • 销售详情
  • 礼物详情
批发软件的 DFD

下图显示了注册客户过程的详细信息。 其中包含三个过程,验证详细信息、生成 C_Code 和更新客户详细信息。 输入客户的详细信息后,系统会对其进行验证。 如果数据正确,则会生成 C_Code 并更新数据存储客户详细信息。

客户过程的 DFD

下图显示了 Ascertain Gifts 过程的扩展。 它有两个过程,查找总销售额和决定礼品币类型。 查找总销售额过程计算每个客户对应的年度总销售额并记录数据。 以该记录和所有者的决定作为输入,通过"确定礼品币类型"过程来分配礼品币。

礼品过程 DFD

DFD的优点和缺点

优点 缺点
DFD 描绘了系统的边界,因此有助于描绘外部对象与系统内过程之间的关系。 DFD 需要很长时间才能创建,这在实际用途中可能不可行。
它们帮助用户了解系统。 DFD 不提供有关时间相关行为的任何信息,即它们不指定转换何时完成。
图形表示作为程序员开发系统的蓝图。 它们没有说明计算频率或计算原因。
DFD 提供有关系统进程的详细信息。 DFD 的制备是一个复杂的过程,需要大量的专业知识。 而且,对于非技术人员来说很难理解。
它们用作系统文档的一部分。 准备方法是主观的,并且存在很大的不精确性。

对象、动态和功能模型之间的关系

对象模型、动态模型和功能模型相互补充,以实现完整的面向对象分析。

  • 对象建模根据对象开发软件系统的静态结构。 因此,它显示了系统的"执行者"。

  • 动态建模开发对象响应外部事件的时间行为。 它显示了对对象执行的操作的顺序。

  • 功能模型概述了系统应该做什么。

功能模型和对象模型

就对象模型而言,功能模型的四个主要部分是 −

  • 过程 − 过程隐含着需要实现的对象的方法。

  • 参与者 − 参与者是对象模型中的对象。

  • 数据存储 − 这些要么是对象模型中的对象,要么是对象的属性。

  • 数据流 − 流入或流出参与者的数据代表对象上或对象上的操作。 流入或流出数据存储的数据代表查询或更新。

功能模型和动态模型

动态模型说明操作何时执行,而功能模型说明操作如何执行以及需要哪些参数。 由于参与者是活动对象,动态模型必须指定它何时起作用。 数据存储是被动对象,它们仅响应更新和查询; 因此动态模型不需要指定它们何时起作用。

对象模型和动态模型

动态模型显示了对象的状态以及事件发生时所执行的操作以及随后的状态变化。 由于更改而导致的对象状态显示在对象模型中。