第九章 面向数据流的设计方法
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2013-7-14 24
9.2变换分析
传感器监测子系统输出流部分的程序结构
2013-7-14
25
9.2变换分析
传感器监测子系统的程序结构“雏形”
2013-7-14
26
9.2变换分析
变换分析
步骤七 采用启发式设计策略,精化所得程序结构雏形,改 良软件质量。
对于程序结构的雏形,以“模块独立”为指导思想, 对模块或合或拆,旨在追求高内聚、低耦合,易实现、 易测试、易维护的软件结构。
典型的程序结构
设计良好的软件结构通常顶层扇出比较高,中层扇出较少, 底层又高扇入到公共的实用模块中去。
2013-7-14
18
9.2变换分析
变换分析
一级分解 图9.8展示的是一个简单三叉结构,实际处理大 型系统的复杂数据流时,可能需要两个甚至多个模块 对应上述一个模块的功能。 “一级分解”的原则 在完成控制功能并保持低耦合度、高内聚度的前 提下尽可能减少模块数。
2013-7-14
19
9.2变换分析
2013-7-14
31
9.3事务分析
用户交互子系统的二级数据流图
2013-7-14
32
9.3事务分析
事务分析
事务分析法可分为七个步骤 步骤一复审基本系统模型; 步骤二复审并精化软件数据流图; 步骤三确定数据流图的特性;/前三步与变换分析法相同/ 步骤四找出数条动作路径的公共源头,即为事务中心,确定 由事务中心发出的每一动作路径的数据流特性。 图9.14的事物中心是 “启动命令处理”框。 图9.15划定接受路径与所有动作路径的界限,判定每一动 作路径上数据流的特征。
2013-7-14
40
9.4启发式设计策略
启发式设计策略
(1)改造程序结构,减小耦合度,提高内聚度。 应从增强模块独立性的角度,对程序结构雏形的模 块进行分解或合并,力求降低耦合度,提高内聚度。
(2)改造程序结构,减少高扇出,在增加程序深度 的前提下追求高扇入。
2013-7-14
41
9.4启发式设计策略
2013-7-14 6
9.1基本概念和设计过程
基本概念和设计过程
在大系统的DFD中,变换流与事务流往往交织在 一起。 在基于事务流的系统中,当信息沿动作路径流动时 可能呈现变换流的特征,变换分析法与事物分析法需 要交叉使用。
任何设计过程都不应该也不可能完全机械化,人的 判断力和创造性往往起决定作用。
2013-7-14
27
9.2变换分析
变换分析
修改“传感器监测子系统”的程序结构雏形 (1)因只存在唯一一条传入路径,故输入控制模块可删除; (2)由变换中心产生的整个子结构可归并为“建立警报条件” 一个模块(选择电话号码的功能纳入其中),变换控制模块不 再需要; (3)“格式化显示”和“生成显示”两个模块归并为“产生 显示”一个模块。
2013-7-14
33
9.3事务分析
确定流界
2013-7-14
34
9.3事务分析
事务分析
步骤五 把数据流图映射为事务处理型的程序结构。 事务处理型的程序结构由“ 输入”和“散转”两部分组成, 输入部分的构成方法如变换分析法,即从事 务处理中心开始, 沿输入通路向外推进,每个处理框映射为一个模块。 “ 散转 ”部分顶层为一“散转”模块,它总控所有对应于每 一动作路径的控制模块,每条动作路径都根据它的信息流特征 映射为一个程序子结构。
2013-7-14 12
9.2变换分析
“传感器监测子系统”的第二级DFD
2013-7-14
13
9.2变换分析
“传感器监测子系统”的第三级DF
2013-7-14
14
9.2变换分析
变换分析
步骤三 确定DFD为变换流还是事务流。 系统内部的信息流总可以用变换流表示,倘若具有明显的事 务特性,还应该采用针对事务流的映射方法。设计人员首先要 判定DFD中占主导地位的信息流,并确定其特性,然后孤立 出具有变换特性或事务特性的支流,这些支流将用于精化由主 导数据流推出的程序结构。 以图9.7所示DFD为例,数据沿一个传入路径进来,沿三个传 出路径离开,无明显的事务中心,该信息流应属变换流。
2013-7-14 7
9.1基本概念和设计过程
面向数据流的设计
2013-7-14
8
第九章 面向数据流的设计方法
9.2 变换分析
变换分析由一系列设计步骤组成,经过这些步骤就 能把具有变换流特点的数据流图,按预先确定的模式 映射成软件结构。
2013-7-14
9
9.2变换分析
变换分析
步骤一 复审基本系统模型 基本系统模型指顶级DFD和所有由外部提供的信息。这一 设计步骤是对系统规格说明书和 软件需求规格说明书进行评 估。这两个文档描述软件界面上信息的流程和结构。 图9.4和图 9.5分别为“家庭保安系统”的顶层和第一层数 据流图。
2013-7-14
22
9.2变换分析
变换分析
二级分解 DFD的处理框与程序结构模块一一对应 按照软件设计原则,可能需要几个处理框聚合为一个 模块,或者把一个处理框细分为几个模块。 应根据“良好”设计的标准,进行二级分解。
2013-7-14
23
9.2变换分析
变换分析
由图9.7输出流部分导出的程序结构如图9.11所示。 “传感器监测子系统”二级分解的结果见图9.12,它仅仅是 程序结构的“雏形” ,后续的复审和精化会反复修改。 程序结构的模块名隐含模块功能,必须为每个模块写一个简要 的处理说明,包括: ①进出模块的信息(接口描述); ②模块的局部信息; ③处理过程陈述,包括主要的判断点和任务; ④对有关限制和一些专门特性的简要说明(例如,文件I/0, 独立于硬件的特性,特殊的实时要求等等)。 这些描述构成第一版设计规格说明书。
2013-7-14
10
9.2变换分析
“家庭保安系统”的顶级数据流图
家庭保安系统-传 感器监测子系统的 变换分析步骤。
2013-7-14
11
9.2变换分析
变换分析
步骤二 复审和精化软件数据流图 精化软件需求规格说明书中的分析模型,直至获得足够详细 的DFD。 如,由“传感器监测子系统”的第一级(图9.5的局部)和第 二级(图9.6)DFD进 一步推导出第三级数据流图(图9. 7)。 每个变换对应一个独立的功能,可望用一 个具有较高内聚 度的模块实现,至此已有足够的信息用于设计“传感器监测子 系统”的程序结构,精化过程亦可结束。
2013-7-14
若数据流图所描述的 信息流具有上述特征 则称作变换流。
5
9.1基本概念和设计过程
基本概念和设计过程
事务流 由于基本系统模型呈变 换流,故任意系统中的信 息均可用变换流刻画。 若数据流具有如图9.2所 示形状,称“事务流”。 单个数据项称为事务 (transaction)沿传入 路径(接受通道)进入系 统,由外部形式变换为内 部形式后到达事务中心, 事务中心根据数据项计值 结果从若干动作路径中选 定一条继续执行。
一级分解
2013-7-14
20
9.2变换分析
传感器监测子系统一级分解结果
控制 模块的 名字概 括了所 有下属 模块的 功能。
2013-7-14
21
9.2变换分析
二级分解
步骤六 执行“二级分解” 把数据流图中每个处 理框映射成程序结构中 一个适当的模块,二级 分解过程是从变换中心 的边界开始沿输入、输 出通道向外移动,把遇 到的每个处理框映射为 程序结构中的一个模块。
2013-7-14
38
9.3事务分析
用户交互子系统的程序结构雏形
2013-7-14
39
第九章 面向数据流的设计方法
9.4启发式设计策略
变换分析和事务分析的最后一个步骤都是运用启发 式策略对程序结构雏形进行优化,以提高软件设计的 整体质量。
启发式设计策略是人们从长期的大量软件开发过程 中积累总结的经验。
2013-7-14
4
9.1基本概念和设计过程
基本概念和设计过程
变换流
在基本系统模型(即顶级数据 流图)中信息通常以“外部 世界”所具有的形式进入系 统,经过处理后又以这种形 式离开系统。 输入信息流沿传入路径进入系 统,同时由外部形式变换为 内部形式,经系统变换中心 加工、处理,作为输出信息 流又沿传出路径离开系统, 并还原为外部形式。
2013-7-14
35
9.3事务分析
事务流映射
2013-7-14
36
9.3事务分析
事务分析
用户交互子系统的一级分解
2013-7-14
37
9.3事务分析
事务分析
步骤六 分解并精化事务结构以及每条动作路径所对应的结构。 这些子结构是根据流经每一动作路径的数据流特征,采用本 节或上节所述设计步骤导出的。 图9.18给出了各条动作路径映射后的程序结构。 步骤七 使用启发式设计策略,精化所得程序结构雏形,改良软件质 量。 这一步骤与变换分析法相同。
软件工程
Software Engineering
2013-7-14
1
第九章 面向数据流的设计方法
面向数据流的设计方法,即结构设计法(简称S D方法)。 需求阶段对数据流进行分析,生成数据流图和数据 字典,以此为基础设计软件结构。 数据流图描绘信息在系统内部加工和流动的情况, 面向数据流的设计方法根据数据流图的特性定义变 换流和事务流两种“映射”,这两种映射能机械地 将数据流图转换为程序结构。 该方法的目标是为软件结构设计提供一个系统的途 径,使设计人员对软件有一个整体的认识。
2013-7-14
30
第九章 面向数据流的设计方法
9.3 事务分析
当数据流具有明显的事务特征时,即能找到一个事务(亦称触 发数据项)和一个 事务中心,采用事务分析法更为适宜。 下面以“家庭保安系统”中“用户交互子系统”为例,说明事 务分析法。 该子系统的第一级数据流图如图9.5所示,精化后得到如图9. 14所示第二级 数据流图。图中“用户命令数据”流入系统 后,沿三条动作路径之一离 开系统,若将数据项“命令类型” 看作事务,该子系统的信息流具有明显的事务 特征。 事务分析法的步骤与变换分析方法基本类似,主要差别在于从 数据流图到程序 结构的映射。
2013-7-14
28
9.2变换分析
“传感器监测子系统”的程序结构
2013-7-14
29
9.2变换分析
变wk.baidu.com分析
上述七个设计步骤的目标是给出软件的一个整体 描述。 一旦有了这样一个描述,设计人员即可从整体角度评 价和精化软件的总体结构,此时修改所需耗费不多, 却能大大提高软件质量。 比较上述设计过程与一般直接编码过程可知,如 果源代码是软件唯一的表现形式,设计人员很难从整 体的观点评价和精化软件。
2013-7-14 2
第九章 面向数据流的设计方法
面向数据流的设计方法
本章所述技术用于软件的概要设计描述 ,包括模块、界面 和数据结构的定义,这是后续开发的基础。 每种软件设计方法都有长处和不足,选用哪种方法应考虑适 用的范围。 任何软件系统都可以用数据流图表示,面向数据流的设计方 法可用于任一种软件系统的开发。 该方法对那些顺序处理信息且不含层次数据结构的系统最为 有效,如,过程控制、复杂的数值分析过程、以及科学与工程 方面的应用等等。 当SD方法用于完全的数据处理时,即使系统中使用层次数 据同样行之有效。
“传感器监测子系统”
2013-7-14
17
9.2变换分析
变换分析
步骤五 执行“一级分解”导出具有三个层次的程序结构。 顶层为总控模块; 底层模块执行输入、计算和输出功能; 中层模块控制、协调底层的工作。 如图9.8所示,主控模块负责协调下面几个中层控制模块: 输入流控制模块,接收所有输入数据; 变换流控制模块,对内部形式数据进行加工、处理; 输出流控制模块,产生输出数据
2013-7-14
15
9.2变换分析
变换分析
步骤四 划定输入流和输出流边界孤立变换中心。 输入、输出流边界的划分可能因人而异,不同的设 计人员可能把边界沿着数据通道向前推进或后退一个 处理框,这对最后的软件结构影响不大。
“传感器监测子系统”的流界在图9.7中用虚线表示。
2013-7-14
16
9.2变换分析
2013-7-14 3
第九章 面向数据流的设计方法
9.1基本概念和设计过程
用SD方法将数据流图转换为软件结构 (1)确定信息流的类型; (2)划定流界; (3)将数据流图映射为程序结构; (4)提取层次控制结构; (5)通过设计复审和启发式策略精化结构。 第三步所用映射方法涉及信息流的类型。 信息流分为变换流和事务流两种类型。
9.2变换分析
传感器监测子系统输出流部分的程序结构
2013-7-14
25
9.2变换分析
传感器监测子系统的程序结构“雏形”
2013-7-14
26
9.2变换分析
变换分析
步骤七 采用启发式设计策略,精化所得程序结构雏形,改 良软件质量。
对于程序结构的雏形,以“模块独立”为指导思想, 对模块或合或拆,旨在追求高内聚、低耦合,易实现、 易测试、易维护的软件结构。
典型的程序结构
设计良好的软件结构通常顶层扇出比较高,中层扇出较少, 底层又高扇入到公共的实用模块中去。
2013-7-14
18
9.2变换分析
变换分析
一级分解 图9.8展示的是一个简单三叉结构,实际处理大 型系统的复杂数据流时,可能需要两个甚至多个模块 对应上述一个模块的功能。 “一级分解”的原则 在完成控制功能并保持低耦合度、高内聚度的前 提下尽可能减少模块数。
2013-7-14
19
9.2变换分析
2013-7-14
31
9.3事务分析
用户交互子系统的二级数据流图
2013-7-14
32
9.3事务分析
事务分析
事务分析法可分为七个步骤 步骤一复审基本系统模型; 步骤二复审并精化软件数据流图; 步骤三确定数据流图的特性;/前三步与变换分析法相同/ 步骤四找出数条动作路径的公共源头,即为事务中心,确定 由事务中心发出的每一动作路径的数据流特性。 图9.14的事物中心是 “启动命令处理”框。 图9.15划定接受路径与所有动作路径的界限,判定每一动 作路径上数据流的特征。
2013-7-14
40
9.4启发式设计策略
启发式设计策略
(1)改造程序结构,减小耦合度,提高内聚度。 应从增强模块独立性的角度,对程序结构雏形的模 块进行分解或合并,力求降低耦合度,提高内聚度。
(2)改造程序结构,减少高扇出,在增加程序深度 的前提下追求高扇入。
2013-7-14
41
9.4启发式设计策略
2013-7-14 6
9.1基本概念和设计过程
基本概念和设计过程
在大系统的DFD中,变换流与事务流往往交织在 一起。 在基于事务流的系统中,当信息沿动作路径流动时 可能呈现变换流的特征,变换分析法与事物分析法需 要交叉使用。
任何设计过程都不应该也不可能完全机械化,人的 判断力和创造性往往起决定作用。
2013-7-14
27
9.2变换分析
变换分析
修改“传感器监测子系统”的程序结构雏形 (1)因只存在唯一一条传入路径,故输入控制模块可删除; (2)由变换中心产生的整个子结构可归并为“建立警报条件” 一个模块(选择电话号码的功能纳入其中),变换控制模块不 再需要; (3)“格式化显示”和“生成显示”两个模块归并为“产生 显示”一个模块。
2013-7-14
33
9.3事务分析
确定流界
2013-7-14
34
9.3事务分析
事务分析
步骤五 把数据流图映射为事务处理型的程序结构。 事务处理型的程序结构由“ 输入”和“散转”两部分组成, 输入部分的构成方法如变换分析法,即从事 务处理中心开始, 沿输入通路向外推进,每个处理框映射为一个模块。 “ 散转 ”部分顶层为一“散转”模块,它总控所有对应于每 一动作路径的控制模块,每条动作路径都根据它的信息流特征 映射为一个程序子结构。
2013-7-14 12
9.2变换分析
“传感器监测子系统”的第二级DFD
2013-7-14
13
9.2变换分析
“传感器监测子系统”的第三级DF
2013-7-14
14
9.2变换分析
变换分析
步骤三 确定DFD为变换流还是事务流。 系统内部的信息流总可以用变换流表示,倘若具有明显的事 务特性,还应该采用针对事务流的映射方法。设计人员首先要 判定DFD中占主导地位的信息流,并确定其特性,然后孤立 出具有变换特性或事务特性的支流,这些支流将用于精化由主 导数据流推出的程序结构。 以图9.7所示DFD为例,数据沿一个传入路径进来,沿三个传 出路径离开,无明显的事务中心,该信息流应属变换流。
2013-7-14 7
9.1基本概念和设计过程
面向数据流的设计
2013-7-14
8
第九章 面向数据流的设计方法
9.2 变换分析
变换分析由一系列设计步骤组成,经过这些步骤就 能把具有变换流特点的数据流图,按预先确定的模式 映射成软件结构。
2013-7-14
9
9.2变换分析
变换分析
步骤一 复审基本系统模型 基本系统模型指顶级DFD和所有由外部提供的信息。这一 设计步骤是对系统规格说明书和 软件需求规格说明书进行评 估。这两个文档描述软件界面上信息的流程和结构。 图9.4和图 9.5分别为“家庭保安系统”的顶层和第一层数 据流图。
2013-7-14
22
9.2变换分析
变换分析
二级分解 DFD的处理框与程序结构模块一一对应 按照软件设计原则,可能需要几个处理框聚合为一个 模块,或者把一个处理框细分为几个模块。 应根据“良好”设计的标准,进行二级分解。
2013-7-14
23
9.2变换分析
变换分析
由图9.7输出流部分导出的程序结构如图9.11所示。 “传感器监测子系统”二级分解的结果见图9.12,它仅仅是 程序结构的“雏形” ,后续的复审和精化会反复修改。 程序结构的模块名隐含模块功能,必须为每个模块写一个简要 的处理说明,包括: ①进出模块的信息(接口描述); ②模块的局部信息; ③处理过程陈述,包括主要的判断点和任务; ④对有关限制和一些专门特性的简要说明(例如,文件I/0, 独立于硬件的特性,特殊的实时要求等等)。 这些描述构成第一版设计规格说明书。
2013-7-14
10
9.2变换分析
“家庭保安系统”的顶级数据流图
家庭保安系统-传 感器监测子系统的 变换分析步骤。
2013-7-14
11
9.2变换分析
变换分析
步骤二 复审和精化软件数据流图 精化软件需求规格说明书中的分析模型,直至获得足够详细 的DFD。 如,由“传感器监测子系统”的第一级(图9.5的局部)和第 二级(图9.6)DFD进 一步推导出第三级数据流图(图9. 7)。 每个变换对应一个独立的功能,可望用一 个具有较高内聚 度的模块实现,至此已有足够的信息用于设计“传感器监测子 系统”的程序结构,精化过程亦可结束。
2013-7-14
若数据流图所描述的 信息流具有上述特征 则称作变换流。
5
9.1基本概念和设计过程
基本概念和设计过程
事务流 由于基本系统模型呈变 换流,故任意系统中的信 息均可用变换流刻画。 若数据流具有如图9.2所 示形状,称“事务流”。 单个数据项称为事务 (transaction)沿传入 路径(接受通道)进入系 统,由外部形式变换为内 部形式后到达事务中心, 事务中心根据数据项计值 结果从若干动作路径中选 定一条继续执行。
一级分解
2013-7-14
20
9.2变换分析
传感器监测子系统一级分解结果
控制 模块的 名字概 括了所 有下属 模块的 功能。
2013-7-14
21
9.2变换分析
二级分解
步骤六 执行“二级分解” 把数据流图中每个处 理框映射成程序结构中 一个适当的模块,二级 分解过程是从变换中心 的边界开始沿输入、输 出通道向外移动,把遇 到的每个处理框映射为 程序结构中的一个模块。
2013-7-14
38
9.3事务分析
用户交互子系统的程序结构雏形
2013-7-14
39
第九章 面向数据流的设计方法
9.4启发式设计策略
变换分析和事务分析的最后一个步骤都是运用启发 式策略对程序结构雏形进行优化,以提高软件设计的 整体质量。
启发式设计策略是人们从长期的大量软件开发过程 中积累总结的经验。
2013-7-14
4
9.1基本概念和设计过程
基本概念和设计过程
变换流
在基本系统模型(即顶级数据 流图)中信息通常以“外部 世界”所具有的形式进入系 统,经过处理后又以这种形 式离开系统。 输入信息流沿传入路径进入系 统,同时由外部形式变换为 内部形式,经系统变换中心 加工、处理,作为输出信息 流又沿传出路径离开系统, 并还原为外部形式。
2013-7-14
35
9.3事务分析
事务流映射
2013-7-14
36
9.3事务分析
事务分析
用户交互子系统的一级分解
2013-7-14
37
9.3事务分析
事务分析
步骤六 分解并精化事务结构以及每条动作路径所对应的结构。 这些子结构是根据流经每一动作路径的数据流特征,采用本 节或上节所述设计步骤导出的。 图9.18给出了各条动作路径映射后的程序结构。 步骤七 使用启发式设计策略,精化所得程序结构雏形,改良软件质 量。 这一步骤与变换分析法相同。
软件工程
Software Engineering
2013-7-14
1
第九章 面向数据流的设计方法
面向数据流的设计方法,即结构设计法(简称S D方法)。 需求阶段对数据流进行分析,生成数据流图和数据 字典,以此为基础设计软件结构。 数据流图描绘信息在系统内部加工和流动的情况, 面向数据流的设计方法根据数据流图的特性定义变 换流和事务流两种“映射”,这两种映射能机械地 将数据流图转换为程序结构。 该方法的目标是为软件结构设计提供一个系统的途 径,使设计人员对软件有一个整体的认识。
2013-7-14
30
第九章 面向数据流的设计方法
9.3 事务分析
当数据流具有明显的事务特征时,即能找到一个事务(亦称触 发数据项)和一个 事务中心,采用事务分析法更为适宜。 下面以“家庭保安系统”中“用户交互子系统”为例,说明事 务分析法。 该子系统的第一级数据流图如图9.5所示,精化后得到如图9. 14所示第二级 数据流图。图中“用户命令数据”流入系统 后,沿三条动作路径之一离 开系统,若将数据项“命令类型” 看作事务,该子系统的信息流具有明显的事务 特征。 事务分析法的步骤与变换分析方法基本类似,主要差别在于从 数据流图到程序 结构的映射。
2013-7-14
28
9.2变换分析
“传感器监测子系统”的程序结构
2013-7-14
29
9.2变换分析
变wk.baidu.com分析
上述七个设计步骤的目标是给出软件的一个整体 描述。 一旦有了这样一个描述,设计人员即可从整体角度评 价和精化软件的总体结构,此时修改所需耗费不多, 却能大大提高软件质量。 比较上述设计过程与一般直接编码过程可知,如 果源代码是软件唯一的表现形式,设计人员很难从整 体的观点评价和精化软件。
2013-7-14 2
第九章 面向数据流的设计方法
面向数据流的设计方法
本章所述技术用于软件的概要设计描述 ,包括模块、界面 和数据结构的定义,这是后续开发的基础。 每种软件设计方法都有长处和不足,选用哪种方法应考虑适 用的范围。 任何软件系统都可以用数据流图表示,面向数据流的设计方 法可用于任一种软件系统的开发。 该方法对那些顺序处理信息且不含层次数据结构的系统最为 有效,如,过程控制、复杂的数值分析过程、以及科学与工程 方面的应用等等。 当SD方法用于完全的数据处理时,即使系统中使用层次数 据同样行之有效。
“传感器监测子系统”
2013-7-14
17
9.2变换分析
变换分析
步骤五 执行“一级分解”导出具有三个层次的程序结构。 顶层为总控模块; 底层模块执行输入、计算和输出功能; 中层模块控制、协调底层的工作。 如图9.8所示,主控模块负责协调下面几个中层控制模块: 输入流控制模块,接收所有输入数据; 变换流控制模块,对内部形式数据进行加工、处理; 输出流控制模块,产生输出数据
2013-7-14
15
9.2变换分析
变换分析
步骤四 划定输入流和输出流边界孤立变换中心。 输入、输出流边界的划分可能因人而异,不同的设 计人员可能把边界沿着数据通道向前推进或后退一个 处理框,这对最后的软件结构影响不大。
“传感器监测子系统”的流界在图9.7中用虚线表示。
2013-7-14
16
9.2变换分析
2013-7-14 3
第九章 面向数据流的设计方法
9.1基本概念和设计过程
用SD方法将数据流图转换为软件结构 (1)确定信息流的类型; (2)划定流界; (3)将数据流图映射为程序结构; (4)提取层次控制结构; (5)通过设计复审和启发式策略精化结构。 第三步所用映射方法涉及信息流的类型。 信息流分为变换流和事务流两种类型。