1.8k likes | 2k Views
第 4 章 结构化软件设计. 第 4 章 结构化软件设计. 软件设计的两阶段 § 概要设计(总体设计): 取得软件系统的基本框架 § 详细设计: 确定软件系统的内部细节. 第 4 章 结构化软件设计. 第 4 章 结构化软件设计. 4.1 概要设计的任务与过程 4.2 系统架构设计 4.3 软件结构设计 4.4 面向数据流程的设计方法 4.5 面向数据结构的设计方法 4.6 数据库结构设计 4.7 软件详细设计 4.8 应用举例. 4.1 概要设计的任务与过程. 第 4 章 结构化软件设计.
E N D
第4章 结构化软件设计 第4章 结构化软件设计 软件设计的两阶段§概要设计(总体设计): 取得软件系统的基本框架§详细设计: 确定软件系统的内部细节
第4章 结构化软件设计 第4章 结构化软件设计 4.1 概要设计的任务与过程4.2 系统架构设计4.3 软件结构设计4.4 面向数据流程的设计方法4.5 面向数据结构的设计方法4.6 数据库结构设计4.7 软件详细设计4.8 应用举例
4.1 概要设计的任务与过程 第4章 结构化软件设计 • 任务:1.设计软件系统结构(简称软件结构) 2.设计数据结构及数据库3. 编写文档
4.1 概要设计的任务与过程 第4章 结构化软件设计 • 过程:1.制定规范●需要采用的管理规则:包括操作流程、交流方式、工作纪律等;●设计文档的编制标准:包括文档体系、文档格式、图表样式等; ●信息编码形式,硬件、操作系统的接口规约,命名规则等; ●设计目标、设计原则
4.1 概要设计的任务与过程 第4章 结构化软件设计 • 过程:2.设计软件系统结构(简称软件结构)为了实现目标系统,最终必须设计出组成这个系统的所有程序和数据库(文件)。对于程序,则首先进行结构设计,具体方法如下:
第4章 结构化软件设计 (1) 采用某种设计方法,将一个复杂的系统按功能划分成模块;(2) 确定每个模块的功能;(3) 确定模块之间的调用关系;(4) 确定模块之间的接口,即模块之间传递的信息;(5) 评价模块结构的质量。
第4章 结构化软件设计 从以上内容看,软件结构的设计是以模块为基础的,在需求分析阶段,通过某种分析方法把系统分解成层次结构。在设计阶段,以需求分析的结果为依据,从实现的角度划分模块,并组成模块的层次结构。 软件结构的设计是概要设计关键的一步,直接影响到详细设计与编码的工作。软件系统的质量及一些整体特性都在软件结构的设计中决定,因此,应由经验丰富的软件人员担任,采用一定的设计方法,选取合理的设计方案。
第4章 结构化软件设计 系统架构: 对于任何一个软件开发人员来说,架构师都是一个令人向往的角色。就连世界首富比尔盖茨在2000年卸任公司CEO的同时,也担任了微软公司的荣誉角色“首席软件架构师”,可见“架构师”这一称谓的吸引力。
第4章 结构化软件设计 系统架构: 所谓的架构师,应该是一个技术企业的最高技术决策者。他主要负责公司软件产品或软件项目的技术路线与技术框架的制订。好的架构师都是善良的独裁者,具有很强的技术、良好的写作能力、良好的口头表达能力,能够在各个层次进行沟通。
第4章 结构化软件设计 计算机软件水平考试专业类别、资格名称、级别对应表
第4章 结构化软件设计 • 过程:3.数据结构及数据库设计 对于大型数据处理的软件系统,除了系统结构设计外,数据结构与数据库设计也是很重要的。
第4章 结构化软件设计 1) 数据结构的设计 在需求分析阶段,可通过数据字典对数据的组成、操作约束和数据之间的关系等方面进行描述,确定数据的结构特性。在概要设计阶段要加以细化,宜使用抽象的数据类型。 设计有效的数据结构,将大大简化软件模块处理过程的设计。
第4章 结构化软件设计 2) 数据库的设计 数据库的设计指数据存储文件的设计,其主要包括以下几方面的设计:
第4章 结构化软件设计 (1) 概念设计。在数据分析的基础上,从用户角度采用自底向上的方法进行视图设计。一般用ER模型来表示数据模型,这是一个概念模型。ER模型既是设计数据库的基础,也是设计数据结构的基础。IDEF1x技术也支持概念模式,用IDEF1x方法建立系统的信息模型,使模型具有一致性、可扩展性和可变性等特性,同样,该模型可作为数据库设计的主要依据。 “需求分析”
第4章 结构化软件设计 (2) 逻辑设计。ER模型或IDEF1x模型是独立于数据库管理系统(DBMS)的,要结合具体的DBMS特征来建立数据库的逻辑结构。对于关系型的DBMS来说,将概念结构转换为数据模式、子模式并进行规范,要给出数据结构的定义,即定义所含的数据项、类型、长度及它们之间的层次或相互关系的表格等。 “概要设计”
第4章 结构化软件设计 (3) 物理设计。对于不同的DBMS,物理环境不同,提供的存储结构与存取方法也各不相同。物理设计就是设计数据模式的一些物理细节,如数据项存储要求、存取方式和索引的建立等。 “详细设计”
第4章 结构化软件设计 • 过程:4.安全性设计(1) 操作权限管理设计;(2) 操作日志管理设计;(3) 文件与数据加密设计以及特定功能的操作校验设计等。
第4章 结构化软件设计 • 过程:5.故障处理设计 对各种可能出现的,来自于软件、硬件以及网络通信方面的故障做出专门考虑。例如,提供备用设备、设置出错处理模块、设置数据备份模块等。
第4章 结构化软件设计 • 过程:6.编写文档 编写概要设计文档的内容如下:(1) 概要设计说明书;(2) 数据库设计说明书:主要给出所使用的DBMS简介,数据库的概念模型、逻辑设计和结果。(3) 用户手册:对需求分析阶段编写的用户手册进行补充。(4) 修订测试计划:对测试策略、方法和步骤提出明确要求。
第4章 结构化软件设计 • 过程:7.评审 在该阶段,对设计部分是否完整地实现了需求中规定的功能、性能等要求,设计方案的可行性、关键的处理和内外部接口定义正确性、有效性以及各部分之间的一致性等,都一一进行评审。
第4章 结构化软件设计 • 过程:7.评审※需求确认:确认所设计的软件是否覆盖了所有已确定的软件需求;※接口确认:确认该软件的内部接口与外部接口是否已经明确定义;※模块确认:确认所设计的模块是否满足高内聚性、低耦合度的要求,模块的作用范围是否在其控制范围之内;
第4章 结构化软件设计 • 过程:7.评审※风险性:该设计在现有技术条件下和预算范围内是否能按时实现;※实用性:该设计对于需求的解决是否实用;※可维护性:该设计是否考虑了今后的可维护性;※质量:该设计是否表现出了良好的质量特征。
4.3 软件结构化设计 第4章 结构化软件设计 • 模块化概念:模块是指一个独立命名的,拥有明确定义的输入、输出和特性的程序实体。在高级语言中,模块具体表现为函数、子程序、过程等。
第4章 结构化软件设计 1.模块化模块化是指将整个程序划分为若干个模块,每个模块用于实现一个特定的功能。划分模块对于解决大型复杂的问题是非常必要的,可以大大降低解决问题的难度。
第4章 结构化软件设计 设C(x)为问题x所对应的复杂度函数,E(x)为解决问题x所需要的工作量函数。对于两个问题P1和P2,如果:C(P1)> C(P2)即问题P1的复杂度比P2高,则显然有:E(P1)> E(P2)即解决问题P1比P2所需的工作量大。
第4章 结构化软件设计 在人们解决问题的过程中,发现存在有另一个有趣的规律:C(P1+P2)> C(P1)+C(P2)即解决由多个问题复合而成的大问题的复杂度大于单独解决各个问题的复杂度之和。也就是说,对于一个复杂问题,将其分解成多个小问题分别解决比较容易。
第4章 结构化软件设计 由此我们可以推出:E(P1+P2)> E(P1)+E(P2)即将复杂问题分解成若干个小问题,各个击破,所需要的工作量小于直接解决复杂问题所需的工作量。
第4章 结构化软件设计 根据上面的推理,我们可以得到这样一个结论,模块化可以降低解决问题的复杂度,从而降低软件开发的工作量。但是不是模块划分得越多越好呢?虽然增加程序中的模块数可以降低开发每个模块的工作量,但同时却增加了设计模块接口的工作量。
第4章 结构化软件设计 图模块数与软件开发成本
第4章 结构化软件设计 通过上图所示的模块数与软件开发成本的关系图中可以看出,当划分的模块数处于最小成本区时,开发软件的总成本最低。虽然目前还不能得到模块数M的精确取值,但总成本曲线对我们进行模块划分具有重要的指导意义。模块化不但可以降低软件开发的难度,而且可以使程序结构清晰,增加易读性和易修改性。此外,模块化还有利于提高代码的可重用性及团队合作开发大型软件的可行性。
第4章 结构化软件设计 2.抽象化 抽象是指将现实世界中具有共性的一类事物的相似的、本质的方面集中概括起来,而暂时忽略它们之间的细节差异。在软件开发中运用抽象的概念,可以将复杂问题的求解过程分层,在不同的抽象层上实现难度的分解。
第4章 结构化软件设计 结构化程序中自顶向下、逐步求精的模块划分思想正是人类思维中运用抽象方法解决复杂问题的体现。软件结构中顶层的模块抽象级别最高,控制并协调软件的主要功能且影响全局;软件结构中位于底层的模块抽象级别最低,具体实现数据的处理过程。采用自顶向下、由抽象到具体的思维方式,不但降低了软件开发中每个阶段的工作难度,简化了软件的设计和实现过程,还有助于提高软件的可读性、可测试性和可维护性。
第4章 结构化软件设计 3.信息隐蔽信息隐蔽是指一个模块将自身的内部信息向其他模块隐藏起来,以避免其他模块不恰当的访问和修改,只有对那些为了完成系统功能所必须的数据交换才被允许在模块间进行。信息隐蔽的目的主要是为了提高模块的独立性,减少将一个模块中的错误扩散到其他模块的机会。但信息隐蔽并不意味着某个模块中的内部信息对其他模块来说是完全不可见或不能使用的,而是说模块之间的信息传递只能通过合法的调用接口来实现。
第4章 结构化软件设计 • 模块的独立性:模块的独立性是指不同模块之间的相互联系应尽可能的少,应尽可能减少公共的变量和数据结构;一个模块应尽可能在逻辑上独立,有完整单一的功能。 良好的模块设计追求强内聚性,弱耦合度。
第4章 结构化软件设计 1.耦合度 耦合度是对一个软件结构内部不同模块间联系紧密程度的度量指标。 由于模块间的联系是通过模块接口实现的,因此,模块耦合性的高低主要取决于模块接口的复杂程度、调用模块的方式以及通过模块接口的数据。模块间的耦合性主要可划分为如下几种类型。
第4章 结构化软件设计 (1) 数据耦合。若两个模块之间仅通过模块参数交换信息,且交换的信息全部为简单数据,则称这种耦合为数据耦合。
第4章 结构化软件设计 sum(int a,int b){int c; c=a+b; return(c);} main(){int x,y; printf("x+y= %d",sum(x,y));}/*主函数与sum函数之间即为数据耦合关系*/
第4章 结构化软件设计 (2) 控制耦合。若模块之间交换的信息中包含有控制信息(尽管有时控制信息是以数据的形式出现的),则称这种耦合为控制耦合。
第4章 结构化软件设计 void output(flag){ if (flag) printf("OK! "); else printf("NO! ");}main(){ int flag; output(flag); }/*主函数与output函数之间即为控制耦合关系*/
第4章 结构化软件设计 (3) 公共耦合。若两个或多个模块通过引用公共数据相互联系,则称这种耦合为公共耦合。
示例: int a , b ; int f1( int x) { . . . } int c , d ; void main ( void ) { . . . } 第4章 结构化软件设计 a , b 有效 c , d 有效
第4章 结构化软件设计 (4) 内容耦合。若一个模块对另一模块中的内容(包括数据和程序段)进行了直接的引用甚至修改,或通过非正常入口进入到另一模块内部,或一个模块具有多个入口,或两个模块共享一部分代码,则称模块间的这种耦合为内容耦合。
示例: f1( ) { . . . } f2 ( ) { . . . } 第4章 结构化软件设计
第4章 结构化软件设计 耦合度是影响软件复杂度的一个重要因素,设计过程中应力求降低程序的耦合度。在以上所介绍的耦合中,数据耦合的程度最低,其次是控制耦合,再其次是公共耦合,程度最高的是内容耦合。
第4章 结构化软件设计 2.内聚性 内聚性是对一个模块内部各个组成元素之间相互结合的紧密程度的度量指标。
第4章 结构化软件设计 (1) 偶然内聚。若一个模块由多个完成不同任务的语句段组成,各语句段之间的联系十分松散或根本没有任何联系,则称此模块的内聚为偶然内聚。 例如,程序中多处出现一些无联系的语句段序列,为了节省内存空间将其组合成为一个模块,这个模块就属于偶然内聚。
第4章 结构化软件设计 (2) 逻辑内聚。若一个模块可实现多个逻辑上相同或相似的一类功能,则称该模块的内聚为逻辑内聚。 例如,将程序中多种不同类型数据的输出放在同一个模块中实现。
第4章 结构化软件设计 (3) 时间内聚。若一个模块包含了需要在同一时间段中执行的多个任务,则称该模块的内聚为时间内聚。 例如,将多个变量的初始化放在同一个模块中实现,或将需要同时使用的多个库文件的打开操作放在同一个模块中,都会产生时间内聚的模块。
第4章 结构化软件设计 (4) 过程内聚。若一个模块中的各个部分相关,并且必须按特定的次序执行,则称该模块的内聚为过程内聚。 例如,如果采用程序流程图作为详细设计的工具,这样得到的模块往往具有过程内聚的特性。