软件工程导论 第5章 总体设计

合集下载

软件工程导论课件之第5章总体设计

软件工程导论课件之第5章总体设计
需要另一个模块的存在,那么它们完全独立。 n 在一个软件系统中不可能所有模块之间都没有
} n 继续对3.1和4.1细化,直到每个语句都能用程序设计语
言来表示
软件工程导论课件之第5章总体设计
逐步求精的作用: n 它能帮助软件工程师把精力集中在与当前开发
阶段最相关的那些方面上,而忽略那些对整体 解决方案来说虽然是必要的,然而目前还不需 要考虑的细节。 n 逐步求精方法确保每个问题都将被解决,而且 每个问题都将在适当的时候被解决,但是,在 任何时候一个人都不需要同时处理7个以上知 识块。
软件工程导论课件之第5章总体设计
5.2.5 模块独立
模块独立: n 模块独立的概念是模块化、抽象、信息隐藏和
局部化概念的直接结果。 n 希望这样设计软件结构,使得每个模块完成一
个相对独立的特定子功能,并且和其他模块之 间的关系很简单。
软件工程导论课件之第5章总体设计
模块独立的重要性: n 有效的模块化(即具有独立的模块)的软件比较
软件工程导论课件之第5章总体设计
n 上述框架中每一个加工语句都可进一步细化
n main() { /*建立2到100的数组A[ ],其中A[i]=i*/ ………..………1 for (i = 2;i <= 100;i++)A[i] = i; /* 建立2到10的素数表B[ ],存放2到10以内的素数*/ ….2 B[1] =2; B[2] = 3; B[3] = 5; B[4] = 7; /*若A[i]=i是B[ ]中任一数的倍数,则剔除A[i]*/ .…..….3 for (j = 1; j <= 4; j++) 检查A[]所有数能否被B[j]整除并将其从A[]剔除;.....3.1 /*输出A[ ]中所有没有被剔除的数*/ …………………….4 for (i = 2; i <= 100; i++) 若A[i]没有被剔除,则输出之……………………..…..4.1

张海藩《软件工程导论》(考研用)辅导书(总体设计)【圣才出品】

张海藩《软件工程导论》(考研用)辅导书(总体设计)【圣才出品】

第5章总体设计5.1 复习笔记一、设计过程1.目的总体设计的基本目的就是回答“系统应该如何实现”这个问题。

2.主要任务(1)划分出组成系统的物理元素——程序、文件、数据库、人工过程和文档等。

(2)确定系统中每个程序是由哪些模块组成的,以及这些模块相互间的关系。

【注意】每个物理元素的具体实现是详细阶段的任务。

3.必要性可以站在全局高度上,以较少的成本选出最佳方案和最合理的软件结构并开发出较高质量的软件系统。

4.组成阶段(1)系统设计阶段,确定系统的具体实现方案。

(2)结构设计阶段,确定软件结构。

5.典型的总体设计过程(略)二、设计原理1.模块化(1)定义模块化就是把程序划分成独立命名且可独立访问的模块,每个模块完成一个子功能,把这些模块集成起来构成一个整体,可以完成指定的功能满足用户的需求。

(2)优点①使软件结构清晰,不仅容易设计也容易阅读和理解。

②使软件容易测试和调试,有助于提高软件的可靠性。

③提高软件的可修改性。

④有助于软件开发工程的组织管理。

【注意】模块是构成程序的基本构件。

2.抽象(1)定义抽象就是抽出事物的本质特性而暂时不考虑它们的细节。

(2)优点①简化了软件的设计和实现;②提高了软件的可理解性和可测试性;③使得软件更容易维护。

3.逐步求精(1)定义定义为:为了能集中精力解决主要问题而尽量推迟对问题细节的考虑。

(2)原理①逐步求精是一种自顶向下的设计策略。

②求精实际上是细化过程。

4.信息隐藏和局部化(1)局部化定义指把一些关系密切的软件元素物理地放得彼此靠近。

(2)信息隐藏原理使得一个模块内包含的信息(主要是实现细节)对于不需要这些信息的模块来说,是不能访问的。

5.模块独立(1)定义开发的模块具有独立功能而且和其他模块之间没有过多的相互作用的模块,就可以做到模块独立。

(2)两个度量标准:耦合和内聚。

(3)耦合①定义耦合是对一个软件结构内不同模块之间互连程度的度量。

②分类a .完全独立;b .数据耦合;c .控制耦合;d .特征耦合;e .公共环境耦合;f .内容耦合。

软件工程导论复习重点总结很全第六版

软件工程导论复习重点总结很全第六版

第1章软件工程学概述1.1 软件危机1.1.1 软件危机旳简介软件危机(软件萧条、软件困扰): 是指在计算机软件旳开发和维护过程中所碰到旳一系列严重问题。

软件危机包括下述两方面旳问题:怎样开发软件, 满足对软件日益增长旳需求;怎样维护数量不停膨胀旳已经有软件。

软件危机旳经典体现:(1)对软件开发成本和进度旳估计常常很不精确;(2)顾客对“已完毕旳”软件系统不满意旳现象常常发生;(3)软件产品旳质量往往靠不住;(4)软件常常是不可维护旳;(5)软件一般没有合适旳文档资料;(6)软件成本在计算机系统总成本中所占旳比例逐年上升;(7)软件开发生产率提高旳速度, 远远跟不上计算机应用迅速普及深入旳趋势。

1.1.2 产生软件危机旳原因(1)与软件自身旳特点有关(2)与软件开发与维护旳措施不对旳有关1.1.3 消除软件危机旳途径对计算机软件有对旳旳认识。

认识到软件开发是一种组织良好、管理严密、各类人员协同配合、共同完毕旳工程项目。

应当推广使用在实践中总结出来旳开发软件旳成功技术和措施, 并继续研究探索。

应当开发和使用更好旳软件工具。

总之, 为了处理软件危机, 既要有技术措施(措施和工具), 又要有必要旳组织管理措施。

1.21.2.1 软件工程旳简介软件工程: 是指导计算机软件开发和维护旳一门工程学科。

采用工程旳概念、原理、技术和措施来开发与维护软件, 把通过时间考验而证明对旳旳管理技术和目前可以得到旳最佳旳技术措施结合起来, 以经济地开发出高质量旳软件并有效地维护它, 这就是软件工程。

(期中考)软件工程旳本质特性:软件工程关注于大型程序旳构造软件工程旳中心课题是控制复杂性软件常常变化开发软件旳效率非常重要友好地合作是开发软件旳关键软件必须有效地支持它旳顾客在软件工程领域中是由具有一种文化背景旳人替具有另一种文化背景旳人发明产品1.2.2 软件工程旳基本原理用分阶段旳生命周期计划严格管理坚持进行阶段评审实行严格旳产品控制采用现代程序设计技术成果应能清晰地审查开发小组旳人员应当少而精承认不停改善软件工程实践旳必要性1.2.3 软件工程措施学软件工程包括技术和管理两方面旳内容。

软件工程导论(第五版)素材第五章范文

软件工程导论(第五版)素材第五章范文

第5章总体设计5.1设计过程1. 设想供选择的方案2. 选取合理的方案3. 推荐最佳方案4. 功能分解5. 设计软件结构6. 设计数据库7. 制定测试计划8. 书写文档9. 审查和复审5.2设计原理5.2.1模块化图5.1模块化和软件成本2数据结构(C++版) 5.2.2抽象5.2.3逐步求精5.2.4信息隐藏和局部化5.2.5模块独立1. 耦合2. 内聚5.3启发规则1. 改进软件结构提高模块独立性2. 模块规模应该适中3. 深度、宽度、扇出和扇入都应适当4. 模块的作用域应该在控制域之内图5.2模块的作用域和控制域5. 力争降低模块接口的复杂程度6. 设计单入口单出口的模块7. 模块功能应该可以预测软件工程导论(第五版) 3 5.4描绘软件结构的图形工具5.4.1层次图和HIPO图图5.3正文加工系统的层次图图5.4带编号的层次图(H图)4数据结构(C++版)5.4.2结构图图5.5结构图的例子——产生最佳解的一般结构图5.6判定为真时调用A,为假时调用B图5.7模块M循环调用模块A、B、C 5.5面向数据流的设计方法5.5.1概念1. 变换流2. 事务流软件工程导论(第五版) 5图5.8变换流图5.9事务流3. 设计过程6数据结构(C++版)图5.10面向数据流方法的设计过程5.5.2变换分析1. 例子2. 设计步骤软件工程导论(第五版) 7图5.11数字仪表板系统的数据流图8数据结构(C++版)图5.12具有边界的数据流图图5.13第一级分解的方法软件工程导论(第五版) 9图5.14数字仪表板系统的第一级分解图5.15第二级分解的方法图5.16未经精化的输入结构10数据结构(C++版)图5.17未经精化的变换结构图5.18未经精化的输出结构图5.19精化后的数字仪表板系统的软件结构软件工程导论(第五版) 11 5.5.3事务分析图5.20事务分析的映射方法5.5.4设计优化5.6小结习题51. 为每种类型的模块耦合举一个具体例子。

软件工程导论 第五章总体设计

软件工程导论  第五章总体设计

需要强调一点,信息隐蔽并不意味着某个模块中的内
部信息对其他模块来说是完全不可见或不能使用的, 而是说模块之间的信息传递只能通过合法的调用接口 来实现。显然,信息隐蔽对提高软件的可读性和可维 护性都是非常重要的。
24
(2)局部化:是指把一些关系密切的软件元素 物理地放得彼此靠近。如模块中的局部数据元素 是局部化的一个例子。
分析员从中选出一个最佳方案向用户和使用部门负责人推荐。

如果负责人接受了推荐的方案,分析员应该进一步为这个最 佳方案设计软件结构。
3
总体设计的必要性

可以站在全局高度上,花较少成本,从较抽 象的层次上分析对比多种可能的系统实现方 案和软件结构; 从中选出最佳方案和最合理的软件结构,从 而用较低成本开发出较高质量的软件系统。
不同模块之间 互连程度 的度量。
26
模块独立是模块化、抽象、信息隐藏和局部化概念 的直接结果。 模块的独立性的优点: • 比较容易开发出有效模块化(即具有独立的模块) 的软件。 • 独立的模块比较容易测试和维护。
27
1) 耦合性
耦合性是对一个软件结构内部不同模块间联系紧密程 度的度量指标。 决定耦合性高低的主要因素 由于模块间的联系是通过模块接口实现的,因此,模 块耦合性的高低主要取决于模块接口的复杂程度、调用模 块的方式以及通过模块接口的数据。模块间的耦合性主要 可划分为如下几种类型。
在可行性研究阶段,软件作为系统的一个完整 部件; 在需求分析期间,软件解法是使用在问题环境 内熟悉的方式描述的; 当由总体设计向详细设计过渡时,抽象的程度 也就随之减少; 最后,当源程序写出来以后,也就达到了抽象 的最低层。 20
5.2.3 逐步求精
定义:为了能集中精力解决主要问题而尽量推迟 对问题细节的考虑。 人类的认知过程遵守Miller法则:一个人在任何时 候都只能把注意力集中在(7±2)个知识块上。

