系统设计基本原理
- 抽象是一种设计技术,重点说明一个实体的本质方面,而忽略或者掩盖不是很重要或非本质的方面。
- 模块化是指将一个待开发的软件分解成若干个小的、简单的部分——模块,每个模块可独立地开发、测试,最后组装成完整的程序。模块化的目的是使程序的结构清晰,容易阅读、理解、测试和修改。
-
信息隐蔽 信息隐蔽是开发整体程序结构时使用的法则,即将每个程序的成分隐藏或封装在一个单一的设计模块中,定义每一个模块时尽可能少地显露其内部的处理。信息隐蔽原则对提高软件的可修改性、可测试性和可移植性都有重要的作用。
-
模块独立 模块独立是指每个模块完成一个相对独立的特定子功能,并且与其他模块之间的联系简单。衡量模块独立程度的标准有两个:耦合和内聚。耦合是指模块之间联系的紧密程度。耦合度越高,则模块的独立性越差。内聚是指模块内部各元素之间联系的紧密程度。内聚度越低,则模块的独立性越差。因此,模块独立就是希望每个模块都是高内聚、低耦合的。
系统总体结构设计
系统结构设计应遵循以下原则:
- 分解—协调原则。
- 自顶向下原则。
- 信息隐蔽、抽象的原则。
- 一致性原则。
- 明确性原则。
- 模块之间的耦合度尽可能小,模块的内聚度尽可能大。
- 模块的扇入系数和扇出数要合理。
- 模块的规模适当。
子系统划分要遵循以下原则:
- 子系统要具有相对独立性。
- 子系统之间数据的依赖性尽量小。
- 子系统划分的结果应使数据冗余较小。
- 子系统的设置应考虑今后管理发展的需要。
- 子系统的划分应便于系统分阶段实现。
- 子系统的划分应考虑到各类资源的充分利用。
数据流图
什么是数据流图?
数据流图是一种图形化的工具,用来描述系统中数据如何流动和处理的过程。它帮助我们理解系统的工作流程,特别是数据在系统中的移动路径。
数据流图的基本元素
数据流图通常包含以下几种基本元素:
-
外部实体
- 定义:系统之外的实体,它们与系统进行交互,提供或接收数据。
- 例子:用户、供应商、数据库等。
- 符号:通常用矩形表示。
-
处理过程
- 定义:系统中的处理步骤,它接收数据输入,并产生数据输出。
- 例子:计算总分、生成报告等。
- 符号:通常用圆角矩形或圆形表示。
-
数据流
- 定义:数据在系统中流动的路径。
- 例子:数据从用户传送到处理过程,再传送到数据库。
- 符号:通常用箭头表示,箭头指向表示数据流向。
-
数据存储(Data Store)
- 定义:系统中存储数据的地方。
- 例子:数据库、文件系统等。
- 符号:通常用双线矩形或水平线表示。
数据流图的层级结构
数据流图通常分为不同的层级,以详细描述系统的不同层面:
-
上下文图
- 定义:最高级别的数据流图,只包含一个处理过程和一个外部实体。
- 用途:提供系统的整体视图。
- 例子:一个银行系统的上下文图可能只包含一个处理过程(银行系统)和一个外部实体(用户)。
-
0级图
- 定义:展示系统的主处理过程和与之交互的外部实体。
- 用途:细化上下文图,展示更多细节。
- 例子:银行系统的0级图可能包含多个处理过程,如存款、取款、转账等。
-
低级别图
- 定义:进一步细化主处理过程,展示更详细的处理步骤。
- 用途:详细描述每个处理过程。
- 例子:存款处理过程可以进一步细化为验证用户身份、记录交易、更新余额等子过程。
对图和加工编号
父图(Parent Diagram)
父图通常是一个高层次的数据流图,它描述了系统的主要功能和数据流。父图给出了系统的大致轮廓,包括主要的处理过程、外部实体以及数据存储。
子图(Child Diagram)
子图是对父图中的某个处理过程进一步细化的图。子图提供了更详细的描述,展示了处理过程内部的详细步骤。
父图与子图的关系
父图和子图之间的关系可以用一句话概括:子图是对父图中某个处理过程的详细展开。
编号:
- 顶层图只有一张,图中的加工也只有一个,所以不必编号。
- 0层图也只有一张,图中的加工号可以分别是0.1.0.2、...或者1.2...
- 子图号就是父图中被分解的加工号。
- 图的加工号由图号、圆点和序号组成。
应注意的问题
(1) 适当地为数据流、加工、数据存储、外部实体命名,名字应反映该成分的实际含义,避免空洞的名字。
(2) 画数据流而不画控制流。
(3) 每条数据流的输入或者输出都是加工。
(4) 一个加工的输出数据流不应与输入数据流同名,即使它们的组成成分相同。
(5) 允许一个加工有多条数据流流向另一个加工,也允许一个加工有两个相同的输出数据流流向两个不同的加工。
(6)保持父图与子图平衡。也就是说,父图中某加工的输入/输出数据流必须与它的子图的输入/输出数据流在数量和名字上相同。值得注意的是,如果父图的一个输入(或输出)数据流对应子图中几个输入(或输出)数据流,而子图中组成这些数据流的数据项全体正好是父图中的这一个数据流,那么它们仍然算是平衡的。
(7)在自顶向下的分解过程中,若一个数据存储首次出现时只与一个加工有关,那么这个数据存储应作为这个加工的内部文件而不必画出。
(8)保持数据守恒。也就是说,一个加工所有输出数据流中的数据必须能从该加工的输入数据流中直接获得,或者是通过该加工产生的数据中获得。
(9)每个加工必须既有输入数据流,又有输出数据流。
(10)在整个数据流图中,每个数据存储必须既有读的数据流,又有写的数据流。但在某一张子图中,可能是只有读没有写,或者是只有写没有读。