现代软件工程
上QQ阅读APP看书,第一时间看更新

4.2 设计过程

设计过程从软件的宏观视图向微观视图转移,后者定义了实现系统所必需的细节。设计过程开始时关注体系结构,然后定义子系统、建立子系统之间的通信机制、识别构件、开发每个构件的详细描述,另外,还要设计外部接口、内部接口和用户接口。

软件设计是一个迭代的过程,通过这个过程,需求被变换为用于构建软件的“蓝图”。初始时,蓝图描述了软件的整体视图,也就是说,设计是在高抽象层次上的表达——在该层次上可以直接跟踪到特定的系统目标和更详细的数据、功能及行为需求。随着设计迭代的开始,后续的精化导致较低抽象层次的设计表示。这些表示仍然能够跟踪到需求,但连接更加错综复杂。

4.2.1 软件质量指导原则和属性

在整个设计过程中,要使用一系列技术评审(Technical Review,TR)来评估设计演化的质量。下面3条良好设计演化的特征可以作为设计过程的指导。

●设计必须实现所有包含在需求模型中的明确需求,而且必须满足干系人期望的所有隐含需求。

●对于那些生成代码的人和那些进行测试及随后维护软件的人而言,设计必须是可读的、可理解的指南。

●设计必须提供软件的全貌,从实现的角度说明数据域、功能域和行为域。

1.质量指导原则

为了评估某个设计表示的质量,软件团队中的成员必须建立良好设计的技术标准。考虑以下几个原则。

1)设计应展示出这样一种结构:①已经使用可识别的体系结构风格或模式创建;②由展示出良好设计特征的构件构成;③能够以演化的方式实现,从而便于实现和测试。

2)设计应该模块化;也就是说,应将软件逻辑地划分为元素或子系统。

3)设计应包含数据、体系结构、接口和构件的清晰表示。

4)设计应导出数据结构,这些数据结构适用于要实现的类,并从可识别的数据模式提取。

5)设计应导出显示独立功能特征的构件。

6)设计应导出接口,这些接口降低了构件之间,以及与外部环境连接的复杂性。

7)设计的导出应根据软件需求分析过程中获取的信息采用可重复的方法进行。

8)应该使用能够有效传达其意义的表示法来表达设计。

达到这些设计原则不能靠偶然,设计工程应通过应用基本的设计原则、系统化的方法学和严格的评审来保证良好的设计。

2.质量属性

所谓FURPS,是指一系列的软件质量属性,取其首字母组合来表示,分别代表功能性(functionality)、易用性(usability)、可靠性(reliability)、性能(performance)和可支持性(supportability)。FURPS质量属性体现了所有软件设计的目标。

●功能性通过程序的特征集和能力、所提交功能的通用性,以及整个系统的安全性来评估。

●易用性通过考虑人员因素、整体美感、一致性和文档来评估。

●可靠性通过测量故障的频率和严重性、输出结果的精确性、平均故障时间(Mean-Time-To-Failure,MTTF)、故障恢复能力和程序的可预见性来评估。

●性能通过考虑处理速度、响应时间、资源消耗、吞吐量和效率来度量。

●可支持性综合了可扩展性(扩展程序的能力)、适应性和耐用性这3方面的能力(这3个属性体现了可维护性)。此外,还包括可测试性、兼容性、可配置性(组织和控制软件配置元素的能力)、系统安装的简易性和问题定位的容易性。

在进行软件设计时,并不是每个软件质量属性都具有相同的权重。有的应用问题可能强调功能性,特别突出安全性;有的应用问题可能要求性能,特别突出处理速度;还有的可能关注可靠性。抛开权重不谈,重要的是要注意到:必须在设计开始时就考虑这些质量属性,而不是在设计完成后和构造已经开始时才考虑。

4.2.2 软件设计的演化

早期的软件设计工作注重模块化程序开发的标准和以自顶向下的方式对软件结构进行求精的方法,设计定义的过程方面演化为结构化程序设计的方法。后来的工作提出了将数据流或数据结构转化为设计定义的方法。较新的设计提出了面向对象方法。近年来,软件体系结构和可用于实施软件体系结构及较低级别的设计抽象的设计模式已经成为软件设计的重点。面向方面的方法、模型驱动开发及测试驱动开发日益受到重视,这些方法强调在设计中获得更有效的模块化和体系结构的技术。

每一种软件设计方法介绍了独特的启发式和表示法,这些方法有一些共同之处:①将需求模型转化为设计表示的方法;②表示功能性构件及它们之间接口的方法;③精化和分割的启发式方法;④质量评估的指导原则。不管使用哪种设计方法,都应该将基本概念运用到数据设计、体系结构设计、接口设计和构件级设计中。