软件工程
*
*
第5章 总体设计
传统的软件工程方法学采用结构化设计(Structured Design, SD)技术完成软件设计工作,设计工作通常划分为概要设计和详细设计两阶段。
总体设计基本目的:概括地说,系统应该如何异常情况时,它的影响局限在该模块内部,则由错误引起的副作用将最小。
模块化
*
*
采用模块化原理可以使软件结构清晰
不仅容易设计也容易阅读和理解。
因为程序错误通常局限在有关的模块及它们之间的接口中,所以模块化使软件容易测试和调试,因而有助于提高软件的可靠性。
因为变动往往只涉及少数几个模块,所以模块化能够提高软件的可修改性。
模块化也有助于软件开发工程的组织管理。
模块化
*
*
人们在实践中认识到,在现实世界中一定事物、状态或过程之间总存在着某些相似的方面(共性)。把这些相似的方面集中和概括起来,暂时忽略它们之间的差异,这就是抽象。
或者说抽象就是抽出事物的本质特性而暂时不考虑它们的细节。
抽象
人类在认识复杂现象的过程中使用的最强有力的思维工具是抽象。
*
*
用层次的方式构造和分析复杂系统。
复杂的动态系统:高级的抽象概念构造和理解较低的层次 … 最低层次、具体元素。
软件工程过程:每一步都是对抽象层次的一次精化
可行性研究:完整部件
需求分析:使用熟悉方式描述软件解法
设计:越来越具体
实现:抽象的最低层。
抽象
*
*
逐步求精是人类解决复杂问题时采用的基本技术,也是许多软件工程技术的基础。
逐步求精:“为了能集中精力解决主要问题而尽量推迟对问题细节的考虑。”
求精实际上是细化过程。
从在高抽象级别定义的功能陈述(或信息描述)开始。该陈述仅仅概念性地描述了功能或信息,但是并没有提供功能的内部工作情况或信息的内部结构。
求精要求设计者细化原始陈述,随着每个后续求精(细化)步骤的完成而提供越来越多的细节。
逐步求精
*
*
逐步求精的重要性在于,认知符合Miller法则:一个人在任何时刻只能把注意力集中在7+-2个知识块上。
逐步求精
*
*
逐步求精:
帮助软件工程师把精力集中在与当前开发阶段最相关的方面
目前不需要考虑的细节留到以后考虑
把一个时期内必须解决的问题按照优先级排序
自顶向下的策略
逐步求精
*
*
抽象与求精是一对互补的概念。
抽象使得设计者能够说明过程和数据,同时却忽略低层细节。
事实上,可以把抽象看作是一种通过忽略多余的细节同时强调有关的细节,而实现逐步求精的方法。
求精则帮助设计者在设计过程中揭示出低层细节。
这两个概念都有助于设计者在设计演化过程中创造出完整的设计模型。
逐步求精
*
*
应用模块化原理时,自然会产生的一个问题是:“为了得到最好的一组模块,应该怎样分解软件”。
信息隐藏原理指出:应该这样设计和确定模块,使得一个模块内包含的信息(过程和数据)对于不需要这些信息的模块来说,是不能访问的。
信息隐藏和局部化
*
*
隐藏模块的实现细节
模块之间只交换那些为了完成软件功能而必须交换的信息
对模块内部实现细节的访问限制
修改期间由于疏忽而引入的错误很少可能传播到其他模块
信息隐藏和局部化
*
*
模块独立
“模块独立”概念是模块化、抽象、逐步求精和信息隐藏等概念的直接结果,也是完成有效的模块设计的基本标准。
希望设计这样的软件结构:
每个模块完成一定相对独立的子功能
与其他模块之间的关系简单
*
*
模块独立
“模块独立化”原因:
易于开发
易于测试和维护
模块的独立程度可以由两个定性标准来度量,这两个标准分别称为内聚和耦合。
耦合衡量不同模块彼此间互相依赖(连接)紧密程度;
内聚衡量一个模块内部各个元素彼此结合的紧密程度。
*
*
耦合是对一个软件结构内不同模块之间互连程度的度量。耦合强弱取决于模块间接口的复杂程度,进入或访问一个模块的点,以及通过接口的数据。
在软件设计中应该追求尽可能松散耦合的系统。在这样的系统中可以研究、测试或维护任何一个模块,而不需要对系统的其他模块有很多了解。
此外,由于模块间联系简单,发生在一处的错误传播到整个系统的可能性就很小。因此,模块间的耦合程度强烈影响系统的可理解性、可测试性、可靠性和可维护性。
耦合
*
*
常见的耦合程度:
无耦合:任何一个模块都独立工作,现实系统中不存在
数据耦合:模块间交换的信息只有数据
控制耦合:模块间传递控制信息
特征耦合:把整个数据结构
软件设计师-软件工程教学 来自淘豆网m.daumloan.com转载请标明出处.