1 简介
数据流图(Data Flow Diagram,DFD)从数据传递和加工角度,以图形方式来表达系统的逻辑功能、数据在系统内部的逻辑流向和逻辑变换过程,是结构化系统分析方法的主要表达工具及用于表示软件模型的一种图示方法。
数据流图按层次结构详细程度分,通常分为3种类型:
顶层图,上下文图
中层-零层数据流图 level-0,
底层-详细数据流图 level-1
为了表达数据处理过程的数据加工情况,用1个数据流图往往是不够的。 层次结构的数据流图按照系统的层次结构进行逐步分解,并以分层的数据流图反映这种结构关系,能清楚地表达和容易理解整个系统。
中层数据流图中最高层次一般从0开始,最高层级的中层数据流图即是0层数据流图,0层数据流图主要目的是将顶层流图的系统分解为若干子系统,并决定每个子系统间的数据接口和活动关系。
2 按详细程度的三个分类
- 上下文顶层图(Context Diagram 或 顶层图)
顶层图是数据流图的最高级别,它提供了一个系统的总体视图。主要描述系统与外部实体的交互关系,展示了系统的输入和输出,但不会涉及系统内部的具体过程。
在仓库出入库管理系统中,上下文图会展示仓库系统(作为一个整体)如何与客户、供应商和管理员等外部实体交互。
上下文图示例
例如,在一个“图书管理系统”中,上下文图可能包含以下外部实体和数据流: 标记为“Library Management System”的单个进程外部实体,如“User”、“Admin”和“Library Database” “Request Book”、“Provide Book”和“Update Records”等数据流在这些实体和系统之间流动。
- 零层数据流图(Level-0 DFD 或 中层级)
零层数据流图是系统的主要功能的分解图,展示系统内部的主要处理过程,以及数据在这些过程之间流动的方式。它进一步细化了上下文图,但仍然保持整体层次。
零层 DFD示例
继续图书馆 Library Management System 示例:
“Check Book Availability”、“Issue Book”、“Return Book”和“Update Inventory”等流程 数据存储,例如“书籍清单”和“用户记录” 这些流程和实体之间的数据流显示了如何通过不同步骤处理“Book Request”。
对于图书馆管理系统中的“Issue Book”流程:
它可能包括“验证用户成员资格”、“检查簿条件”和“记录问题事务”等子流程 这些子流程中的每一个都有自己的数据流,连接到特定的数据存储或实体, 例如“User Data Store”和“Book Condition Log”。
- 详细数据流图(Level-1 DFD 或 底层级)
详细数据流图是对零层数据流图中每个主要处理过程的进一步细化,展示更详细的处理过程和数据流动。这种图适用于复杂系统,每个模块可能需要多层级数据流图才能展示清楚。
详细的数据流图示例1
对于图书馆管理系统中的“Issue Book”流程:
它可能包括“验证用户成员资格”、“检查簿条件”和“记录问题事务”等子流程
这些子流程中的每一个都有自己的数据流,连接到特定的数据存储或实体,例如“User Data Store”和“Book Condition Log”。
详细数据流图有助于开发者理解每个模块的处理流程。
3 利用0层数据流图实现的仓管系统
在仓库出入库管理系统中,详细数据流图会进一步细化“库存管理”、“订单处理”等过程,比如在“库存管理”中可能会有“库存更新”、“库存查询”等子过程。
仓库出入库管理系统示例,比如我们可以通过一个简单的仓库出入库管理系统示例,用编程语言来实现。这个系统主要功能包括商品的入库和出库,以及查询当前库存。
顶层数据流图:将系统功能分解为“入库管理”、“出库管理”、“库存查询”等模块。
零层数据流图设计,在仓库出入库管理系统中,零层数据流图会分解出具体的子系统,比如“库存管理”、“订单处理”、“入库”、“出库”等主要模块。
描述:级别 0 DFD 通过将单个流程分解为其主要子流程来扩展上下文图。此图提供了有关系统内内部数据流的更多详细信息。
目的:显示系统内的主要子进程以及它们如何相互关联.
+----------+ +------+ +-----------------+ +-----------------+ +-----------------+
| | | | | | | | |
| 商品大类 | ---> | 供应商| +-----> | 采购入库处理 +-------> | 仓库 | +------>| 库存管理 |
| | | | | | | | |
+----------+ +------+ +-----------------+ +-----------------+ +-----------------+
|
|
|
v
+------------------+
| |
| 库存报表 |
| |
+------------------+
|
|
+-----------------+ |
| | |
| 仓库出库 |<---------------
| |
+-----------------+
|
|
+-----------------+ |
| | |
| 零售出库 +----------+
| |
+-----------------+
代码go实现如下:
其中Warehouse 结构体表示仓库,包含一个 Items 字典来存储所有商品。 AddStock 方法用于添加库存,实现入库功能。若商品已存在,则增加其数量;否则添加新的商品。 RemoveStock 方法用于减少库存,实现出库功能。若商品数量不足,提示库存不足。 CheckStock 方法用于查询某一商品的库存量。
main 函数中演示了入库、出库和库存查询的操作。
// 商品结构体,表示仓库中的每种商品
type Item struct {
ID string
Name string
Quantity int
}
// 仓库结构体,包含所有商品
type Warehouse struct {
Items map[string]Item
}
// 初始化仓库
func NewWarehouse() *Warehouse {
return &Warehouse{Items: make(map[string]Item)}
}
// 入库函数
func (w *Warehouse) AddStock(itemID, name string, quantity int) {
if item, exists := w.Items[itemID]; exists {
item.Quantity += quantity
w.Items[itemID] = item
} else {
w.Items[itemID] = Item{ID: itemID, Name: name, Quantity: quantity}
}
fmt.Printf("Added %d units of %s to the warehouse.\n", quantity, name)
}
// 出库函数
func (w *Warehouse) RemoveStock(itemID string, quantity int) {
if item, exists := w.Items[itemID]; exists {
if item.Quantity >= quantity {
item.Quantity -= quantity
w.Items[itemID] = item
fmt.Printf("Removed %d units of %s from the warehouse.\n", quantity, item.Name)
} else {
fmt.Printf("Not enough %s in stock to remove %d units.\n", item.Name, quantity)
}
} else {
fmt.Printf("Item %s not found in warehouse.\n", itemID)
}
}
// 查询库存函数
func (w *Warehouse) CheckStock(itemID string) {
if item, exists := w.Items[itemID]; exists {
fmt.Printf("Item: %s, Quantity in stock: %d\n", item.Name, item.Quantity)
} else {
fmt.Printf("Item %s not found in warehouse.\n", itemID)
}
}
func main() {
warehouse := NewWarehouse()
// 入库示例
warehouse.AddStock("001", "Widget", 100)
warehouse.AddStock("002", "Gadget", 200)
// 出库示例
warehouse.RemoveStock("001", 20)
// 查询库存
warehouse.CheckStock("001")
warehouse.CheckStock("002")
warehouse.CheckStock("003")
}
-
运行示例输出
Added 100 units of Widget to the warehouse. Added 200 units of Gadget to the warehouse. Removed 20 units of Widget from the warehouse. Item: Widget, Quantity in stock: 80 Item: Gadget, Quantity in stock: 200 Item 003 not found in warehouse.
4 小结
数据流图中常见的错误包括外部实体、加工、数据存储和数据流四要素方面,在数据流程图中常见两类主要错误:
- 命名错误
这是数据流的常见主要错误,集中在命名方面,数据流名称应该是数据流中传递的数据内容,不要使用处理、传递、变换相关的内容来命名数据流。
外部实体作为数据来源和数据去处,常见错误主要集中在孤立的外部实体和实体命名方面。
孤立外部实体既没有输入任何数据给系统,系统也没有为其提供任何数据,而实体命名一般采用代表人群、事物或组织名称的名词。
- 输入输出错误
加工的错误集中在加工的输入和输出,常见的错误包括有输入而没有输出的加工, 有输出而没有输入的加工,输入和输出不守恒的加。
同样的数据存储常见的错误也集中在输入和输出, 包括有输入无输出的存储, 有输出无输入的存储和输入输出不守恒的存储。