82软件工程导论第五章PPT课件

82软件工程导论第五章PPT课件

END
28.07.2020
3
第一节 编码
本节内容:
一、相关概念
二、编码阶段的任务
三、程序设计语言的选择
四、编码风格
28.07.2020
4
一、相关概念
所谓编码就是选择一种语言把软件设计阶段的结 果翻译成计算机可以理解的源程序
它直接来源于设计,所以,程序的质量主要取决 于软件设计的质量
所选编程语言的特点和编码人员的编码风格会对 程序的可靠性、可读性、可测试性和可维护性产 生影响
28.07.2020
13
三、程序设计语言的选择
第三代语言
也称结构化编程语言,60年代—70年代
主要特征:具有很强的过程和数据结构化的能力
可分为三类: 通用高级语言(C、Pascal、Ada美国的三军通用语 言) 面向对象高级语言(C++,Objective-C,Smalltalk, Eiffel) 专用语言(LISP、PROLOG、APL和FORTH)
28.07.2020
8
三、程序设计语言的选择
1、程序设计特性
1)心理特性
需要考虑的几个心理特性
紧凑性:一种面向代码信息量的表示,这个信 息量必须由人来记忆:
❖ APL语言是一种非常紧凑的编程语言,但很 难读懂,Prolog语言也一种非常紧凑的语言
❖ 度量紧凑性的语言属性:
该语言支持结构化和逻辑块的程度
28.07.2020
返回至“编码风格”
19
数据说明
虽然在设计期间已经确定了数据结构的组织和复 杂程度,然而数据说明的风格却是在写程序时确 定的
为了使数据更容易理解和维护,遵循一些比较简 单的原则是必要的:
数据说明的次序应当规范化 说明语句中变量安排有序化 使用注释说明复杂数据结构

