系统的所有输入都定义了吗,包括他们的来源、精度、取值范围和频率?
系统所有的输出都定义了吗,包括他们的目标、精度、取值范围、频率和格式?
所有的报告格式都定义了吗,
所有的硬件和软件接口都定义了吗
所有的通信界面都定义了吗,包括握手、错误检查以及通信约定
是否从用户的观点出发,定义了所有必要操作的反映时间
是否定义了时间问题,如处理时间、数据传输率以及系统吞吐能力
是否对用户所要求完成的任务都做出了规定
每项任务所需用到和产生的数据都规定了吗
规定保密级别了吗
规定可靠性了吗,包括软件出错的后果、在出错时要保护的至关重要的信息、以及错误测试和恢复策略
规定所需最大内存了吗
所需最大存储容量规定了吗
对系统的维护性是否做出了规定,包括系统对运行环境、精度、性能以及与其他软件的接口等方面变化的适应能力规定了吗
是否规定了相互冲突的设计之间的折衷原则,例如,在坚固性与准确性之间如何进行折衷
是否制定了系统成败的标准
需求的完善性:
在开发开始前暂时得不到的信息是什么,是否规定了不够完善的区域
需求定义是否已经完善到了可以成为软件标准的地步
需求中是否有哪一部分令你感到不安,有没有根本不可能实现,而仅仅为了取悦老板和用户才加进来的内容
需求的质量:
需求是否是用用户的语言制定的,用户也这样认为吗
需求中是否每一条之间都尽量避免冲突
需求中是否注意了避免规定设计工作
需求在详细程度方面是否保持了一致性,有没有应该更详细些的需求,有没有应该更简略些的
需求是否明确得可以分为一些独立的可执行部分,而每一部分又都很明了
是否每一条都与问题和答案相关,是否每一条都可以追溯到产生它的环境中
是否每一条需求都可以作为测试依据,是否可以针对每一条进行独立测试以确定是否满足需求
是否对可能的改动做出了规定,包括每一改动的可能性
典型的结构元素:
1、程序的组织形式
一个系统结构首先需要一个总体上的概括性描述。在结构设计中通常不考虑建立模块一级的子程序。一个模块是一个能完成某一高级功能的子程序的集合。每一个模块作什么应该明确定义。每个模块之间的交界面也应该明确定义。
2、变动策略
变动产生的原因可能是由于反复无常的数据结构,也可能是由于文件格式和系统功能改变,新的性能等引起的。所以结构设计要考虑增强系统的灵活性,以便容纳这些变动
3、主要的数据结构
结构设计应该给出使用的主要文件、表和数据结构。不应该允许一个以上的模块访问数据结构,除非是通过访问子程序,以使得这种访问是抽象的而且是可控的。
数据守恒定律
每一个进入的数据都应该出去,或者与其他数据一道出去,如果它不出去,那它就没有必要进来。
4、关键算法
如果结构设计依赖于某一特定算法,那它应该描述或指出这一算法。
5、主要对象
结构中应指出要实现的主要对象,它应该规定每一个对象的责任并指出每个对象之间是如何相互作用的,其中包括对于排序层次、状态转换和对象一致性的描述。
6、用户界面
有时用户界面在需求定义阶段便已规定了。
7、输入/输出
结构中应规定采用向前看、向后看还是当前规则的查询方式,以及是在区域层次、记录层次还是文件层次上。
8、内存管理
结构中应该对正常和极端情况下所需要的内存做出估计。
9、字符串存储
结构设计可以决定字符串的使用方法,是编码在程序中,还是把它保留在数据结构中。是需要时通过存取子程序调用,还是把它存在一个源文件中。
10、错误处理
错误处理是纠正还是仅仅测试错误
错误测试时主动地还是被动的
程序是怎么样对待错误的
处理错误信息的约定是什么
在程序中,应该在哪一个层次上处理错误
每一个模块检验输入数据合法性的责任级别有多高
11、坚固性
是指发现错误后,一个系统继续运行的能力
12、断言
是指一段放在代码中,当代码运行时可以使其自检的可执行语句。
13、容错性
当发现错误时,系统可以返回并重新开始;系统可以用辅助代码来代替基本代码;系统可以采用投票算法;系统可以用一个假想值来代替错误的结果,以避免对程序其余部分的不良影响。
结构设计检查表:
软件的总体组织形式是否清晰明了,包括对于结构设计的总体评论与描述
模块定义是否清楚,包括他们的功能和及其与其他模块的接口
需求定义中所提出的所有功能,是否有恰当数量的模块覆盖
结构设计是否考虑了可能的更改
是否包括了必要的购买
是否阐明了如何改进重新启用的代码来满足现在的结构设计需求
是否描述并验证了所有的主要数据结构
主要数据结构是否隐含在存取子程序中
规定数据库组织形式和其他内容了吗
是否说明并验证所有主要算法
是否说明并验证所有主要目标
说明处理用户输入的策略了吗
是否定义了用户界面的关键方面
用户界面是否进行了模块化,以使对它所做的改动不会影响程序其他部分
是否描述并验证了内存使用估算和内存管理
是否对每一模块给出了存储空间和速度限制
是否说明了字符串处理策略,是否提供了对字符串占用空间的设计
所提供的错误处理策略是不是一致的
是否对错误信息进行了成套化管理以提供一个整洁的用户界面
是否指定了坚固性级别
有没有哪一部分结构设计被过分定义或缺少定义了
是否明确提出了系统目标
整个结构在概念上是否是一致的
机器和使用实现的语言是否顶层设计依赖
给出做出每个重要决定的动机了吗