软件工程导论第六版 第五章 总体设计知识点总结

2023-10-26

总体设计概述

目的

总体设计的基本目的就是回答“概括地说,系统应该如何实现”这个问题。因此,总体设计又称为概要设计或初步设计。

任务

划分出组成系统的物理元素——程序、文件、数据库、人工过程和文档等(但是每个物理元素仍然处于黑盒子级,这些黑盒子里的具体内容将在以后仔细设计)
② 总体设计阶段的另一项重要任务是设计软件的结构,也就是要确定系统中每个程序是由哪些模块组成的,以及这些模块相互间的关系。

设计过程

总体设计过程通常由两个主要阶段组成

  • 系统设计阶段(确定系统的具体实现方案)
  • 结构设计阶段(确定软件结构)。

典型的总体设计过程包括以下9个步骤:

  • 设想供选择的方案。需求分析阶段得出的数据流图是总体设计的极好的出发点(上一阶段的DFD在本阶段细化之后可以被下一阶段使用)
  • 选取合理的方案
  • 推荐最佳方案
  • 功能分解。功能分解导致数据流图的进一步细化,同时还应该用IPO图或其他适当的工具简要描述细化后每个处理的算法。
  • 设计软件结构。通常程序中的一个模块完成一个适当的子功能。应该把模块组织成良好的层次系统,顶层模块调用它的下层模块以实现程序的完整功能,每个下层模块再调用更下层的模块从而完成程序的一个子功能,最下层的模块完成最具体的功能软件结构(即由模块组成的层次系统)可以用层次图或结构图来描绘
  • 设计数据库
  • 制定测试计划
  • 书写文档
  • 审查和复审

设计原理

什么是模块?什么是模块化?

答:模块是由边界元素限定的相邻程序元素序列,而且有一个总体标识符代表它。像C、C++和Java语言中的{…}对,都是边界元素的例子。按照模块的定义,函数、子程序都可作为模块。面向对象方法学中的对象是模块,对象内的方法也是模块。模块是构成程序的基本构件。
模块化就是把程序划分成为独立命名且可以独立访问的模块,每个模块完成一个子功能,把所有的模块集成起来构成一个整体,可以完成指定的功能,满足用户的需求。

模块化的优点

  • 采用模块化原理可以使软件结构清晰,不仅容易设计也容易阅读和理解。
  • 因为程序错误通常局限在有关的模块及它们之间的接口中,所以模块化使软件容易测试和调试,因而有助于提高软件的可靠性。
  • 因为变动往往只涉及少数几个模块,所以模块化能够提高软件的可修改性。
  • 模块化也有助于软件开发工程的组织管理,一个复杂的大型程序可以由许多程序员分工编写不同的模块,并且可以进一步分配技术熟练的程序员编写困难的模块。

模块化和软件成本

如果无限地分割软件,最后为了开发软件而需要的工作量就小得可以忽略了。上述结论不能成立,如下图,当模块数目增加时每个模块的规模将减小,开发单个模块需要的成本确实减少了,但是随着模块数目增加,设计模块间接口所需要的工作量也将增加。根据这两个因素。得出了图中的总成本曲线。每个程序都相应地有一个最适当的模块数目M,使得系统的开发成本最小。
在这里插入图片描述

逐步求精

什么是逐步求精?

可以把逐步求精定义为:“为了能集中精力解决主要问题而尽量推迟对问题细节的考虑。”事实上,可以把逐步求精看作是一项把一个时期内必须解决的种种问题按优先级排序的技术,逐步求精方法确保每个问题都将被解决,而且每个问题都将在适当的时候被解决。

Miller法则

逐步求精之所以如此重要,是因为人类的认知过程遵守 Miller法则 : 一个人在任何时候都只能把注意力集中在7士2个知识块上。Miller法则是人类智力的基本局限,人们不可能战胜自己的自然本性,只能接受这个事实,承认自身的局限性,并在这个前提下尽自己的最大努力工作。

抽象

抽象与求精是一对互补的概念。抽象使得设计者能够说明过程和数据,同时却忽略了低层细节。事实上,可以把抽象看作是一种通过忽略多余的细节同时强调有关的细节,而实现逐步求精的方法。求精则帮助设计者在设计过程中逐步揭示出低层细节。

信息隐藏和局部化

什么是信息隐藏