软件工程导论知识点总结(整理)

软件工程导论知识点总结(整理)

软件⼯程导论知识点总结(整理)《软件⼯程导论》课后习题答案第⼀章软件⼯程概论1.什么是软件危机?软件危机是指在计算机软件的开发和维护过程中所遇到的⼀系列严重问题。

这些问题表现在以下⼏个⽅⾯:(1)⽤户对开发出的软件很难满意。

(2)软件产品的质量往往靠不住。

(3)⼀般软件很难维护。

(4)软件⽣产效率很低。

(5)软件开发成本越来越⼤。

(6)软件成本与开发进度难以估计。

(7)软件技术的发展远远满⾜不了计算机应⽤的普及与深⼊的需要。

2.为什么会产⽣软件危机?(1) 开发⼈员⽅⾯,对软件产品缺乏正确认识,没有真正理解软件产品是⼀个完整的配置组成。

造成开发中制定计划盲⽬、编程草率,不考虑维护⼯作的必要性。

(2) 软件本⾝⽅⾯,对于计算机系统来说,软件是逻辑部件,软件开发过程没有统⼀的、公认的⽅法论和规范指导,造成软件维护困难。

(3) 尤其是随着软件规模越来越⼤,复杂程度越来越⾼,原有软件开发⽅式效率不⾼、质量不能保证、成本过⾼、研制周期不易估计、维护困难等⼀系列问题更为突出,技术的发展已经远远不能适应社会需求。

