(软件工程)第4章概要设计(ok).ppt

Yourdon提出的结构图是进行软件结构设计的另一个有力工具。结构图和层次图类似,也是描绘软件结构的图形工具, 因为按照惯例总是图中位于上方的方框代表的模块调用下方的模块,即使不用箭头也不会产生二义性,为了简单起见,可以只用直线而不用箭头表示模块间的调用关系。 * 结构图的例子——产生最佳解的一般结构 以上介绍的是结构图的基本符号,也就是最经常使用的符号。此外还有一些附加的符号,可以表示模块的选择调用或循环调用。图5.6表示当模块M中某个判定为真时调用模块A,为假时调用模块B。图5.7表示模块M循环调用模块A、B和C。 注意,层次图和结构图并不严格表示模块的调用次序。虽然多数人习惯于按调用次序从左到右画模块,但并没有这种规定,出于其他方面的考虑(例如为了减少交叉线),也完全可以不按这种次序画。此外,层次图和结构图并不指明什么时候调用下层模块。通常上层模块中除了调用下层模块的语句之外还有其他语句,究竟是先执行调用下层模块的语句还是先执行其他语句,在图中丝毫没有指明。事实上,层次图和结构图只表明一个模块调用那些模块,至于模块内还有没有其他成分则完全没有表示。 通常用层次图作为描绘软件结构的文档。结构图作为文档并不很合适,因为图上包含的信息太多有时反而降低了清晰程度。但是,利用IPO图或数据字典中的信息得到模块调用时传递的信息,从而由层次图导出结构图的过程,却可以作为检查设计正确性和评价模块独立性的好方法。传送的每个数据元素都是完成模块功能所必须的吗?反之,完成模块功能必须的每个数据元素都传送来了吗?所有数据元素都只和单一的功能有关吗?如果发现结构图上模块间的联系不容易解释,则应该考虑是否设计上有问题。 * * 逐步求精是人类解决复杂问题时采用的基本方法,也是很多软件工程技术的基础。 * * 两个概念都有助于设计者在设计演化过程中创造出完整的设计模型。 * 应用模块化原理时,自然会产生的一个问题是:“为了得到最好的一组模块,应该怎样分解软件呢?” “隐藏”意味着有效的模块化可以通过定义一组独立的模块而实现,这些独立的模块彼此间仅仅交换那些为了完成系统功能而必须交换的信息。 如果在测试期间和以后的软件维护期间需要修改软件,那么使用信息隐藏原理作为模块化系统设计的标准就会带来极大好处。因为绝大多数数据和过程对于软件的其他部分而言是隐藏的(也就是“看”不见的),在修改期间由于疏忽而引入的错误就很少可能传播到软件的其他部分。 * * 缺点:可理解性差,可修改性差 偶然内聚的例子:在模块T有三条语句。至少从表面上看不出这三条语句之间有什么联系,只是由于P,Q,R,S四个模块中都有这三条语句,为了节省空间才把它们作为一个模块放在一起。这完全是偶然性的 * 缺点:增强了耦合程度(控制耦合)不易修改,效率低 逻辑内聚的例子:一个子程序将打印季度开支报告、月份开支报告和日开支报告.具体打印哪一个,将由传入的控制标志决定,这个子程序具有逻辑内聚性,因为它的内部逻辑是由输进去的外部控制标志决定的。 * 模块的各个成分必须在同一时间段执 行,但各个成分之间无必然的联系。 紧急故障处理模块等、均是时间性聚合模块. 时间内聚的例子:将多个变量的初始化放在同一个模块中实现,或将需要同时使用的多个库文件的打开操作放在同一个模块中,都会产生时间内聚的模块。 * 使用流程图做为工具设计程序时,把流程图中的某一部分划出组成模块,就得到过程内聚模块。 过程内聚的例子:假设有一个子程序,它产生读取雇员的名字,然后是地址,最后是它的电话号码。这种顺序之所以重要,仅仅是因为它符合用户的要求,用户希望按这种顺序进行屏幕输入。另外一个子程序将读取关于雇员的其它信息。这个子程序是过程内聚性,因为是由一个特定顺序而不是其它任何原因,把这些操作组合在一起的。 * 通信内聚的例子:比如有一个打印总结报告,并在完成后重新初始化传进来的总结数据的子程序,这个子程序具有通信内聚性,因为这两个操作仅仅是由于它们使用了相同的数据才联系在一起。 通信内聚优点: 修改数据时,会在同一个地方找到它的所有代码. 注意:不能为达到通信内聚而牺牲层内聚. * 例如文本识别子系统 顺序内聚的例子:假设有一个按给出的生日计算雇员年龄、退休时间的子程序,如果它是利用所计算的年龄来确定雇员将要退休的时间,那么它就具有顺序内聚性。而如果它是分别计算年龄和退休时间的,但使用相同生日数据,那它就只具有通讯内聚性。 * * 耦合强弱取决于模块间接口的复杂程度,进入或访问一个模块的点,以及通过接口的数据。 在软件设计中应该追求尽可能松散耦合的系统。在这样的系统中可以研究、测试或维护任何一个模块,而不需要对系统的其他模块有很多了解。此外,由于模块间联系简单,发生在一处的错误传播到整个系统的

您可能关注的文档

文档评论(0)

1亿VIP精品文档

相关文档