信息隐藏原理指出:一个模块内包含的信息(过程和数据)对于不需要这些信息的模块来说,是不能访问的。

信息隐藏的优点

  • 如果在测试期间和以后的软件维护期间需要修改软件,使用信息隐藏原理作为模块化系统设计的标准会带来极大好处。(有利于软件的修改)
  • 由于绝大多数数据和过程对于软件的其他部分而言是隐藏的,在修改期间由于疏忽而引入的错误就很少可能传播到软件的其他部分。(防止错误的扩大和传播)

模块独立

模块独立的概念是模块化、抽象、信息隐藏和局部化概念的直接结果。
模块的独立程度可以由两个定性标准度量,这两个标准分别称为内聚耦合。耦合衡量不同模块彼此间互相连接的紧密程度;内聚衡量一个模块内部各个元素彼此结合的紧密程度。

耦合

耦合是对一个软件结构内不同模块之间互连程度的度量。在软件设计中应该追求尽可能松散耦合的系统(由于模块间联系简单,发生在一处的错误传播到整个系统的可能性就很小)。

耦合分为以下几类:(耦合程度由低到高:无-数-标-控-外-公-内)

  • 无直接耦合。如果两个模块中的每一个都能独立地工作而不需要另一个模块的存在,那么它们彼此完全独立,这意味着模块间无任何连接,耦合程度最低。但是,在一个软件系统中不可能所有模块之间都没有任何连接。
  • 数据耦合。如果两个模块彼此间通过参数交换信息,而且交换的信息仅仅是数据,那么这种耦合称为数据耦合。
  • 控制耦合。如果传递的信息中有控制信息(尽管有时这种控制信息以数据的形式出现),则这种耦合称为控制耦合。
  • 外部耦合。
  • 公共耦合。当两个或多个模块通过一个公共数据环境相互作用时,它们之间的耦合称为公共环境耦合。
  • 内容耦合。最高程度的耦合是内容耦合,应该坚决避免使用内容耦合。
  • 特征耦合。当把整个数据结构作为参数传递而被调用的模块只需要使用其中一部分数据元素时,就出现了特征耦合。在这种情况下,被调用的模块可以使用的数据多于它确实需要的数据,这将导致对数据的访问失去控制,从而给计算机犯罪提供了机会。

内聚(内聚程度由低到高:偶-逻-时-过-通-顺-功)

内聚标志着一个模块内各个元素彼此结合的紧密程度,设计时应该力求做到高内聚,内聚和耦合是密切相关的,模块内的高内聚往往意味着模块间的松耦合。模块化设计的原则一般遵循:高内聚、低耦合。

内聚分为以下几类:

  • 偶然内聚:0分
  • 逻辑内聚:1分
  • 时间内聚:3分
  • 过程内聚:5分
  • 通信内聚:7分
  • 顺序内聚:9分
  • 功能内聚:10分

启发规则

  • 改进软件结构提高模块独立性
  • 模块规模应该适中
  • 深度、宽度、扇出和扇入都应适当。深度表示软件结构中控制的层数,它往往能粗略地标志一个系统的大小和复杂程度。宽度是软件结构内同一个层次上的模块总数的最大值。一般说来,宽度越大系统越复杂。对宽度影响最大的因素是模块的扇出
    在这里插入图片描述
    扇出是一个模块直接控制(调用)的模块数目,扇出过大意味着模块过分复杂,需要控制过多的下级模块;扇出过小也不好。经验表明,一个设计得好的典型系统的平均扇出通常是3或4(扇出的上限通常是5~9)。
    在这里插入图片描述
    一个模块的扇人表明有多少个上级模块直接调用它,扇入越大则共享该模块的上级模块数目越多,这是有好处的(扇入可以影响模块的复用率)。但是,不能违背模块独立原理单纯追求高扇人。
  • 模块的作用域应该在控制域之内
  • 力争降低模块接口的复杂程度
  • 设计单入口单出口的模块
  • 模块功能应该可以预测

面向数据流的设计方法

通常用数据流图描绘信息在系统中加工流动的情况。
因为 任何软件系统都可以用数据流图表示,所以面向数据流的设计方法理论上可以设计任何软件的结构。通常所说的结构化设计方法(简称SD方法),也是基于数据流的设计方法。
面向数据流的设计方法把 信息流 映射成 软件结构
信息流有两种类型,分别是变换流事务流