3.怎样克服软件危机?(1) 充分吸收和借鉴⼈类长期以来从事各种⼯程项⽬中积累的⾏之有效的有效原理、概念、技术与⽅法,特别是吸取⼏⼗年来⼈类从事计算机硬件研究和开发的经验教训。

在开发软件的过程中努⼒作到良好的组织,严格的管理,相互友好的协作。

(2) 推⼴在实践中总结出来的开发软件的成功的技术和⽅法,并研究更好、更有效的技术和⽅法,尽快克服在计算机系统早期发展阶段形成的⼀些错误概念和作法。

(3) 根据不同的应⽤领域,开发更好的软件⼯具并使⽤这些⼯具。

将软件开发各个阶段使⽤的软件⼯具集合成⼀个整体,形成⼀个很好的软件开发⽀环环境。

总之为了解决软件危机,既要有技术措施(⽅法和⼯具),⼜要有必要的组织管理措施。

4.构成软件项⽬的最终产品:应⽤程序、系统程序、⾯向⽤户的⽂档资料和⾯向开发者的⽂档资料。

5.什么是软件⽣存周期?软件⽣存周期是指从软件定义、开发、使⽤、维护到淘汰的全过程。

软件工程导论(第6版)

软件工程导论(第6版)

第一章、软件工程学概述软件危机:是指在计算机软件的开发和维护过程中所遇到的一系列严重问题。

软件危机包含下述两个方面的问题:1.如何开发软件,以满足对软件日益增长的需求。

2.如何维护数量不断膨胀的已有软件。

具体的说,软件危机主要有以下一些典型表现:1.对软件开发成本的进度的估计常常很不准确。

2.用户对“已完成的”软件系统不满意的现象经常发生3.软件产品的质量往往靠不住。

4.软件常常是不可维护的。

5.软件通常没有适当的文档材料。

6.软件成本在计算机系统总成本中所占的比例逐年上升。

7.软件开发生产率提高的速度,远远跟不上计算机应用迅速普及深入的趋势。

软件生命周期:一个软件从定义、开发、使用和维护,知道最终被废弃,要经历一个漫长的时期,通常把软件经历的这个漫长的时期称为生命周期。

软件配置:程序、文档和数据。

软件工程学的一个重要的目标:就是提高软件的可维护性,减少软件维护的代价。

软件:是程序、数据及相关文档的集合。

