数据流(data flow)是数据在系统中传递的路径,用于描述数据从一个位置到另一个位置的流动过程。它通常出现在数据流图(DFD, Data Flow Diagram)中,表示信息如何在系统中被处理和传输。一个数据流可以包含一组具有固定结构的数据项,并且其流向可以是:
- 从外部实体(源,Source)流向加工(Process);
- 从加工流向数据存储(文件,Data Store);
- 从数据存储流向加工;
- 从一个加工流向另一个加工;
- 从加工流向外部实体(宿,Sink)。
为了增强可读性和理解性,每个数据流应具有一个有意义的名称,如“客户订单信息”或“付款凭证”。但有一个例外:当数据流完全对应于某个文件的全部内容时,例如写入文件或从文件读取,这类数据流通常不需要命名,因为其含义已经由文件本身定义,命名反而冗余。
例如,在一个订单处理系统中:
- “客户”作为源,发送“订单数据”流向“接收订单”加工;
- “接收订单”加工将“订单数据”写入“订单文件”;
- 此时从加工到“订单文件”的数据流可不命名,因为它就是文件本身的全部内容;
- 而从“接收订单”加工输出到“库存管理”加工的数据流则应命名为“待处理订单”,以明确其用途。
# 示例:模拟数据流的结构定义(非执行流程,仅示意)
class DataFlow:
def __init__(self, name, source, target, content):
self.name = name # 数据流名称(可选)
self.source = source # 源节点(加工、外部实体、文件)
self.target = target # 目标节点
self.content = content # 数据组成
def describe(self):
if self.name:
return f"数据流 '{self.name}': {self.source} → {self.target}, 内容: {self.content}"
else:
return f"匿名数据流: {self.source} → {self.target}, 内容: {self.content}"
# 使用示例
flow1 = DataFlow("客户订单", "客户", "接收订单", ["订单号", "商品列表", "金额"])
flow2 = DataFlow(None, "更新库存", "库存文件", ["商品ID", "新库存量"]) # 不必命名
print(flow1.describe())
print(flow2.describe())
在数据流图(DFD, Data Flow Diagram)中,“加工”(Process)是指对数据进行处理或变换的逻辑功能单元。它接收输入的数据流,对其进行某种操作(如计算、转换、合并、查询等),然后产生输出的数据流。加工不关心具体的实现细节(如代码或算法),而是从逻辑上描述“系统做什么”。
加工的主要特征包括:
-
有唯一的编号:
每个加工通常有一个编号(如 P1、P2 或 1.0、2.1),用于在分层 DFD 中标识和追踪,便于分解和细化。 -
有明确的名称:
名称应为动词短语,体现其功能,例如“验证用户身份”、“生成订单报表”、“计算税费”等,使人一目了然。 -
至少有一个输入数据流和一个输出数据流:
加工必须有输入(数据来源)和输出(处理结果),否则属于“黑洞”(只有输入无输出)或“奇迹”(只有输出无输入),是逻辑错误。 -
不关心内部实现:
DFD 是逻辑模型,加工只表示“做什么”,不表示“怎么做”。具体实现由后续的设计阶段完成。 -
可以被分解(分层细化):
高层图中的一个加工可以在下层图中展开为多个子加工,形成层次结构。例如,“处理订单”可分解为“验证订单”、“更新库存”、“生成发票”等。 -
不能直接访问数据存储(间接访问):
加工通过数据流与外部实体或数据存储交互,但不能绕过数据流直接操作文件或数据库。
# 示例:模拟一个加工的行为(非图形建模,仅示意逻辑)
class Process:
def __init__(self, pid, name):
self.id = pid # 加工编号
self.name = name # 加工名称
self.inputs = [] # 输入数据流
self.outputs = [] # 输出数据流
def add_input(self, data_flow):
self.inputs.append(data_flow)
def add_output(self, data_flow):
self.outputs.append(data_flow)
def execute(self):
# 简单模拟执行过程
if not self.inputs:
print(f"警告:加工 '{self.name}' 无输入数据流(黑洞错误)")
return
if not self.outputs:
print(f"警告:加工 '{self.name}' 无输出数据流(奇迹错误)")
return
print(f"执行加工 [{self.id}]: {self.name}")
for out_flow in self.outputs:
print(f" 输出 → {out_flow.describe()}")
# 使用示例
proc = Process("P3", "计算订单总价")
flow_in = DataFlow("订单明细", "接收订单", "计算订单总价", ["商品价格", "数量"])
flow_out = DataFlow("订单总价", "计算订单总价", "生成发票", ["总金额"])
proc.add_input(flow_in)
proc.add_output(flow_out)
proc.execute()


373

被折叠的 条评论
为什么被折叠?