需要注意的是:
交换流是线性的、顺序的
在这里插入图片描述
事务流是分支的
下图中T称为事务中心,它完成下述任务。

  • 接收输入数据(输入数据又称为事务)
  • 分析每个事务以确定它的类型
  • 根据事务类型选取一条分支(活动通路)
    在这里插入图片描述66

总结

1、总体设计阶段的基本目的是用比较抽象概括的方式确定系统如何完成预定的任务。因此,总体设计阶段主要由两个小阶段组成。首先需要进行系统设计,然后进行软件结构设计

2、在软件结构设计中,层次图和结构图是描绘软件结构的常用工具

3、自顶向下逐步求精是进行软件结构设计的常用途径。但是,如果已经有了详细的数据流图,也可以使用面向数据流的设计方法,用形式化的方法由数据流图映射出软件结构。 应该记住,这样映射出来的只是软件的初步结构,还必须根据设计原理并且参考启发式规则,认真分析和改进软件的初步结构,以得到质量更高的模块和更合理的软件结构。(数据流图的作用 —— 软件结构设计)

本章练习

1、模块是构成程序的基本构件。

2、模块是构成程序的基本构件。

3、如果无限地分割软件,最后为了开发软件而需要的工作量就小得可以忽略了。(×)

4、数据耦合可有可无。(×)
(数据耦合是低耦合。系统中至少必须存在数据耦合,因为只有当某些模块的输出数据作为另一些模块的输人数据时,系统才能完成有价值的功能)

5、控制耦合通常可以被数据耦合代替。(√)
(控制耦合是中等程度的耦合,它增加了系统的复杂程度。控制耦合往往是多余的,在把模块适当分解之后 通常可以用数据耦合代替控制耦合。)

6、任何软件系统都可以用数据流图示。(√)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