程序:是能够完成预定功能和性能的可执行的指令序列。

数据:是使程序能够适当地处理信息的数据结构。

文档:是开发、使用和维护程序所需要的图文资料。

软件工程:指导计算机软件开发和维护的一门工程学科。

软件工程具有下属的本质特性:1.软件工程关注于大型程序的构造。

2.软件工程的中心课题是控制复杂性。

3.软件经常变化。

4.开发软件的效率非常重要。

5.和谐地合作是开发软件的关键。

6.软件必须有效地支持它的用户。

7.在软件工程领域中通常由具有一种文化背景的人替具有另一种文化背景的人创造产品。

软件工程的7条基本原理:1.用分阶段的生命周期计划严格管理。

2.坚持进行阶段评审。

3.实行严格的产品控制4.采用现代程序设计技术。

5.结构应能清楚的审查。

6.开发小组的人员应该少而精。

7.承认不断改进软件工程实践的必要性。

软件工程:包括技术和管理两方面的内容,是技术与管理紧密结合所形成的工程学科。

通常把在软件生命周期全过程中使用的一整套技术方法的集合称为方法学,也称为泛型。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第五章总体设计经过需求分析阶段的工作,系统必须“做什么”已经清楚了,现在是决定“怎样做”的时候了。

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

通过这个阶段的工作将划分出组成系统的物理元素——程序、文件、数据库、人工过程和文档等等,但是每个物理元隶仍然处于黑盒子级,这些黑盒子里的具体内容将在以后仔细设计。

总体设计阶段的另一项重要任务是设计软件的结构,也就是要确定系统中每个程序是由哪些模块组成的,以及这些模块相互间的关系。

总体设计过程首先寻找实现目标系统的各种不同的方案,需求分析阶段得到的数据流图是设想各种可能方案的基础。

然后分析员从这些供选择的方案中选取若干个合理的方案,为每个合理的方案都准备一份系统流程图,列出组成系统的所有物理元素,进行成本/效益分析,并且制定实现这个方案的进度计划。

分析员应该综合分析比较这些合理的方案,从中选出一个最佳方案向用户和使用部门负责人推荐。

如果用户和使用部门的负责人接受了推荐的方案,分析员应该进一步为这个最佳方案设计软件结构,通常,设计出初步的软件结构后还要多方改进,从而得到更合理的结构,进行必要的数据库设汁,确定测试要求并且制定测试计划。

从上面的叙述中不难看出,在详细设计之前先进行总体设计的必要性:可以站在全局高度上,花较少成本,从较抽象的层次上分析对比多种可能的系统实现方案和软件结构,从中选出最佳方案和最合理的软件结构,从而用较低成本开发出较高质量的软件系统。

5.1 设计过程总体设计过程通常由两个主要阶段组成:系统设计阶段,确定系统的具体实现方案;结构没计阶段,确定软件结构。

典型的总体设计过程包括下述9个步骤:1.设想代选择的方案如何实现要求的系统呢,在总体设计阶段分析员应该考虑各种可能的实现方案,并且力求从中选出最佳方案。

在总体设计阶段开始时只有系统的逻辑模型,分析员有充分的自由分析比较不同的物理实现方案,一旦选出了最佳的方案,将能大大提高系统的性能/价格比。

需求分析阶段得出的数据流图是总体设计的极好的出发点。

设想供选择的方案的一种常用的方法是,设想把数据流图中的处理分组的各种可能的方法,抛弃在技术上行不通的分组方法(例如,组内不同处理的执行时间不相容),余下的分组方法代表可能的实现策略,并且可以启示供选择的物理系统。

2.选取合理的方案应该从前一步得到的一系列供选择的方案中选取若干个合理的方案,通常至少选取低成本、中等成本和高成本的三种方案。

在判断哪些方案合理时应该考虑在问题定义和可行性研究阶段确定的工程规模和目标,有时可能还需要进一步征求用户的意见。

对每个合理的方案分析员都应该准备下列4份资料:(1) 系统流程图;(2) 组成系统的物理元素清单(3) 成本/效益分析;(4) 实现这个系统的进度计划3. 推荐最佳方案分析员应该综合分析对比各种合理方案的利弊,推荐一个最佳的方案,并且为推荐的方案制定详细的实现计划。

