资源预览内容
第1页 / 共169页
第2页 / 共169页
第3页 / 共169页
第4页 / 共169页
第5页 / 共169页
第6页 / 共169页
第7页 / 共169页
第8页 / 共169页
第9页 / 共169页
第10页 / 共169页
亲,该文档总共169页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第四章结构化设计 第一节软件设计在开发阶段中的任务和地位 第二节软件设计的概念和原则第三节结构化设计第四节人机界面设计第五节详细设计 第六节面向数据结构的设计方法 在软件需求分析阶段确定了要让所开发的软件 做什么 的问题 接下来就是实现软件的需求 解决 怎样做 的问题 软件设计就是处理 怎样做 的问题 它被定义为 应用各种技术和原理 对设备 过程或系统作出足够详细的描述 使之能够在物理上的以实现 第一节软件设计在开发阶段中的任务和地位 开发阶段由设计 编码和测试三个互相关联的基本活动组成 每个活动都按照某种方式进行信息变换 软件设计是开发活动的第一步 需求规格说明书中对将要实现系统的信息 功能和行为方面的需求描述构成了软件设计的基础 从工程管理的角度看来 软件设计可划分为概要设计和详细设计两个阶段 首先做概要设计 将需求转化为软件系统结构和数据结构 然后详细设计 即过程设计 软件结构设计数据设计过程 算法 设计一个独立的界面设计活动 软件设计包括 软件结构设计是确定软件系统各主要部件之间的关系 数据设计是把信息描述转换为实现软件系统所要求的数据结构 过程 算法 设计是把结构部件转换成软件系统的过程性描述 编码是根据这种过程性描述编制代码 然后把生成的程序代码交由测试人员测试 最终得到完整有效的软件产品 软件设计是一个把软件需求逐步转换为软件源代码的过程 它提供了软件的表示 使得软件的质量评价成为可能 软件设计还是将用户要求准确地转化为最终软件产品的唯一途径 它也是后续开发活动及软件维护的基础 因而 软件设计是开发阶段最重要的活动 第二节软件设计的概念和原则 一 模块化1 模块模块或组件是指具有一定功能的可以用名字调用的程序语句集合 例如 过程 函数 子程序和宏等都可作为模块 面向对象范型中的对象是模块 对象内的方法也是模块 2 模块化模块化是将软件划分成若干个相对独立的模块 而这些模块集成起来构成一个整体 可以完成指定的功能满足用户的需求 模块化可以化繁为简 减少成本 但如果模块分得过多 会增加模块的接口成本 反而增加软件的整体成本 所以模块化的程度应该是适量的 模块是由边界元素限定的相邻的程序元素 例如 数据说明 可执行的语句 的序列 而且有一个总体标识符来代表它 像Pascal或Ada这样的块结构语言中的Begin end对 或者C C 和Java语言中的 对 都是边界元素的例子 因此 过程 函数 子程序和宏等 都可作为模块 面向对象范型中的对象 见第6章 是模块 对象内的方法也是模块 模块是构成程序的基本构件 模块化就是把程序划分成独立命名且可独立访问的模块 每个模块完成一个子功能 把这些模块集成起来构成一个整体 可以完成指定的功能满足用户的需求Meyer提出了五条标准 我们可以用这五条标准来评价一种设计方法定义有效的模块系统的能力 下面列出这五条标准 1 模块可分解性 如果一种设计方法提供了把问题分解为子问题的系统化机制 它就能降低整个问题的复杂性 从而可以实现一种有效的模块化解决方案 2 模块可组装性 如果一种设计方法能把现有的 可重用的 设计构件组装成新系统 它就能提供一种并非一切都从头开始做的模块化解决方案 3 模块可理解性 如果可以把一个模块作为一种独立单元 无需参考其他模块 来理解 那么 这样的模块是易于构造和易于修改的 4 模块连续性 如果对系统需求的微小修改只导致对个别模块 而不是对整个系统的修改 则修改所引起的副作用将最小 5 模块保护性 如果在一个模块内出现异常情况时 它的影响局限在该模块内部 则由错误引起的副作用将最小 采用模块化原理可以使软件结构清晰 不仅容易设计也容易阅读和理解 因为程序错误通常局限在有关的模块及它们之间的接口中 所以模块化使软件容易测试和调试 因而有助于提高软件的可靠性 因为变动往往只涉及少数几个模块 所以模块化能够提高软件的可修改性 模块化也有助于软件开发工程的组织管理 一个复杂的大型程序可以由许多程序员分工编写不同的模块 并且可以进一步分配技术熟练的程序员编写困难的模块 二 抽象抽象就是抽出事物的本质特性而暂时不考虑它们的细节 一个复杂的问题首先可以用一些高级的概念构造和理解 这些高级的概念又可以用一些低级概念构造和理解性 如此进行下去 直至最低层次的具体元素 这就是所谓的层次思维 即用层次的方式考虑和处理一个复杂的问题 低级概念构造和理解性 层次思维 软件工程的每一步都是对软件的较高一级抽象层的解的一次具体化的描述 在软件计划阶段 软件系统被描述为整个计算机系统中的一个部分 在软件需求分析阶段 软件用问题域约定的大家所熟悉的习惯用语描述 从概要设计向详细设计过度时 抽象级别再次被降低 编码完成后就达到最低的抽象层次 产能核算 生产产品的消耗核算 辅料核算 主料核算 优化分析 用料统计 报表 其它核算 软件结构 在这种从高级抽象到低级抽象的转换过程中 始终伴随着一系列的过程抽象和数据抽象 过程抽象把完成一个特定功能的动作序列抽象为一个过程名和参数表 并通过指定过程名和实际参数调用此过程 数据抽象把一个数据对象的描述抽象为一个数据类型名 用此类型名可以定义多个具有相同性质的数据对象 例 开发一个能够实现绘图系统全部功能的低级CAD软件包 抽象1 用问题域约定的大家所熟悉的习惯用语描述问题的解 该CAD软件具有能进行可视化通信的图形界面 能用鼠标代替绘图工具画出各种曲线和直线 能完成几何计算 截面视图和辅助视图设计 能将图形设计的结果存于图形文件中 抽象2 描述软件的任务 所用语言与问题域约定用语有所不同 但不是实现用的语言 CAD软件的任务 用户界面任务 创建二维图形任务 显示图形任务 管理图形任务 ENDCAD 抽象3 给出初步过程性描述 以创建二维图形为例 PROCEDURE创建二维图形REPEATUNTIL创建二维图形终止DOWHILE出现与数字仪交互时数字仪接口任务 判断作图请求 线 画线任务 园 画园任务 END DOWHILE出现与键盘交互时键盘接口任务 选择分析或计算 辅助视图 辅助视图任务 END ENDPRODEDURE 在此抽象层次上 所有的术语都面向软件 模块结构也开始明朗 求精过程可以继续进行下去 直至获得源代码 三 信息隐藏 软件设计应该降低模块与外部环境间的连接的复杂性 为此 D L Parnas提出了信息隐藏的基本原则 信息隐藏的基本思想 1 模块内部的数据和过程 对于那些不需要这些信息的模块不可访问 2 每一个模块只完成一个相对独立的特定的功能 3 模块之间仅仅交换那些完成系统功能必须交换的信息 将信息隐藏作为模块化系统设计的标准 为软件测试和维护提供了极大的优点 1 每个模块只完成一个相对独立的特定功能 模块之间只交换那些为完成软件功能必须交换的信息 2 模块对数据和过程处理细节的隐藏可以减少错误向外传播 3 当软件系统扩充功能时 只需要插入新模块 原有的大多数模块不必改动 四 模块独立性 模块独立性是指软件系统中的每个模块只涉及软件要求的具体子功能 而与软件系统中其他的模块的接口是简单的 模块化 首先要考虑模块如何划分 模块独立性是模块划分的一个标准 模块独立性较高的模块至少在两个优点 第一 具有独立性模块的软件比较容易开发 第二 独立的模块容易测试和维护 模块独立性的概念是模块化 抽象和信息隐藏等概念的直接结果 也是完成有效的模块设计的基本标准 模块的独立程度可以由两个定性标准来度量 这两个标准分别称为内聚和耦合 耦合衡量不同模块彼此间互相依赖 连接 的紧密程度 内聚衡量一个模块内部各个元素彼此结合的紧密程度 1 耦合 耦合强弱取决于模块间接口的复杂程度 进入或访问一个模块的点 以及通过接口的数据 一般模块之间可能的连接方式有7种 构成耦合的7种类型 不同类型耦合强弱关系为 1 非直接耦合是指两个模块中的每一个都能独立的工作而不依赖另一个模块的存在 它们之间的联系完全是通过主模块的控制和调用实现 2 数据耦合是指一个模块访问另一模块时 彼此之间通过参数表来交换输入 输出信息 而且交换的信息仅限于数据 3 标记耦合是指一组模块通过参数表传递记录信息 4 控制耦合是指一个模块通过传送开关 标志 名字等控制信息 明显地控制选择另一模块的功能 如下图所示 控制耦合 5 外部耦合是指一组模块都访问同一全局简单变量而不是同一全局数据结构 而且不是通过参数表传递该全局变量的信息 6 公共耦合是指多个模块都访问同一个公共数据环境 如下图所示 a 松散公共耦合 b 紧密公共耦合公共耦合 一个模块直接访问另一模块的内部数据 一个模块不通过正常入口转到另一模块内部 两个模块有一部分程序代码重叠 一个模块有多个入口 7 内容耦合是指下列情形之一 内容耦合 a 进入另一模块内部 b 模块代码重叠 c 多入口模块 非直接耦合的耦合程度最低 它表明模块之间无任何连接 但是 在一个软件系统不可能所有之间没有任何联系 数据耦合是低耦合 软件系统必须存在这种耦合 因为只有当某些模块的输出数据作为另一些模块的输入数据时 系统才能完成有价值的功能 标记耦合表明一组模块共享了一个记录信息 这个记录是某一数据结构的子结构 而不是简单变量 控制耦合是中等程度的耦合 它实质上是在单一接口上选择多功能模块中的某项功能 控制耦合增加了系统的复杂程度 通常把适当模块分解之后 可以用数据耦合代替它 公共耦合的公共数据环境可以是全程变量 共享通信区 内存的公共覆盖区 任何存储介质上的文件以及物理设备等 公共耦合的复杂程度随耦合的模块个数而变化 当模块个数增加时复杂程度也增加 内容耦合的耦合度最高 许多高级程序设计设计语言已经设计成不允许在程序中出现任何形式的内容耦合 耦合是影响软件复杂程度的一个重要因素 在软件设计中应该采取下述设计原则 尽量使用数据耦合 少用控制耦合 限制外部耦合和公共耦合的范围 完全不用内容耦合 2 内聚 内聚是一个模块内各个元素彼此结合的紧密程度 好内聚的模块只做一件事情 不同类型内聚的强弱关系为下图所示 1 功能内聚是指一个模块内所有处理元素属于一个整体 完成一个单一的功能 2 顺序内聚是指一个模块内的处理元素与同一个功能密切相关 且这些处理必须顺序执行 3 通信内聚是指一个模块内各功能部分都使用了相同的输入数据或产生了相同的输出数据 如下图所示 4 过程内聚是指一个模块内的处理元素是相关的 而且必须以特定的次序执行 5 时间内聚是指一个模块包含的任务必须在同一时间内执行 6 逻辑内聚是指一个模块完成逻辑上相同或相似的一组任务 如下图所示 7 偶然内聚是指一个模块完成一组任务 这组任务彼此间即使有关系 其关系也是很松散的 如下图所示 偶然内聚 逻辑内聚 设计时应该力求做到高内聚 通常中等程度的内聚也是可以采用的 而且效果和高内聚相差不多 但是 低内聚很坏 不要使用 内聚和耦合是密切相关的 模块内的高内聚往往意味着模块间的松耦合 内聚和耦合都是进行模块化设计的有力工具 但是实践表明内聚更重要 应该把更多注意力集中到提高模块的内聚程度上 事实上 没有必要精确确定内聚的级别 重要的是设计时力争做到高内聚 并且能够辨认出低内聚的模块 有能力通过修改设计提高模块的内聚程度降低模块间的耦合程度 从而获得较高的模块独立性 它是信息隐蔽概念的自然扩展 人们在开发计算机软件的长期实践中积累了丰富的经验 总结这些经验得出了一些启发式规则 这些规则往往能帮助人们找到改进软件设计 提高软件质量的途径 从而实现有效的模块化 下面介绍几条常用的启发规则 五 模块设计原则 1 提高模块独立性设计出软件初步结构之后 为了降低模块间的偶合度 提高模块内聚度 应该进一步分解或合并模块 例如 多个模块共有的一个子功能就可以单独做成一个模块 由这些模块调用 2 模块规模应该适中 通常一个模块以30 60个语句行为宜 一个模块包含的语句行数过多 模块的可理解程度将迅速下降 3 深度 宽度 扇出和扇入都应适当 1 深度是指软件结构中控制的层数 2 宽度是指软件结构中同一个层次上的模块总数的最大值
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号