软件设计是一个创造性的过程,对一些设计者来说需要一定的资质,而最后设计通常都是由一些初步设计演变而来的。从书本上学不会设计,只能经过实践,通过对实际系统的研究和实践才能学会。对于高效的软件工程,良好的设计是关键,一个设计得好的软件系统应该是可直接实现和易于维护、易懂和可靠的。设计得不好的系统,尽管可以工作,但很可能维护起来费用昂贵、测试困难和不可靠,因此,设计阶段是软件开发过程中最重要的阶段。
直到最近,软件设计在很大程度上仍是一个特定过程。一般用自然语言给定一需求集,预先作非正式设计,常常用流程图的形式说明,接着开始编码,当系统实现时设计还需修改。当实现阶段完成后,设计往往已与起初形式相去甚远以至于设计的原始文档完全不适合对系统的描述。
软件设计的这种方法导致了许多动态的和非常昂贵的工程失败。现在已经认识到一些完全非正规的表示法,诸如接近于编程语言的流程图,不适用于系统设计的描述和表达。大家认识到,精确的(尽管并不一定是正规的)说明是设计过程的必要部分。软件设计是一个反复的、不能用任何单一表示法来表示的多层次活动。相应地,大量的设计表示法,如数据流图、层次式输入-处理-输出结构图和设计描述语言已经开发出来,这些表示法能比流程图更好地表达软件设计。
给定一个需求定义,软件工程师必须以此导出满足这些需求的程序系统的设计,此导出过程是通过下述步骤来完成的:
1.必须建立组成程序系统的子系统。
2.必须把每个子系统分解成分离的成分,并且子系统规范通过定义这些成分的操作来建立。
3.每个程序可以用相互作用的子成分设计。
4.每个成分还须进行优化,这通常需要将每个成分规范化成层次式的子成分。
5.优化过程中的某个阶段,各成分中的算法必须详细说明。
除了程序系统设计中的这些阶段之外,软件工程师也可能需要设计允许系统中各进程之间进行通信的通信机制。他们或许要设计文件结构,并且很可能要设计用于程序的数据结构,他们还需要设计确认程序的测试事例。
确定何为“成功”的设计无一定之规,取决于其应用和特定的工程要求。一个成功的设计应该是:能生成高效的代码,实现尽量紧凑的最小设计,或是一个最易维护的设计。最后一个标准是本文采用的质量标准,可维护性设计意指系统修改费用最低,设计可懂度高和修改是局部性的。只有逻辑上高度结合而相互间松散地耦合的软件设计才能实现以上两个因素。
有效的软件设计最好利用一致性设计方法。有大量的在不同应用环境中开发并使用的设计方法,其中有些是由皮特森(1980)、布兰克和克瑞境(1983)描述的。实质上,这些方法大多数可划分为三类:
1.由上至下的功能设计:从功能的观点设计系统,从高层的观点着手将系统逐步地提炼成更具体的设计。结构化设计和阶梯式优化就是使用此方法的例子。
2.面向目标设计:把系统作为目标集合而不是功能的集合,信息在目标与目标之间传送,每个目标有它自己的相互关联操作集。面向目标的设计方法是基于信息隐藏的观点,该观点由巴拿斯(1972)最先提出,最近又由罗滨逊(1981)和保什(1983)描述。
3.数据驱动设计:此方法由杰克逊(1975)和万勒尔(1977)提出,认为软件系统的结构应该反映该系统所处理数据的结构。因此,软件设计应由对系统输入、输出数据进行分析后而导出。