制定详细实现计划的关键技术是本书第13章中将要介绍的工程网络。

用户和有关的技术专家应该认真审查分析员所推荐的最佳系统,如果该系统确实符合用户的需要,并且是在现有条件下完全能够实现的,则应该提请使用部门负责人进一步审批。

在使用部门的负责人也接受了分析员所推荐的方案之后,将进入总体设计过程的下一个重要阶段——结构设计。

4.功能分解为了最终实现目标系统,必须设计出组成这个系统的所有程序和文件(或数据库)。

对程序(特别是复杂的大型程序)的设计,通常分为两个阶段完成:首先进行结构设计,然后进行过程设计。

结构设计确定程序由哪些模块组成,以及这些模块之间的关系;过程设计确定每个模块的处理过程。

结构设计是总体设计阶段的任务,过程设计是详细设计阶段的任务。

为确定软件结构,首先需要从实现角度把复杂的功能进一步分解。

分析员结合算法描述仔细分析数据流图中的每个处理,如果一个处理的功能过分复杂,必须把它的功能适当地分解成一系列比较简单的功能。

一般说来,经过分解之后应该使每个功能对大多数程序员而言都是明显易懂的。

功能分解导致数据流图的进一步细化,同时还应该用IPO图或其他适当的工具简要描述细化后每个处理的算法。

5.设计软件结构通常程序中的一个模块完成一个适当的子功能。

应该把模块组织成良好的层次系统,顶层模块调用它的下层模块以实现程序的完整功能,每个下层模块再调用更下层的模块,从而完成程序的一个子功能,最下层的模块完成最具体的功能。

软件结构(即由模块组成的层次系统)可以用层次图或结构图来描绘,第5.4节将介绍这些图形工具。

如果数据流图已经细化到适当的层次,则可以直接从数据流图映射出软件结构,这就是第5.5节中将要讲述的面向数据流的设计方法。

6.设计数据库对于需要使用数据库的那些应用系统,软件工程师应该在需求分析阶段所确定的系统数据需求的基础上,进一步设计数据库。

在数据库课中已经详细讲述了设计数据库的方法,本书不再赘述。

7.制定测试计划在软件开发的早期阶段考虑测试问题,能促使软件设计人员在设计时注意提高软件的可测试性。

本书第7章将仔细讨论软件测试的目的和设计测试方案的各种技术方法。

8.书写文档应该用正式的文档记录总体设计的结果,在这个阶段应该完成的文档通常有下述几种:(1)系统说明主要内容包括用系统流程图描绘的系统构成方案,组成系统的物理元素清单,成本/效益分析;对最佳方案的概括描述,精化的数据流图,用层次图或结构图描绘的软件结构,用IPO图或其他工具(例如,PDI。

语言)简要描述的各个模块的算法,模块间的接口关系,以及需求、功能和模块三者之间的交叉参照关系等等。

(2)用户手册根据总体设计阶段的结果,修改更正在需求分析阶段产生的初步的用户手册。

(3)测试计划包括测试策略,测试方案,预期的测试结果,测试进度计划等等。

(4)详细的实现计划(5)数据库设计结果9.审查和复审最后应该对总体设计的结果进行严格的技术审查,在技术审查通过之后再由使用部门的负责人从管理角度进行复审。

5.2 设计原理本节讲述在软件设计过程中应该遵循的基本原理和相关概念。

5.2.1 模块化模块是由边界元素限定的相邻程序元素(例如,数据说明,可执行的语句)的序列,而且有一个总体标识符代表它。

像PASCAL 或Ada 这样的块结构语言中的Begin …End 对,或者C 、C++和Java 语言中的{...}对,都是边界元素的例子。

按照模块的定义,过程、函数、子程序和宏等,都可作为模块。

面向对象方法学中的对象(见第9章)是模块,对象内的方法(或称为服务)也是模块。

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

模块化就是把程序划分成独立命名且可独立访问的模块,每个模块完成一个子功能,把这些模块集成起来构成一个整体,可以完成指定的功能满足用户的需求。

有人说,模块化是为了使一个复杂的大型程序能被人的智力所管理,软件应该具备的惟一属性。

如果一个大型程序仅由一个模块组成,它将很难被人所理解。

