第6章:结构化开发方法
系统设计基本原理
1、抽象 抽象是一种设计技术,重点说明一个实体的本质方面,而忽略或者掩盖不是很重要或非本质的方面。
模块化
模块化是指将一个待开发的软件分解成若干个小的、简单的部分一模块,每个模块可独立地开发、测试,最后组装成完整的程序。模块化的目的是使程序的结构清晰,容易阅读、理解、测试和修改。
模块设计的原则是对修改封闭,对扩展开放。如果一个模块可以作为一个独立体被其它程序调用,则称模块具有封闭性。如果一个模块可以被扩充,则称模块具有开放性。一个模块直接调用其它模块的个数称为模块的扇出系数;反之,一个模块被其它模块调用时,直接调用它的模块个数称为模块的扇入系数。经验表明,一个设计成功的系统的平均扇入、扇出系数通常是3或4,一般不应超过7,否则出错的概率增大。
软件设计的主要任务是设计软件的结构、过程和模块,其中软件结构设计的主要任务是确定模块间的组成关系。
1、模块化设计要求高内聚、低耦合,模块独立体现的就是高内聚低耦合。 2、在结构化设计中,系统由多个逻辑上相对独立的模块组成,在模块划分时需要遵循如下原则: (1)模块的大小要适中。系统分解时需要考虑模块的规模,过大的模块可能导致系统分解不充分,其内部可能包括不同类型的功能,需要进一步划分,尽量使得各个模块的功能单一;过小的模块将导致系统的复杂度增加,模块之间的调用过于频繁,反而降低了模块的独立性。不是越小越好。 (2)模块的扇入和扇出要合理。模块的扇入指模块直接上级模块的个数。模块的直属下级模块个数即为模块的扇出。 (3) 深度和宽度适当。深度表示软件结构中模块的层数,如果层数过多,则应考虑是否有些模块设计过于简单,看能否适当合并。宽度是软件结构中同一个层次上的模块总数的最大值,一般说来,宽度越大系统越复杂,对宽度影响最大的因素是模块的扇出。在系统设计时,需要权衡系统的深度和宽度,尽量降低系统的复杂性,减少实施过程的难度,提高开发和维护的效率。需要控制模块接口的复杂性。3、尽力使模块的作用域在其控制域之内。模块控制域:这个模块本身以及所有直接或间接从属于它的模块的集合。模块作用域:指受该模块内一个判定所影响的所有模块的集合。
信息隐蔽
信息隐蔽是开发整体程序结构时使用的法则,即将每个程序的成分隐蔽或封装在一个单一的设计模块中,定义每一个模块时尽可能少地显露其内部的处理。信息隐蔽原则对提高软件的可修改性、可测试性和可移植性都有重要的作用。
模块独立
模块独立是指每个模块完成一个相对独立的特定子功能,并且与其他模块之间的联系简单 衡量模块独立程度的标准有两个:耦合和内聚。
耦合是指模块之间联系的紧密程度。耦合度越高,则模块的独立性越差。
内聚是指模块内部各元素之间联系的紧密程度。内聚度越低,则模块的独立 性越差。因此,模块独立就是希望每个模块都是高内聚、低耦合的。
模块化的目的是使程序的结构清晰,容易阅读、理解、测试、修改。 模块的独立程序由两个定性标准度量:内聚和耦合。耦合衡量不同模块彼此 间相互依赖的紧密程度。内聚衡量一个模块内部各个元素彼此结合的紧密程度。 高内聚,低耦合是一个好的模块的标准,是模块设计的追求。
耦合
耦合按从强到弱的顺序分为以下几种: 1、内容耦合,一个模块直接修改或作为另一个模块的数据,或者直接转入 另一下模块时,就发生了内容耦合。此时,被修改的模块完全依赖于修改它的模 块。 2、公共耦合,两个以上的模块共同引用一个全局数据项就称为公共耦合。 3、控制耦合,一个模块在界面上传递一个信号(如开关值、标志量等)控制 另一个模块,接收信号的模块的动作根据信号值进行调整,称为控制耦合。 4、标记耦合,模块间通过参数传递复杂的内部数据结构,称为标记耦合。 此数据结构的变化将使相关的模块发生变化。 5、数据耦合,模块间通过参数传递基本类型的数据,称为数据耦合。 6、非直接耦合,模块间没有信息传递时,属于非直接耦合。 如果模块间必须存在耦合,就尽量使用数据耦合,少用控制耦合,限制公共耦合的范围,坚决避免使用内容耦合。
内聚
内聚按强度由低到高有以下几种类型: 1、偶然内聚,如果一个模块的各成分之间毫无关系,则称为偶然内聚。 2、逻辑内聚,内个逻辑上相关的功能被放在同一模块中,则称为逻辑内聚。 3、时间内聚,如果一个模块完成的功能必须在同一时间内执行,但这些功 能只是因为时间因素关联在一直,则称为时间内聚。 4、过程内聚,如果一个模块内部的处理成分是相关的,而且这些处理必须 以待定的次序执行,则称为过程内聚。 5、通信内聚,如果一个模块的所有成分都作同一数据集或生成同一数据集, 则称为通信内聚。
6、顺序内聚,一个模块的各个成分和同一个功能密切相关,而且一个成分 的输出作为另一个成分的输入。 7、功能内聚,模块的所有成分对于完成单一的功能都是必须的,则称为功 能内聚。
模块内聚类型
模块间的耦合和模块的内聚是度量模块独立性的两个准则。内聚是模块功能强度的度量,即模块内部各个元素彼此结合的紧密程度。一个模块内部各个元素之间的紧密程度越高,则其内聚性越高,模块独立性越好。
模块内聚类型主要有以下几类: 偶然内聚/巧合内聚:指一个模块内的各处理元素之间没有任何联系。 逻辑内聚:指模块内执行若干个逻辑上相似的功能,通过参数确定该模块完成哪一个功能。时间内聚:把需要同时执行的动作组合在一起形成的模块。 过程内聚:指一个模块完成多个任务,这些任务必须按指定的过程执行。 通信内聚:指模块内的所有处理元素都在同一个数据结构上操作,或者各处理使用相同的输入数据或产生相同的输出数据。 顺序内聚:指一个模块中的各个处理元素都密切相关于同一个功能且必须顺序执行,前一个功能元素的输出就是下一功能元素的输入。 功能内聚:指模块内的所有元素共同作用完成一个功能,缺一不可。
结构化分析方法
结构化分析方法概述
数据流图
数据字典(DD)
结构化设计方法
结构化设计主要包括: ①体系结构设计:定义软件的主要结构元素及其关系。 ②数据设计:基于实体联系图确定软件涉及的文件系统的结构及数据库的表结构。 ③接口设计:描述用户界面,软件和其他硬件设备、其他软件系统及使用人员的外部接口,以及各种构件之间的内部接口。 ④过程设计:确定软件各个组成部分内的算法及内部数据结构,并选定某种过程的表达形式来描述各种算法。
系统总体结构设计
系统结构设计应遵循以下原则: 分解一协调原则, 自顶向下原则。 信息隐蔽、抽象的原则 致性原则。 明确性原则。 模块之间的耦合度尽可能小,模块的内聚度尽可能高 模块的扇入系数和扇出系数要合理。 模块的规模适当
子系统划分要遵循以下原则 子系统要具有相对独立性。 子系统之间数据的依赖性尽量小。 子系统划分的结果应使数据冗余较小 子系统的设置应考虑今后管理发展的需要 子系统的划分应便于系统分阶段实现: 子系统的划分应考虑到各类资源的充分利用
模块是组成系统的基本单位,它的特点是可以组合、分解和更换。系统中任何个处理功能都可以看成是一个模块。根据模块功能具体化程度的不同,可以分为逻辑模块和物理模块。
一个模块要具备以下4个要素: 输入和输出:模块的输入来源和输出去向都是同一个调用者,即一个模块从调用者那里取得输入,进行加工后再把输出返回给调用者。 处理功能:指模块把输入转换成输出所做的工作 内部数据:指仅供该模块本身引用的数据。 程序代码:指用来实现模块功能的程序。
数据流图
数据流图一基本慨念
1)数据流图或称数据流程图,是一种便于用户理解、分析系统数据流程的图形工具。它摆脱了系统的物理内容,精确地在逻辑上描述系统的功能、输入、输出和数据存储等,是系统逻辑模型的重要组成部分。
数据流图是一种图形化表示数据在系统内部或系统之间流动的图形工具。它展示了数据如何从一个地方流向另一个地方,在系统中传递、存储、处理和转换的过程。
数据流图通常包括以下几个主要元素:
-
实体(Entity):代表系统中存储或产生数据的源或目的地,如数据库、文件、传感器等。
-
过程(Process):代表对数据执行的操作或处理过程,如数据的转换、计算、过滤等。
-
数据流(Data Flow):代表数据在系统内部或系统之间流动的路径。
-
数据存储(Data Store):代表数据的持久化存储,通常用于存储和检索数据。
-
控制流(Control Flow):代表控制数据流的顺序和条件。
2)数据字典 数据流图描述了系统的分解,但没有对图中各成分进行说明。数据字典用于对数据流图中的每个数据流、文件、加工,以及组成数据流或文件的数据项做出说明。
数据字典有4类条目:数据流条目、数据存储条目、加工条目和数据项条目。数据字典管理主要是指把字典条目按照某种格式组织后存储在字典中并提供排序、查找、统计等功能。
数据字典(Data Dictionary)是一个结构化的文件或数据库,用于描述系统中使用到的数据项以及这些数据项之间的关系。数据字典通常包含了对数据项的定义、属性、数据类型、取值范围、关联关系等详细信息。
数据字典的作用包括但不限于以下几个方面:
-
数据定义和标准化:数据字典提供了对系统中各个数据项的准确定义,可以帮助确保数据的一致性和标准化。
-
数据管理和维护:数据字典记录了系统中所有使用到的数据项,以及它们的属性和关联关系,方便对数据进行管理和维护。
-
数据共享和交流:数据字典为不同团队或人员提供了一个统一的数据信息来源,促进数据的共享和交流。
-
数据分析和设计:数据字典可以作为系统分析和设计的基础,帮助分析人员理解系统中的数据结构和关系。
-
数据质量和准确性控制:数据字典可以帮助识别数据质量问题,提高数据的准确性和完整性。
在数据字典中,通常包含了以下信息:
-
数据项的标识符和名称
-
数据项的描述和定义
-
数据项的数据类型和长度
-
数据项的取值范围和约束条件
-
数据项的关联关系和依赖关系
数据字典是系统分析和设计中重要的工具之一,它有助于帮助团队成员对系统中的数据有一个清晰的了解,促进项目的顺利进行和数据管理的规范化。
外部实体与系统的数据交互是不变。系统更加的细化。大的加工细分成小的加工
数据流图一应注意的问题
(1)适当地为数据流、加工、数据存储、外部实体命名,名字应反映该成分的实际含义,避免空洞的名字。 (2)画数据流而不要画控制流。 (3)每条数据流的输入或者输出都是加工 (4)一个加工的输出数据流不应与输入数据流同名,即使它们的组成成分相同。 (5)允许一个加工有多条数据流流向另一个加工,也允许一个加工有两个相同的输出数据流流向两个不同的加工
(6)保持父图与子图平衡。也就是说,父图中某加工的输入/输出数据流必须在它的子图的输入输出数据流在数量和名字上相同。值得注意的是,如果父图的一个输入(或输出)数据流对应子图中几个输入(或输出)数据流,而子图中组成这些数据流的数据项全体正好是父图中的这一个数据流,那么它们仍然算是 平衡的。 (7)在自顶向下的分解过程中,若一个数据存储首次出现时只与一个加工有关,那么这个数据存储应作为这个加工的内部文件而不必画出。
(8)保持数据守恒。也就是说,一个加工所有输出数据流中的数据必须能从该加工的输入数据流中直接获得,或者是通过该加工产生的数据中获得。
(9)每个加工必须既有输入数据流,又有输出数据流。
(10)在整套数据流图中,每个数据存储必须既有读的数据流,又有写的数据流。但在某一张子图中,可能是只有读没有写,或者是只有写没有读。
找缺失的数据流: 1、父图与子图之间的平衡 2、子图内平衡
特别注意加工要有输入输出
通过顶层图与0层图对比,在顶层图外部实体与系统的数据交互,有几个输入几个输出,在0层图中是对应的