软件工程导论第六版 第五章 总体设计知识点总结 的相关文章

  • 系统开发与运行

    系统开发与运行 系统分析与设计 需求分析 需求工程 结构化分析与设计 测试基础知识 系统运行与维护 软件架构介绍 系统分析概述 系统分析是一种问题求解技术 它将一个系统分解成各个组成部分 目的是研究各个部分如何工作 交互 以实现其系统目标
  • 《人工智能导论》期末项目 - 基于CNN的花卉识别系统

    目录 一 需求和用例分析 需求分析 用例分析 二 设计和实现 设计 实现 三 数据收集 四 项目技术 对于CNN深度学习算法的解析 五 结果评估方法 1 定性评估 2 定量评估 3 统计分析方法 六 参考文献 花卉系统项目演示 1 通过tr
  • 软工导论知识框架(六)面向对象分析

    前言 绘制各种类型的图是重点 对于面向对象建模中需要绘制的图总结在第五期中 软工导论知识框架 五 面向对象方法学 一 分析过程 1 获取需求 与用户交谈 向用户提问题 参观用户的工作流程 观察用户的操作 向用户群体发调查问卷 与同行 专家交
  • 【基于深度学习的生活垃圾分类识别管理可视化系统-哔哩哔哩】 https://b23.tv/0UBohX2

    基于深度学习的生活垃圾分类识别管理可视化系统 哔哩哔哩 https b23 tv 0UBohX2 https b23 tv 0UBohX2
  • 计网学习记录,burp抓包等学习记录

    攻防实验室 网安学习记录 1 学习到html的基础架构及其简单用法 1 html基础架构 2 table 定义表格 2 学会用phpstudy创建网站 3 用wordpress对phpstudy创建的网站进行了编辑修改 4 仅通过phpst
  • idea插件生成用例图、时序图、类图、活动图

    给大家推荐一个idea生成用例图 时序图等的神器 PlantUML 最近软件工程要结课了 结课报告要附加用例图 时序图 类图 活动图等 类图我首先就想到可以用idea生成 嘿嘿 可惜忘了怎么用 搜着搜着 突然发现 idea生成时序图 用例图
  • 软件设计师--结构化开发

    结构化开发 耦合 真题 内聚 真题 设计原则 真题 系统文档 真题 数据流图 数据流图基本数据元素 外部实体 数据存储 加工 数据流 父图子图平衡 加工既要有输入数据流也要有输出数据流 数据守恒 真题 数据字典 真题 杂题精选 耦合 真题
  • 【论文阅读-ICSE-2021】CodeShovel: 构造方法级别上的源代码历史信息 Constructing Method-Level Source Code Histories

    CodeShovel Constructing Method Level Source Code Histories Conference ICSE 2021 Github https github com ataraxie codesho
  • 软件设计(十四)-UML建模(上)

    软件设计 十三 原码 反码 补码 移码https blog csdn net ke1ying article details 129115844 spm 1001 2014 3001 5501 UML建模包含 用例图 类图与对象图 顺序图
  • 软件工程期末试题及答案(史上最全)

    软件工程期末试题及答案 文章目录 软件工程期末试题及答案 一 填空题 二 选择题 三 判断题 四 简答题 五 分析题 六 画图题 一 填空题 在信息处理和计算机领域内 一般认为软件是 文库 程序 文档 和 数据 数据流图的基本组成部分有 数
  • 软件工程——软件实现

    在我们做好对软件的需求分析 设计之后 就是软件的实施部分了 主要包括软件实现 软件测试 测试方法 黑盒测试 主要是检查功能 数据 以及接口的问题 具体方法有等价划分 边界值分析 错误推断法 白盒测试 对程序所有逻辑路径进行测试 测试方法按覆
  • 什么是决策表?什么是决策树?

    决策树 是在已知各种情况发生概率的基础上 通过构成决策树来求取净现值的期望值大于等于零的概率 评价项目风险 判断其可行性的决策分析方法 是直观运用概率分析的一种图解法 这种决策分支画成图形很像一棵树的树干 故称决策树 它是一种树形结构 每个
  • 推荐111个软件工程本科的计算机毕业设计,有手就会

    对于即将挑战计算机专业毕业设计的学子们 是否已经为选题和项目感到焦虑 今天 我们为即将毕业的学生提供了大量的毕业设计项目 期望对于正在为毕业设计挠头的同学们有所助益 一 成品列表 以下所有springboot框架项目的源码博主已经打包好上传
  • 程序员要不断学习

    2016 10 20 计算机技术的发展速度还是很快的 当个人电脑赶上10年前的超算时 我们不得不感叹硬件的发展编程开发带来了很大的影响 对世界带来了很大的影响 知识和工具的更新速度还是比较快的 这就要求程序员始终需要学习 我在知乎上看到一个
  • [需求管理-4]:需求分析全过程:需求分析+资源评估+项目计划

    前言 需求收集后 需要经过漫长的需求分析和所需要评估过程 才能正式在某个软件版本中实现需求 在软件开发人员通过编程实现需求前 中间经过了多种角色的辛苦劳动 最终才会生成需要规格说明书 需求规格说明书是逐步由粗到细的分解过程 一个需求 要进入
  • git 的碎步浪荡,添加仓库子项目,迁移仓库

    1 git仓库迁移 将他人的代码仓库 xxxx 移为自己的 yyyy 仓库 先创建自己的yyyy空仓库 假设url为 yyyy git 将 xxxx 的全部数据 包括分支和 tag 都 download 到本地 git clone recu
  • 68 | 软件工程的宏观视角

    软件工程 今天开始 我们进入第六章 谈谈软件工程 我理解的架构师的职责其实是从软件工程出发的 也许大家都学过软件工程 但如果我们把软件工程这门课重新看待 这门学科到底谈的是什么 是软件项目管理的方法论 无论如何 软件工程是一门最年轻的学科
  • C++ 中 const 和 constexpr 关键字解析:常量、函数和指针

    很多 C 的初学者看到 const 这个关键字的第一反应都是一头雾水 主要是因为 const 可 以出现在很多的位置 以及后面加入的 constexpr 更是常常感到困惑 今天就为大家一一解释出现它们的含义和以及作用 const 关键字 c
  • 深入了解 Python MongoDB 操作:排序、删除、更新、结果限制全面解析

    Python MongoDB 排序 对结果进行排序 使用 sort 方法对结果进行升序或降序排序 sort 方法接受一个参数用于 字段名 一个参数用于 方向 升序是默认方向 示例 按名称按字母顺序对结果进行排序 import pymongo
  • 掌握 C# 变量:在代码中声明、初始化和使用不同类型的综合指南

    C 变量 变量是用于存储数据值的容器 在 C 中 有不同类型的变量 用不同的关键字定义 例如 int 存储整数 没有小数点的整数 如 123 或 123 double 存储浮点数 有小数点 如 19 99 或 19 99 char 存储单个

随机推荐