欢迎光临!

软件工程之做好总体设计

 

   经过需求分析阶段的工作,系统必须做什么已经清楚了,总体设计阶段就是决定怎么做的时候了。

总体设计的基本目的:

就是回答“概括的话,系统该如何实现?”这个问题。这个阶段主要是:

1、划分出组成系统的物理元素——程序、文件、数据库、人工过程和文档等。

2、设计系统的结构,也就是要确定系统中每个程序是由哪些模块组成的,以及这些模块相互间的关系。
总体设计阶段的工作步骤:
    1、寻找实现系统的各种不同的解决方案,参照需求分析阶段得到的数据流程图来做。
    2、分析员从这些供选择的方案中选出若干个合理的方案进行分析,为每个方案都准备一份系统流程图,列出组成系统的所有物理元素,进行成本\效益分析,并且制定这个方案的进度计划。
    3、分析员综合分析比较这些合理的方案,从中选择一个最佳方案向用户和使用部门负责人推荐。
    4、对最终确定的解决方案进行优化和改进,从而得到更合理的结构,进行必要的数据库设计,确定测试要求并且制定测试计划。
    从上面的叙述中不难看出,在详细设计之前先进行总体设计的必要性:可以站在全局的高度,花较少成本,从较抽象的层次上分析对比多种可能的实现方案和软件结构,从中选择最佳方案和最合理的软件结构,从而用较低成本开发出较高质量的软件系统。
总体设计时必修遵守原理:
1、模块化
    模块的定义:模块是由边界元素限定的相邻程序元素的序列。模块是构成程序的基本构件。
    模块化的理论基础:把复杂的问题分解成许多容易解决的小问题,原来的问题也就容易解决了。
    模块化好处:
(1)使软件结构清晰,不仅容易设计也容易阅读和理解。
(2)容易测试和调试,提高软件的可靠性。
(3)提高软件的可修改性。
(4)有助于软件开发工程的组织管理。
2、抽象
    抽象的定义:人类在认识复杂现象的过程中一个最强有力的思维工具就是抽象。人们在实践中认识到,在现实世界中一定事物、状态和过程之间从存在某些相似的方面(共性)。把这些相似的方面集中和概括起来,暂时忽略它们之间的差异,这就是抽象。或者说抽象就是考虑事物间被关注的特性而不考虑它们其他的细节。
    抽象的理论基础:由于人类思维能力的限制,如果每次面临的因素太多,是不可能做出精确思维的。处理复杂系统的唯一有效的方法是用层次的方法构造和分析它。软件工程的每一步都是对软件解法的抽象层次的一次精化。
3、逐步求精
    逐步求精的定义:逐步求精是人类解决复杂问题时采用的基本用法,也是许多软件工程技术的基础。可以把逐步求精理解为:“为了能集中精力解决主要问题而尽量推迟对问题细节的考虑”。
    逐步求精的理论基础:“Miller法则”一个人在任何时候都只能把注意力集中在5到9个知识块上。
    逐步求精的好处:它能帮助软件工程师把精力集中在与当前开发阶段最相关的那些方面上,而忽略那些对整体解决方案来说虽然必要的,然而目前还不需要的细节,这些细节将留到以后考虑。“Miller法则”是人类智力的基本局限,我们不可能战胜自己的本性,只能接受这个事实,承认自身的局限性,并在这个前提下近我们最大的努力。
4、信息隐藏和局部化
    信息隐藏原理是指:应该这样设计模块,使得一个模块内包含的信息对于不需要这些信息的模块来说,是不能访问的。
    局部化的概念和信息隐藏概念是密切相关的,所谓局部化是指把一些关系密切的软件元素物理地放得彼此靠近。
   如果在测试期间和以后的软件维护期间需要修改软件,那么信息隐藏原理作为模块化系统设计的标准就会带来极大好处。它不会把影响扩散到别的模块。