下面根据人类解决问题的一般规律,论证上面的结论。

设函数C(x)定义问题X 的复杂程度,函数E(x)确定解决问题x 需要的工作量(时间)。

对于两个问题P1和P2,如果C(1P )>C(2P )显然 E(1P )>E(2P )根据人类解决一般问题的经验,另一个有趣的规律是C(1P +2P )>C(1P )+C(2P )也就是说,如果一个问题由P1和P2两个问题组合而成,那么它的复杂程度大于分别考虑每个问题时的复杂程度之和。

综上所述,得到下面的不等式E(1P +2P )>E(1P )+E(2P )这个不等式导致“各个击破”的结论——把复杂的问题分解成许多容易解决的小问题来的问题也就容易解决了。

这就是模块化的根据。

由上面的不等式似乎还能得出下述结论:如果无限地分割软件,最后为了开发软件而需要的工作量也就小得可以忽略了。

事实上,还有另一个因素在起作用,从而使得上述结论不能成立。

参看图5.1,当模块数目增加时每个模块的规模将减小,开发单个模块需要的成本(工作量)确实减少了;但是,随着模块数目增加,设计模块间接口所需要的工作量也将增加。

根据这两个因素,得出了图中的总成本曲线。

每个程序都相应地有一个最适当的模块数目M ,使得系统的开发成本最小。

虽然目前还不能精确地决定M 的数值,但是在考虑模块化的时候总成本曲线确实是有用的指南。

本书第6章将讲述的程序复杂程度的定量度量和第5.3节将介绍的启发式规则,可以在一定程度上帮助我们决定合适的模块数目。

采用模块化原理可以使软件结构清晰,不仅容易设计也容易阅读和理解。

因为程序错误通常局限在有关的模块及它们之间的接口中,所以模块化使软件容易测试和调试,因而有助于提高软件的可靠性。

因为变动往往只涉及少数几个模块,所以模块化能够提高软件的可修改性。

模块化也有助于软件开发工程的组织管理,一个复杂的大型程序可以由许多程序员分工编写不同的模块,并且可以进一步分配技术熟练的程序员编写困难的模块。

5.2.2 抽象人类在认识复杂现象的过程中使用的最强有力的思维工具是抽象。

人们在实践中认识到,在现实世界中一定事物、状态或过程之间总存在着某些相似的方面(共性)。

把这些相似的方面集中和概括起来,暂时忽略它们之间的差异,这就是抽象。

或者说抽象就是抽出事物的本质特性而暂时不考虑它们的细节。

由于人类思维能力的限制,如果每次面临的因素太多,是不可能做出精确思维的。

处理复杂系统的惟一有效的方法是用层次的方式构造和分析它。

一个复杂的动态系统首先可以用一些高级的抽象概念构造和理解,这些高级概念又可以用一些较低级的概念构造和理解,如此进行下去,直至最低层次的具体元素。

这种层次的思维和解题方式必须反映在定义动态系统的程序结构之中,每级的一个概念将以某种方式对应于程序的一组成分。

当考虑对任何问题的模块化解法时,可以提出许多抽象的层次。

在抽象的最高层次使用问题环境的语言,以概括的方式叙述问题的解法;在较低抽象层次采用更过程化的方法,把面向问题的术语和面向实现的术语结合起来叙述问题的解法;最后,在最低的抽象层次用可以直接实现的方式叙述问题的解法。

软件工程过程的每一步都是对软件解法的抽象层次的一次精化。

在可行性研究阶段,软件作为系统的一个完整部件;在需求分析期间,软件解法是使用在问题环境内熟悉的方式描述的;当由总体设计向详细设计过渡时,抽象的程度也就随之减少了;最后,当源程序写出来以后,也就达到了抽象的最低层。

逐步求精和模块化的概念,与抽象是紧密相关的。

随着软件开发工程的进展,在软件结构每一层中的模块,表示了对软件抽象层次的一次精化。

事实上,软件结构顶层的模块,控制了系统的主要功能并且影响全局;在软件结构底层的模块,完成对数据的一个具体处理,用自顶向下由抽象到具体的方式分配控制,简化了软件的设计和实现,提高了软件的可理解性和可测试性,并且使软件更容易维护。

相关文档
最新文档