第8讲原型开发为什么采用原型开发•在开发初期,要想得到一个完整准确的规格说明不是一件容易的事。特别是对一些大型的软件项目。•用户往往对系统只有一个模糊的想法,很难完全准确地表达对系统的全面要求。•软件开发者对于所要解决的应用问题认识更是模糊不清。•随着开发工作深入,用户可能会产生新的要求,或因环境变化,要求系统也能随之变化;开发者又可能在设计与实现的过程中遇到些没有预料到的实际困难,需要以改变需求来解脱困境。•因此规格说明难以完善、需求的变更、以及通信中的模糊和误解,都会成为软件开发顺利推进的障碍。•为了解决这些问题,逐渐形成了软件系统的快速原型的概念。原型定义•在软件开发中,原型是软件的一个早期可运行的版本,它反映最终系统的部分重要特性,用于实验和评价,以指导进一步的软件开发和生产。•对“原型”有以下设想:–原型是一个实际工作的系统;–原型没有一般的生存周期;–原型可能服务于多个不同的目的;–原型开发必须时间短、费用低;–原型是一个包含了修改和评价的完整的重复过程。原型开发的应用•辅助分析和确定用户需求;•作为软件设计的工具;•作为一个解决不确定性的工具;•作为一种实验工具;•作为一种支持用户培训的工具;•作为实现一次性应用的一种经济的方法;•作为软件维护的辅助工具;•作为一种开发方法,利用原型演化为最终系统。•原型开发不适合的领域:–嵌入式系统;–实时控制系统;–科学数值计算。•为什么?原型开发过程建立原型目标原型构造功能选择评价原型原型规划框架定义可执行原型评估报告原型开发的分类•根据原型与最终产品之间的关系,原型开发分类:–抛弃式(throwaway):验证和澄清系统的需求描述,重新构造系统。–演化式(evolutionary):逐步改进和细化原型,将原型进化为最终系统。–增量式(incremental):在建立软件总体设计基础上,采用增量开发方法,使原型成为最终系统。抛弃式原型开发框架需求开发原型评估原型确定系统开发软件验证系统交付的软件系统可复用构件抛弃式原型开发•在这种方法中,原型的根本作用是弄清需求和为风险评估提供额外的信息。经过评估,原型被抛弃,重新开发系统。•开发的要求是快速开发,其主要工作量是对原型的评价,而不是原型的设计。•存在一些问题:–为了快速开发,可以会遗漏系统的一些重要特性;–一些非功能性需求可能不会反映到原型中;–在开发过程中,快速变更可能导致没有充分的文档。演化式原型开发开发抽象描述交付系统建立原型系统使用原型系统系统充分吗?否是演化式原型开发•基本思路:先给出一个系统的最初实现,让用户去使用和评价,不断进行细化和完善,经过多次反复形成最后完善的应用系统。•这种开发方法,系统是逐步形成和完善的。•增加和修改是演化式原型开发的两个基本特征。•演化式方法式高度迭代和动态的。•通常采用快速系统开发技术,如CASE工具和4G语言。•对大规模、长周期的系统开发是最为重要的方法。增量式原型开发定义系统交付文档设计系统体系结构指定系统增量建立系统增量验证增量交付最终系统集成增量验证系统系统完成否?否是增量式原型开发•相对于演化式方法中,设计经常变更的问题,增量式方法是在软件体系结构设计的基础之上,完成模块设计,进行增量开发。•相比较而言,增量式方法能提供修改的范围较小,易于控制和管理。比较•抛弃式原型开发–目标是验证和导出需求。应该从理解不够好的需求开始。–一旦需求描述完成,原型抛弃,重新开发系统。–原型不需要长期维护,差的非功能性能可以接受。•演化式原型开发–目标是给用户一个实用的系统。应该从用户需求把握最准的部分做起,优先处理。–原型逐步演化成为最终系统。–原型必须具备相当的性能要求,遵从可靠、高效的标准。建立快速原型好处•增进软件者和用户对系统服务需求的理解,使比较含糊的具有不确定性的软件需求(主要是功能)明确化。•软件原型化方法提供了一种有力的学习手段。•使用原型化方法,可以容易地确定系统的性能,确认各项主要系统服务的可应用性,确认系统设计的可行性,确认系统作为产品的结果。•软件原型的最终版本,有的可以原封不动地成为产品,有的略加修改就可以成为最终系统的一个组成部分,这样有利于建成最终系统。•可执行规格说明•动态高级语言•专用语言•基于脚本(scenario)的设计•可复用(reusable)的软件•函数性变成语言•工具包原型开发技术可执行规格说明•可执行规格说明是用于需求规格说明的一种自动化技术。使用这种方法,人们可以直接观察他们用语言规定的任何系统性行为。包括代数规格说明有限状态模型可执行的数据流图(1)代数规格说明•代数规格说明使用集合、定义于这些集合上的函数和定义于这些函数上的方程来描述对象。规格说明的操作语义用这些方程表示。•举例:定义一个无界的栈及其操作–NEW_STACK:→Stack–PUSH:Stack,Element→Stack–POP:Stack→(Element|Undefined)–POP(NEW_STACK())=Undefined–POP(PUSH(stk,elem))=elem–其中,前三行定义了操作的语法,后两行把它们的语义定义为一些方程。(2)有限状态模型•Parnas提出的使用最广泛的一种可执行规格说明形式。从一个初始状态开始接收输入,到产生输出,状态在推移变化。施加在状态元素上的约束确定了有效状态的推移。•举例:建立用户/程序对话(3)可执行的数据流图•数据流图是基于结构化开发方法的结构化规格说明•用一种可执行的语言程序代替定义处理逻辑的结构化英语,数据流图就成为由可执行语言程序模块组成的网络,在一定环境或工具的支持下就可成为一个可以执行的原型系统。专用语言•专用语言是应用领域的模型化语言。在原型开发中使用专用语言,可方便用户和软件开发者在计划中的系统特性方面的交流。基于脚本的设计•脚本是指用户界面的原型。一个脚本用以模拟在系统运行期间用户经历的事件。它提供了输入─处理─输出的屏幕格式和有关对话的模型。因此,软件开发者能够给用户显示系统的逼真的视图,使用户得以判断是否符合他的意图。•可在任一脚本中使用一套可复用的软件模块,以表达某一方面的要求。•可使用一种原型语言来描述原型系统。原型开发过程中用这种语言来定义屏幕、数据项、及其相关的操作。从系统的外部描述开始,开发与数据库的接口、错误处理和恢复过程等系统的与外部视图一致的细节。软件复用技术•利用可复用的模块,做出适当的组合,就可得到快速构造的原型系统。•为了快速地构造原型,这些模块首先必须有简单而清晰的界面;其次它们应当尽量不依赖其它的模块或数据结构;第三,它们应具有一些通用的功能。用户界面原型•模拟simulation•形式文法formalgrammars•状态转换图statetransitiondiagrams•其它形式方法•屏幕生成器和工具•语言支持设施状态迁移图•状态迁移图是描述系统的状态如何相应外部的信号进行推移的一种图形表示。–圆圈“○”表示可得到的系统状态–箭头“→”表示从一种状态向另一种状态的迁移。•例如,当有多个申请占用CPU运行的进程时,有关CPU分配的进程的状态迁移。•可得到的状态=就绪,运行,等待•生成的事件=t1,t2,t3,t4•t1─中断事件t2─中断已处理•t3─分配CPUt4─用完CPU时间状态迁移图状态迁移图的优点•状态之间的关系能够直观地捕捉到•由于状态迁移图的单纯性,能够机械地分析许多情况,可很容易地建立分析工具小结•原型开发的过程•原型开发的分类及比较•原型开发技术