5、模块独立
    模块独立的概念是模块化,抽象、信息隐藏和局部化概念的直接结果。模块独立有两个明显的好处:第一,有效的模块化的软件比较容易开发出来,而且适于团队进行分工开发。第二,独立的模块比较容易测试和维护。
    模块的独立程度可以由两个定性标准度量:内聚和耦合。耦合是指不同模块彼此间互相依赖的紧密程度;内聚是指在模块内部各个元素彼此结合的紧密程度。
    在软件设计中应该追求尽可能松散的系统。这样的系统中可以研究、测试和维护任何个模块,不需要对系统的其他模块有很多了解。模块间的偶合程度强烈影响系统的可理解性、可测试性、可靠性和可维护性。
    耦合的分类:
    (1)数据耦合,如果两个模块通过参数交换信息,而且交换的信息仅仅是数据,那么这种耦合就是数据耦合。
    (2)控制耦合,如果两个模块通过参数交换信息,交换的信息有控制信息,那么这种耦合就是控制耦合。
    (3)特征耦合,如果被调用的模块需要使用作为参数传递进来的数据结构中的所有数据时,那么把这个数据结构作为参数整体传送是完全正确的。但是,当把整个数据结构作为参数传递而使用其中一部分数据元素时,就出现了特征耦合。在这种情况下,被调用的模块可以使用的数据多于它确实需要的数据,这将导致对数据的访问失去控制,从而给计算机犯错误提供机会。
    (4)公共环境耦合,当两个或多个模块通过公共数据环境相互作用时,他们之间的耦合称为公共环境耦合。
    (5)内容耦合,有下列情形之一,两个模块就发生了内容耦合:
        *一个模块访问另一个模块的内部数据
        *一个模块不通过正常入口而转到另一个模块的内部
        *一个模块有多个入口
    在进行软件结构设计时,应该采用下述设计原则:尽量使用数据耦合,少用控制耦合和特征耦合,限制公共环境耦合的范围,完全不用内用耦合。
    内聚的分类:
    低内聚
    (1)偶然内聚:如果一个模块完成一组任务,这些任务彼此间即使有关系,关系也比较松散,就叫做偶然内聚。
    (2)逻辑内聚:如果一个模块完成的任务在逻辑上属于相同或相似的一类,则称为逻辑内聚。
    (3)时间内聚:如果一个模块包含的任务必修在同一段时间内执行,就叫时间内聚。
   中内聚
    (4)过程内聚:如果一个模块内的处理元素是相关的,而且必须以特定次序执行,则称为过程内聚。
    (5)通信内聚:如果模块中所有元素都使用同一个输入数据和产生一个输出数据,则成为通信内聚。
   高内聚
    (6)顺序内聚:如果一个模块内的处理元素同一个功能密切相关,而且这些处理必须顺序执行,则称为顺序内聚。
    (7)功能内聚:如果模块内所有处理元素属于一个整体,完成一个单一的功能,则称为功能内聚。
    事实上,没有必要精确定义模块的内聚级别。重要的是设计时力争做到高内聚,并且能够辨认出低内聚的模块,有能力通过修改设计提高模块的内聚程度降低模块间的耦合程度,从而获得较高的模块独立性。 
软件结构设计的启发式规则:
1、改进软件结构提高模块独立性。
2、模块规模应该适中。
3、深度,宽度,扇出和扇入都应适当。
   深度表示软件结构中控制的层数,它往往能够粗略的标志一个系统的大小和复杂程度。
   宽度是软件结构在同一层次上的模块总数的最大值。一般来说,宽度越大系统就越复杂。
    扇出是指一个模块直接调用的模块的数目,经验表明,一个设计的好的典型系统的平均扇出通常是3或4个,太多或太少都不好。
   扇入是指一个模块被别的多少个模块直接调用。扇入越大越好。
4、模块的作用域应该在控制域之内
5、力争降低模块接口的复杂程度
6、设计单入口单出口的模块
7、模块功能应该可以预测
   如果一个模块可以当作一个黑盒子,也就是说,只要输入相同的数据就能产生同样的的输出,这个模块的功能就是可以预测的。带有内部“存储器”的模块的功能可能是不可预测的,因为它的输出取决于内部存储器的状态。由于内部存储器对于上级模块是不可见的,所以这样的模块既不易理解又难于测试和维护。
以上的启发式规则多数是经验规律,对改进设计,提高软件质量,往往有重要的参考价值;但是,他们既不是设计的目标也不是设计时应该普遍遵循的原理。
设计优化:
1、考虑设计优化问题时应该记住“一个不能工作的‘最佳设计’的价值是值得怀疑的”。
2、应该在设计的早期阶段尽量对软件结构进行精化。可以导出不同的软件结构,然后对他们进行评价和比较,力求得到“最好”的结果。这种优化的可能是把软件结构设计和过程设计分开的真正优点之一。
3、结构简单通常即表示设计风格优雅,又表明效率高。设计优化应该力求做到在有效的模块化的前提下使用最少量的模块,以及在能够满足信息要求的前提下使用最简单数据结构。
4、优化时遵守一句格言:“先使它能工作,然后再使它快起来。”

posted on 2018-07-10 21:01  花拉子米  阅读(358)  评论(0编辑  收藏  举报
版权所有