软件设计基本概念.ppt

上传人:xt****7 文档编号:6051954 上传时间:2020-02-15 格式:PPT 页数:72 大小:878.50KB
返回 下载 相关 举报
软件设计基本概念.ppt_第1页
第1页 / 共72页
软件设计基本概念.ppt_第2页
第2页 / 共72页
软件设计基本概念.ppt_第3页
第3页 / 共72页
点击查看更多>>
资源描述
第2章软件设计基本概念 2 1设计过程2 2设计原理2 3启发规则 软件设计宣言 MitchKapor 什么是设计 设计是你站在两个世界 技术世界和人类的目标世界 而你尝试将这两个世界结合在一起 罗马建筑批评家Vitruvius提出的观念 设计良好的建筑应该展示出坚固 适用和令人赏心悦目 设计阶段 从工程管理的角度 可以将软件设计分为概要设计阶段和详细设计阶段 从技术的角度 传统的结构化方法将软件设计划分为体系结构设计 数据设计 接口设计和过程设计4部分 面向对象方法则将软件设计划分为体系结构设计 类设计 数据设计 接口设计和构件级设计4部分 结构化设计和结构化分析的关系 总体设计过程 首先寻找实现目标系统的各种不同的方案 然后分析员从这些供选择的方案中选取若干个合理的方案 从中选出一个最佳方案向用户和使用部门负责人推荐 分析员应该进一步为这个最佳方案设计软件结构 进行必要的数据库设计 确定测试要求并且制定测试计划 必要性 总体设计可以站在全局高度上 花较少成本 从较抽象的层次上分析对比多种可能的系统实现方案和软件结构 从中选出最佳方案和最合理的软件结构 从而用较低成本开发出较高质量的软件系统 5 1设计过程 由两个主要阶段组成 系统设计阶段 确定系统的具体实现方案设想供选择的方案选取合理的方案推荐最佳方案结构设计阶段 确定软件结构功能分解设计软件结构设计数据库 制定测试计划书写文档审查和复审 典型的总体设计过程包括下述9个步骤 1 设想供选择的方案根据需求分析阶段得出的数据流图考虑各种可能的实现方案 力求从中选出最佳方案 2 选取合理的方案从前一步得到的一系列供选择的方案中选取若干个合理的方案 对每个合理的方案分析员都应该准备下列4份资料 系统流程图 组成系统的物理元素清单 成本 效益分析 实现这个系统的进度计划 3 推荐最佳方案分析员应该综合分析对比各种合理方案的利弊 推荐一个最佳的方案 并且为推荐的方案制定详细的实现计划 4 功能分解首先进行结构设计 然后进行过程设计 结构设计确定程序由哪些模块组成 以及这些模块之间的关系 过程设计确定每个模块的处理过程 结构设计是总体设计阶段的任务 过程设计是详细设计阶段的任务 5 设计软件结构通常程序中的一个模块完成一个适当的子功能 应该把模块组织成良好的层次系统 软件结构可以用层次图或结构图来描绘 如果数据流图已经细化到适当的层次 则可以直接从数据流图映射出软件结构 这就是面向数据流的设计方法 6 设计数据库对于需要使用数据库的那些应用系统 软件工程师应该在需求分析阶段所确定的系统数据需求的基础上 进一步设计数据库 7 制定测试计划在软件开发的早期阶段考虑测试问题 能促使软件设计人员在设计时注意提高软件的可测试性 8 书写文档应该用正式的文档记录总体设计的结果 在这个阶段应该完成的文档通常有下述几种 1 系统说明 2 用户手册 3 测试计划 4 详细的实现计划 5 数据库设计结果 9 审查和复审最后应该对总体设计的结果进行严格的技术审查和管理复审 5 2设计原理5 2 1模块化 模块 是由边界元素限定的相邻程序元素的序列 而且有一个总体标识符代表它 模块化 就是把程序划分成独立命名且可独立访问的模块 每个模块完成一个子功能 把这些模块集成起来构成一个整体 可以完成指定的功能满足用户的需求 为什么要模块化 模块化是为了使一个复杂的大型程序能被人的智力所管理 软件应该具备的惟一属性 如果一个大型程序仅由一个模块组成 它将很难被人所理解 模块化的根据 如果C P1 C P2 显然E P1 E P2 根据人类解决一般问题的经验 C P1 P2 C P1 C P2 综上所述 得到下面的不等式E P1 P2 E P1 E P2 每个程序都相应地有一个最适当的模块数目M 使得系统的开发成本最小 模块化和软件成本 模块化的作用 采用模块化原理可以使软件结构清晰 不仅容易设计也容易阅读和理解 模块化使软件容易测试和调试 因而有助于提高软件的可靠性 模块化能够提高软件的可修改性 模块化也有助于软件开发工程的组织管理 5 2 2抽象 抽象 现实世界中一定事物 状态或过程之间总存在着某些相似的方面 共性 把这些相似的方面集中和概括起来 暂时忽略它们之间的差异 这就是抽象 抽象就是抽出事物本质特性而暂时不考虑细节 抽象是人类处理复杂问题的基本方法之一 GradyBoach 一般抽象过程 处理复杂系统的惟一有效的方法是用层次的方式构造和分析它 一个复杂的动态系统首先可以用一些高级的抽象概念构造和理解 这些高级概念又可以用一些较低级的概念构造和理解 如此进行下去 直至最低层次的具体元素 例 过程抽象 数据抽象 开 行为抽象 门 数据抽象 19 形体 衣着 性格 抽象 抽象例子 外表 软件工程抽象过程 软件工程过程的每一步都是对软件解法的抽象层次的一次精化 在可行性研究阶段 软件作为系统的一个完整部件 在需求分析期间 软件解法是使用在问题环境内熟悉的方式描述的 当由总体设计向详细设计过渡时 抽象的程度也就随之减少了 最后 当源程序写出来以后 也就达到了抽象的最低层 5 2 3逐步求精 逐步求精 为了能集中精力解决主要问题而尽量推迟对问题细节的考虑 逐步求精是人类解决复杂问题时采用的基本方法 也是许多软件工程技术的基础 Miller法则 一个人在任何时候都只能把注意力集中在 7 2 个知识块上 22 逐步求精 外表 形体 衣着 性格 头发 脸形 领带 抽象 逐步求精的例子 例 用筛选法求100以内的素数 所谓的筛选法 就是从2到100中去掉2 3 5 7的倍数 剩下的就是100以内的素数 首先按程序功能写出一个框架main 建立2到100的数组A 其中A i i 1建立2到10的素数表B 存放2到10以内的素数 2若A i i是B 中任一数的倍数 则剔除A i 3输出A 中所有没有被剔除的数 4 上述框架中每一个加工语句都可进一步细化main 建立2到100的数组A 其中A i i 1for i 2 i 100 i A i i 建立2到10的素数表B 存放2到10以内的素数 2B 1 2 B 2 3 B 3 5 B 4 7 若A i i是B 中任一数的倍数 则剔除A i 3for j 1 j 4 j 检查A 所有数能否被B j 整除并将其从A 剔除 3 1 输出A 中所有没有被剔除的数 4for i 2 i 100 i 若A i 没有被剔除 则输出之 4 1 继续对3 1和4 1细化 直到每个语句都能用程序设计语言来表示 逐步求精的作用 它能帮助软件工程师把精力集中在与当前开发阶段最相关的那些方面上 而忽略那些对整体解决方案来说虽然是必要的 然而目前还不需要考虑的细节 逐步求精方法确保每个问题都将被解决 而且每个问题都将在适当的时候被解决 但是 在任何时候一个人都不需要同时处理7个以上知识块 Wirth本人对逐步求精策略的概括说明 我们对付复杂问题的最重要的办法是抽象 因此 对一个复杂的问题不应该立刻用计算机指令 数字和逻辑符号来表示 而应该用较自然的抽象语句来表示 从而得出抽象程序 抽象程序对抽象的数据进行某些特定的运算并用某些合适的记号 可能是自然语言 来表示 对抽象程序做进一步的分解 并进入下一个抽象层次 这样的精细化过程一直进行下去 直到程序能被计算机接受为止 这时的程序可能是用某种高级语言或机器指令书写的 5 2 4信息隐藏和局部化 信息隐藏 应该这样设计和确定模块 使得一个模块内包含的信息 过程和数据 对于不需要这些信息的模块来说 是不能访问的 局部化 局部化的概念和信息隐藏概念是密切相关的 所谓局部化是指把一些关系密切的软件元素物理地放得彼此靠近 显然 局部化有助于实现信息隐藏 信息隐藏和局部化的作用 隐藏 意味着有效的模块化可以通过定义一组独立的模块而实现 这些独立的模块彼此间仅仅交换那些为了完成系统功能而必须交换的信息 使用信息隐藏原理作为模块化系统设计的标准就会带来极大好处 因为绝大多数数据和过程对于软件的其他部分而言是隐藏的 在修改期间由于疏忽而引入的错误就很少可能传播到软件的其他部分 5 2 5模块独立 模块独立 模块独立的概念是模块化 抽象 信息隐藏和局部化概念的直接结果 希望这样设计软件结构 使得每个模块完成一个相对独立的特定子功能 并且和其他模块之间的关系很简单 模块独立的重要性 有效的模块化 即具有独立的模块 的软件比较容易开发出来 这是由于能够分割功能而且接口可以简化 当许多人分工合作开发同一个软件时 这个优点尤其重要 独立的模块比较容易测试和维护 这是因为相对说来 修改设计和程序需要的工作量比较小 错误传播范围小 需要扩充功能时能够 插入 模块 模块独立程度的两个定性标准度量 耦合衡量不同模块彼此间互相依赖 连接 的紧密程度 耦合要低 即每个模块和其他模块之间的关系要简单 内聚衡量一个模块内部各个元素彼此结合的紧密程度 内聚要高 每个模块完成一个相对独立的特定子功能 1 耦合耦合 是对一个软件结构内不同模块之间互连程度的度量 要求 在软件设计中应该追求尽可能松散耦合的系统 可以研究 测试或维护任何一个模块 而不需要对系统的其他模块有很多了解 模块间联系简单 发生在一处的错误传播到整个系统的可能性就很小 模块间的耦合程度强烈影响系统的可理解性 可测试性 可靠性和可维护性 耦合程度的度量 1 非直接耦合 完全独立 nodirectcoupling 如果两个模块中的每一个都能独立地工作而不需要另一个模块的存在 那么它们完全独立 在一个软件系统中不可能所有模块之间都没有任何连接 2 数据耦合 datacoupling 如果两个模块彼此间通过参数交换信息 而且交换的信息仅仅是数据 那么这种耦合称为数据耦合 评价 系统中至少必须存在这种耦合 一般说来 一个系统内可以只包含数据耦合 数据耦合是理想的目标 维护更容易 对一个模块的修改不会是另一个模块产生退化错误 3 控制耦合 controlcoupling 如果两个模块彼此间传递的信息中有控制信息 这种耦合称为控制耦合 评价 控制耦合往往是多余的 把模块适当分解之后通常可以用数据耦合代替它 被调用的模块需知道调用模块的内部结构和逻辑 降低了重用的可能性 4 特征耦合 stampcoupling 当把整个数据结构作为参数传递而被调用的模块只需要使用其中一部分数据元素时 就出现了特征耦合 评价 被调用的模块可使用的数据多于它确实需要的数据 这将导致对数据的访问失去控制 从而给计算机犯罪提供了机会 无论何时把指针作为参数进行传递 都应该仔细检查该耦合 5 公共环境耦合 commoncoupling 当两个或多个模块通过一个公共数据环境相互作用时 它们之间的耦合称为公共环境耦合 公共环境可以是全程变量 共享的通信区 内存的公共覆盖区 任何存储介质上的文件 物理设备等等 公共环境耦合的类型 一个模块往公共环境送数据 另一个模块从公共环境取数据 数据耦合的一种形式 是比较松散的耦合 两个模块都既往公共环境送数据又从里面取数据 这种耦合比较紧密 介于数据耦合和控制耦合之间 例 while global variable 0 if argument xyz 25 module 3 elsemodule 4 评价 与结构化编程矛盾 生成的代码完全不可读 如果在一个模块中对一个全局变量的声明进行修改 必须修改能够访问该全局变量的每一个模块 公共环境耦合的模块难于重用 必须提供一个全局变量的清单 即使模块本身不改变 它和产品中其他模块之间公共环境耦合的实例数也会变化非常大 潜在危险很大 模块暴露出必需要更多的数据 难以控制数据存取 而且会导致计算机犯罪 有些情况下公共环境耦合更好 函数可重入的概念 可重入函数也可以这样理解 重入即表示重复进入 首先它意味着这个函数可以被中断 其次意味着它除了使用自己栈上的变量以外不依赖于任何环境 包括static 这样的函数就是purecode 纯代码 可重入 可以允许有该函数的多个副本在运行 由于它们使用的是分离的栈 所以不会互相干扰 如果确实需要访问全局变量 包括static 一定要注意实施互斥手段 可重入函数在并行运行环境中非常重要 但是一般要为访问全局变量付出一些性能代价 6 内容耦合 contentcoupling 最高程度的耦合是内容耦合 如果出现下列情况之一 两个模块间就发生了内容耦合 一个模块访问另一个模块的内部数据 一个模块不通过正常入口转到另一个模块的内部 两个模块有一部分程序代码重叠 一个模块有多个入口 耦合是影响软件复杂程度的一个重要因素 应该采取下述设计原则 尽量使用数据耦合 少用控制耦合和特征耦合 限制公共环境耦合的范围 完全不用内容耦合 2 内聚内聚 标志一个模块内各个元素彼此结合的紧密程度 它是信息隐藏和局部化概念的自然扩展 简单地说 理想内聚的模块只做一件事情 要求 设计时应该力求做到高内聚 通常中等程度的内聚也是可以采用的 而且效果和高内聚相差不多 但是 低内聚不要使用 内聚和耦合是密切相关的 模块内的高内聚往往意味着模块间的松耦合 实践表明内聚更重要 应该把更多注意力集中到提高模块的内聚程度上 内聚程度的度量 1 偶然内聚 coincidentalcohesion 如果一个模块完成一组任务 这些任务彼此间即使有关系 关系也是很松散的 就叫做偶然内聚 评价 模块内各元素之间没有实质性联系 很可能在一种应用场合需要修改这个模块 在另一种应用场合又不允许这种修改 从而陷入困境 可理解性差 可维护性产生退化 模块是不可重用的 解决方案 将模块分成更小的模块 每个小模块执行一个操作 2 逻辑内聚 logicalcohesion 如果一个模块完成的任务在逻辑上属于相同或相似的一类 则称为逻辑内聚 评价 接口难以理解 造成整体上不易理解 完成多个操作的代码互相纠缠在一起 即使局部功能的修改有时也会影响全局 导致严重的维护问题 难以重用 解决方案 模块分解 3 时间内聚 temporalcohesion 如果一个模块包含的任务必须在同一段时间内执行 就叫时间内聚 评价 时间关系在一定程度上反映了程序某些实质 所以时间内聚比逻辑内聚好一些 模块内操作之间的关系很弱 与其他模块的操作却有很强的关联 时间内聚的模块不太可能重用 4 过程内聚 proceduralcohesion 如果一个模块内的处理元素是相关的 而且必须以特定次序执行 则称为过程内聚 使用程序流程图作为工具设计软件时 常常通过研究流程图确定模块的划分 这样得到的往往是过程内聚的模块 评价 比时间内聚好 至少操作之间是过程关联的 仍是弱连接 不太可能重用模块 解决方案 分割为单独的模块 每个模块执行一个操作 5 通信内聚 communicationalcohesion 如果模块中所有元素都使用同一个输入数据和 或 产生同一个输出数据 则称为通信内聚 即在同一个数据结构上操作 评价 模块中各操作紧密相连 比过程内聚更好 不能重用 解决方案 分成多个模块 每个模块执行一个操作 6 顺序内聚 sequentialcohesion 如果一个模块内的处理元素和同一个功能密切相关 而且这些处理必须顺序执行 则称为顺序内聚 评价 根据数据流图划分模块时 通常得到顺序内聚的模块 这种模块彼此间的连接往往比较简单 7 功能内聚 functionalcohesion 如果模块内所有处理元素属于一个整体 完成一个单一的功能 则称为功能内聚 功能内聚是最高程度的内聚 评价 模块可重用 应尽可能重用 可隔离错误 维护更容易 扩充产品功能时更容易 七种内聚的优劣评分结果 高内聚 功能内聚10分顺序内聚9分中内聚 通信内聚7分过程内聚5分低内聚 时间内聚3分逻辑内聚1分偶然内聚0分设计时力争做到高内聚 并且能够辨认出低内聚的模块 5 3启发规则 1 改进软件结构提高模块独立性通过模块分解或合并 降低耦合提高内聚 两个方面 模块功能完善化 一个完整的模块包含 执行规定的功能的部分出错处理的部分返回一个 结束标志 消除重复功能 改善软件结构 完全相似局部相似 2 模块规模应该适中经验表明 一个模块的规模不应过大 最好能写在一页纸内 通常规定50 100行语句 最多不超过500行 数字只能作为参考 根本问题是要保证模块的独立性 过大的模块往往是由于分解不充分 但是进一步分解必须符合问题结构 一般说来 分解后不应该降低模块独立性 过小的模块开销大于有效操作 而且模块数目过多将使系统接口复杂 3 深度 宽度 扇出和扇入都应适当深度 软件结构中控制的层数 它往往能粗略地标志一个系统的大小和复杂程度 宽度 软件结构内同一个层次上的模块总数的最大值 扇出 一个模块直接控制 调用 的模块数目 扇入 有多少个上级模块直接调用它 4 模块的作用域应该在控制域之内模块的作用域 定义为受该模块内一个判定影响的所有模块的集合 模块的控制域 是这个模块本身以及所有直接或间接从属于它的模块的集合 在一个设计得很好的系统中 所有受判定影响的模块应该都从属于做出判定的那个模块 最好局限于做出判定的那个模块本身及它的直属下级模块 解决方案 把模块A中的判定移到模块M中 把模块G移到模块A下面 作为他的下级模块 5 力争降低模块接口的复杂程度模块接口复杂是软件发生错误的一个主要原因 应该仔细设计模块接口 使得信息传递简单并且和模块的功能一致 例 解一元二次方程的函数QUAD ROOT TBL X 其中数组TBL传送方程的系数数组X送回求得的根QUAD ROOT A B C ROOT1 ROOT2 6 设计单入口单出口的模块警告软件工程师不要使模块间出现内容耦合 当从顶部进入模块并且从底部退出来时 软件是比较容易理解的 因此也是比较容易维护的 7 模块功能应该可以预测模块的功能应该能够预测 但也要防止模块功能过分局限 功能可预测 如果一个模块可以当做一个黑盒子 只要输入的数据相同就产生同样的输出 这个模块的功能就是可以预测的
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!