先决条件(二)结构设计

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/firstchange/article/details/84578138

结构设计先决条件

软件结构设计是较高级意义上的软件设计,它是支持详细设计的框架。结构也被称为“系统结构”、“设计”、“高水平设计”或者“顶层设计”。一般说来,结构体系往往在一个被称为“结构定义”或者“顶层设计”的单一文件中进行描述。

典型的结构要素

有许多要素是一个好的系统结构所共有的。

程序的组织形式

小结构的程序组织起来非常简单,但是对于一个由几十个模块组成的软件系统,就困难多了。一个模块是一个能完成某一高级功能的子程序的组合,例如,对输出结果进行格式化,解释命令,从文件中读取数据等。在要求定义中列出的每一项功能,都应该有至少一个模块覆盖这项功能。如果一项功能由两个或更多的模块覆盖,那么它们之间应该是互补的而不是相互冲突。

每一个模块作什么应该明确定义。一个模块应该只完成一项任务而且圆满完成。对于与它相作用的其它模块情况,你知道得越少越好。通过尽可能地降低模块之间的了解程度,就可能把设计信息都集中在一个模块中。
每个模块之间的交界面也应该明确定义。结构设计应该规定可以直接调用哪些模块,哪些模块它不能调用。同时,结构设计也应该定义模块传送和从其它模块接收的数据。

变动策略

创建一个软件系统,对于程序员和用户来说,都是一个逐渐学习的过程,因此在这个过程中作出变动是不可避免的。变动产生的原因可能是由于反复无常的数据结构,也可能是由于文件格式和系统功能改变,新的性能等而引起的。这些变动有时是为了增加新的能力以便强化功能,也有时是版本增加而引起的。所以结构设计所面临的主要挑战便是增强系统的灵活性,以便容纳这类变动。

结构设计中应该说明用于延缓变动的策略。比如,结构设计中可能规定应使用表驱动技术而不是手工编码技术。它还可能规定表所使用的文件应该保存在一个外部文件中,而不是编码在程序中,这样,可以不必重新编译就可以对程序作出调整。

购买而不是建造的决定

创建一个软件的最彻底的办法并不是创建——而是去购买一个软件,你可以购买数据库管理系统、屏幕生成程序、报告生成程序和图形环境。

主要的数据结构

结构设计中应该给出相应的数据结构。

最后,应该遵循数据守恒定律:每一个进入的数据都应该出去,或者与其它数据一道出去,如果它不出去,那他就没有必要进来。

扫描二维码关注公众号,回复: 4497780 查看本文章

关键算法

如果结构设计依赖于某一特定算法,那它应该描述或指出这一算法。同主要数据结构一样,结构设计中也应该指出考虑过的算法方案,并指出选中最终方案的原因。

主要对象

在面向对象的系统中,结构中应指出要实现的主要对象,它应该规定每一个对象的责任并指出每个对象之间是如何相互作用的。其中应包括对于排序层次、状态转换和对象一致性的描述。
结构中还应该指出考虑的其它对象,以及选择这种组织形式的原因。

通用对象

有一些软件通用的功能需要在结构设计中体现,如:用户界面、输入输出、内存管理、字符串存储

错误处理

需要提醒用户发现了错误、系统需要积极地预防错误(如合法性验证)、程序如何应对错误(对于错误的处理方式如抛出)、应建立一套错误体系、在系统中在哪一层处理错误

坚固性

坚固性是指在发现错误后,一个系统继续运行的能力。在结构设计中需要从几个方面表述坚固性。

over-engineering(裕度设计)

在软件链条中,其强度不是由最薄弱的一环决定的,而是由所有薄弱环节的乘积决定的。

清楚地表述所要求的裕度级是非常重要的,这是因为程序员出于职业素养,会不自觉地在程序中留出裕度。

assertions(断言)

结构中还应该规定断言的使用程度。断言是指一段放在代码中,当代码运行时可以使其自检的可执行语句。

fault tolerance(容错性)

性能

性能包括速度和内存使用。

通用的结构设计质量准则

结构中作出每一个决定的动机都要阐明清楚。要当心“我们过去一直是这么干的”的理由。

好的软件结构往往是机器和语言相互独立。减少对实现环境的依赖性。

检查表

一个好的结构设计应该阐明所有问题。

  • 软件的总体组织形式是否清晰明了?包括对于结构设计的总体评论与描述。
  • 模块定义是否清楚?包括它们的功能及其与其它模块的接口。
  • 要求定义中所提出的所有功能,是否有恰当数量的模块覆盖?
  • 结构设计是否考虑了可能的更改?
  • 是否包括了必要的购买?
  • 是否阐明了如何改进重新启用的代码来满足现在的结构设计要求?
  • 是否描述并验证了所有主要的数据结构?
  • 主要数据结构是否隐含在存取子程序中?
  • 规定数据库组织形式和其它内容了吗?
  • 是否说明并验证所有关键算法?
  • 是否说明验证所有主要目标?
  • 说明处理用户输入的策略了吗?
  • 说明并验证处理输入/输出的策略了吗?
  • 是否定义了用户界面的关键方面?
  • 用户界面是否进行了模块化,以使对它所作的改动不会影响程序其它部分
  • 是否描述并验证了内存使用估算和内存管理?
  • 是否对每一模块给出了存储空间和速度限制?
  • 是否说明了字符串处理策略?是否提供了对字符串占用空间的估计?
  • 所提供的错误处理策略是不是一致的?
  • 是否对错误信息进行了成套化管理以提供一个整洁的用户界面?
  • 是否指定了坚固性级别?
  • 有没有哪一部分结构设计被过分定义或缺少定义了?它是否明确说明了;
  • 是否明确提出了系统目标?
  • 整个结构在概念上是否是一致的?
  • 机器和使用实现的语言是否顶层设计依赖?
  • 给出做出每个重要决定的动机了吗?
  • 你作为系统实现者的程序员,对结构设计满意吗?

猜你喜欢

转载自blog.csdn.net/firstchange/article/details/84578138