本文选择《软件工程指全程建模实现》第二版书稿内容,因为这段文字中部分内容来源于网络并经过本人整理,部分内容为本人独立撰写完成,因为书稿目前还没有完成,为了表示对朋友们的歉意,现发布部分内容给大家分享。
注:以下内容没有发布关联图片,请海涵。
60 年代中期开始爆发了众所周知的软件危机。为了克服这一危机,在 1968 、 1969 年连续召开的两次著名的 NATO 会议上提出了软件工程这一术语,并在以后不断发展、完善。与此同时,国外大的软件公司和机构的软件研究人员也在不断探索新的软件开发方法。迄今为止已经提出了很多实际的开发方法,诸如: Parnas 方法、结构化法、生命周期法、原型法、面向对象法等等。下面介绍几种流行的开发方法:
1 、 Parnas 方法
最早的软件开发方法是由D. Parnas 在 1972 年提出的。由于当时软件在可维护性和可靠性方面存在着严重问题,因此 Parnas 提出的方法是针对这两个问题的。首先, Parnas 提出了信息隐蔽原则:在概要设计时列出将来可能发生变化的因素,并在模块划分时将这些因素放到个别模块的内部。这样,在将来由于这些因素变化而需修改软件时,只需修改这些个别的模块,其它模块不受影响。信息隐蔽技术不仅提高了软件的可维护性,而且也避免了错误的蔓延,改善了软件的可靠性。现在信息隐蔽原则已成为软件工程学中的一条重要原则。
Parnas 提出的第二条原则是在软件设计时应对可能发生的种种意外故障采取措施。软件是很脆弱的,很可能因为一个微小的错误而引发严重的事故,所以必须加强防范。如在分配使用设备前,应该取设备状态字,检查设备是否正常。此外,模块之间也要加强检查,防止错误蔓延。
Parnas 对软件开发提出了深刻的见解。遗憾的是,他没有给出明确的工作流程。所以这一方法不能独立使用,只能作为其它方法的补充。
2 、结构化方法 [1]
1978 年, E. Yourdon 和 L. L. Constantine 提出了结构化方法,即 SASD 方法,也可称为面向功能的软件开发方法或面向数据流的软件开发方法。 1979 年 Tom DeMarco 对此方法作了进一步的完善。
Yourdon 方法是 80 年代使用最广泛的软件开发方法。它首先用结构化分析( SA )对软件进行需求分析,然后用结构化设计( SD )方法进行总体设计,最后是结构化编程( SP )。这一方法不仅开发步骤明确, SA 、 SD 、 SP 相辅相成,一气呵成,而且给出了两类典型的软件结构(变换型和事务型),便于参照,使软件开发的成功率大大提高,从而深受软件开发人员的青睐。
3 、面向数据结构的软件开发方法
Jackson 方法是最典型的面向数据结构的软件开发方法, 1975 年, M. A. Jackson 提出了一类至今仍广泛使用的软件开发方法。这一方法从目标系统的输入、输出数据结构入手,导出程序框架结构,再补充其它细节,就可得到完整的程序结构图。这一方法对输入、输出数据结构明确的中小型系统特别有效,如商业应用中的文件表格处理。该方法也可与其它方法结合,用于模块的详细设计。
Jackson 方法把问题分解为可由三种基本结构形式表示的各部分的层次结构。三种基本的结构形式就是顺序、选择和重复。三种数据结构可以进行组合,形成复杂的结构体系。这一方法从目标系统的输入、输出数据结构入手,导出程序框架结构,再补充其它细节,就可得到完整的程序结构图。这一方法对输入、输出数据结构明确的中小型系统特别有效,如商业应用中的文件表格处理。该方法也可与其它方法结合,用于模块的详细设计。
1974 年, J. D. Warnier 提出的软件开发方法与 Jackson 方法类似。
差别有三点:一是它们使用的图形工具不同,分别使用 Warnier 图和 Jackson 图;另一个差别是使用的伪码不同;最主要的差别是在构造程序框架时, Warnier 方法仅考虑输入数据结构,而 Jackson 方法不仅考虑输入数据结构,而且还考虑输出数据结构。
4 、面向问题的分析法
PAM ( Problem Analysis Method )是 80 年代末由日立公司提出的一种软件开发方法。它的基本思想是考虑到输入、输出数据结构,指导系统的分解,在系统分析指导下逐步综合。
这一方法的具体步骤是:从输入、输出数据结构导出基本处理框;分析这些处理框之间的先后关系;按先后关系逐步综合处理框,直到画出整个系统的 PAD 图。
这一方法本质上是综合的自底向上的方法,但在逐步综合之前已进行了有目的的分解,这个目的就是充分考虑系统的输入、输出数据结构。 PAM 方法的另一个优点是使用 PAD 图。这是一种二维树形结构图,是到目前为止最好的详细设计表示方法之一。当然由于在输入、输出数据结构与整个系统之间同样存在着鸿沟,这一方法仍只适用于中小型问题。
5 、原型化方法
原型法( Prototyping )是 20 世纪 80 年代随着计算机软件技术的发展,特别是在关系数据库系统( Relational Data Base System , RDBS )、第四代程序生成语言( 4th Generation Language , 4GL )和各种系统开发生成环境产生的基础上,提出的一种从设计思想、工具、手段都全新的系统开发方法。它扬弃了那种一步步周密细致地调查分析,然后逐步整理出文字档案,最后才能让用户看到结果的繁琐作法。
产生原型化方法的原因很多,主要随着我们系统开发经验的增多,我们也发现并非所有的需求都能够预先定义而且反复修改是不可避免的。当然能够采用原型化方法是因为开发工具的快速发展,比如用 VB , DELPHI 等工具我们可以迅速的开发出一个可以让用户看得见、摸得着的系统框架,这样,对于计算机不是很熟悉的用户就可以根据这个样板提出自己的需求。
开发原型化系统一般由以下几个阶段:
( 1 )确定用户需求
( 2 )开发原始模型
( 3 )征求用户对初始原型的改进意见
( 4 )修改原型。
原型化开发比较适合于用户需求不清、业务理论不确定、需求经常变化的情况。当系统规模不是很大也不太复杂时采用该方法是比较好的。
原型法随着时代的变迁不断被丰富,目前常用的原型法又分为:快速原型法、实用性原型法、抛弃性原型、演进原型法、实验原型法等。
快速原型法就是最初的原型法,通过原型引导用户需求的方法。
实用性原型法是每次重新构建原型后将用户认可的部分记录汇总后形成最终用户系统的方法。
抛弃性原型法是每次构建原型后着重记录用户不认可的信息,经过多次反复后将用户不认可的部分全部排除后形成最终用户系统的方法。
演进原型法又称增长原型法,通常是先开发运行一个子系统或分子系统,再扩充其功能或者开发另一个相关的子系统或分子系统,并归并集成,这样自底向上地逐步得到一个较完整的系统。
实验原型法是( Expriment Prototyping , EP ),它是通过建立真实系统的模型,由局部模型不断实验改进,最后得到整个系统的模型。
实用性原型法和抛弃性原型法属于快速需求获取的原型法,其产生的结果是用户的需求信息和不需要的信息,却不是直接形成可交付系统本身。而演进原型法和实验原型法产生的结果是最终可交付系统的一部分,需要用户方有人能够全程跟进或者参与评审提出意见。
6 、面向对象的软件开发方法
当前计算机业界最流行的几个单词就是分布式、并行和面向对象这几个术语。由此可以看到面向对象这个概念在当前计算机业界的地位。比如当前流行的两大面向对象技术 DCOM 和 CORBA 就是例子。当然我们实际用到的还是面向对象的编程语言,比如 C++ 。不可否认,面向对象技术是软件技术的一次革命,在软件开发史上具有里程碑的意义。
随着 OOP (面向对象编程)向 OOD (面向对象设计)和 OOA (面向对象分析)的发展,最终形成面向对象的软件开发方法 OMT ( Object Modeling Technique )。这是一种自底向上和自顶向下相结合的方法,而且它以对象建模为基础,从而不仅考虑了输入、输出数据结构,实际上也包含了所有对象的数据结构。所以 OMT 彻底实现了 PAM 没有完全实现的目标。不仅如此, OO 技术在需求分析、可维护性和可靠性这三个软件开发的关键环节和质量指标上有了实质性的突破,基本地解决了在这些方面存在的严重问题。
综上所述,面向对象系统采用了自底向上的归纳、自顶向下的分解的方法,它通过对对象模型的建立,能够真正建立基于用户的需求,而且系统的可维护性大大改善。当前业界关于面向对象建模的标准是 uml ( Unified Modeling Language )。
这里我们需要谈一下微软的 MSF ( Microsoft Solutions Framework )的框架,它简单的把系统设计分成三个阶段:概念设计、逻辑设计和物理设计。概念设计阶段就是从用户的角度出发可以得到多少个对象,并且以对象为主体,画出业务框架。逻辑设计阶段就是对概念设计阶段的对象进行再分析、细分、整合、删除。并建立各个对象的方法属性以及对象之间的关系。而物理设计实际上就是要确定我们实际需要的组件、服务和采用的框架结构、具体的编程语言等。 MCF 整个结构比较清楚是基于对象开发的一个比较好的可操作的框架系统。
本书中的开发方法论是 OO 方法论在 uml 语言表述下的具体操作方法。
在本书中认为软件开发方法论的定义是软件工程实现过程中的表达方式,比如采用某种开发语言,某种设计模式,建立什么架构,细节的具体实现方法等等。
由于各种 IDE 工具是把语言的描述工具、编译工具、调试工具,甚至设计模式、架构等实现方法等融合起来的支持性工具,因此不能算作软件工程理论的内容,只能算是软件工程自身对自身制造的一种产品,因为即使没有 IDE 工具,采用最基础的编译环境也一样可以完成整个软件,只是工作量的增加而已,所以,在本划分形式中就将其定义为对语言和其他的支持性工具,而不单独和软件工程体系本身发生直接关系。
7 、可视化开发方法
其实可视化开发并不能单独的作为一种开发方法,更加贴切的说可以认为它是一种辅助工具,比如用过 SYBASE 的 S-Design 的人都知道,用这个工具可以进行显示的图形化的数据库模式的建立,并可以导入到不同的数据库中去。当然用过 S-Design 的人不一定很多,但用过 VB , DELPHI , C++ Builder 等开发工具的人一定不少,实际上你就是在使用可视化开发工具。
当然,不可否认的是,你只是在编程这个环节上用了可视化,而不是在系统分析和系统设计这个高层次上用了可视化的方法。实际上,建立系统分析和系统设计的可视化工具是一个很好的卖点,国外有很多工具都致力于这方面产品的设计。比如 Business Object 就是一个非常好的数据库可视化分析工具。
可视化开发使我们把注意力集中在业务逻辑和业务流程上,用户界面可以用可视化工具方便的构成。通过操作界面元素,诸如菜单、按钮、对话框、编辑框、单选框、复选框、列表框和滚动条等,由可视开发工具自动生成应用软件。
8 、面向方面的软件开发方法
面向方面编程 (Aspect-Oriented Process , AOP) 是对软件工程的一种革新性思考。引入 AOP 的目的是解决诸如安全性、日志、持久化、调试、跟踪、分布式处理、性能监控以及更有效地处理异常等问题的。与常规的开发技术不同的是,常规技术会将这些不同的关注点实现于多个类中,而面向方面编程将使它们局部化。
面向方面软件开发 (AOSD) 使用这一方法,为功能需求、非功能需求、平台特性等创造了更好的模块性,使你开发出更易于理解的系统,也更易于配置和扩展,以满足和解决涉众的需求。
面向方面软件开发可以认为是以面向对象开发为基础的一种新型的看待业务系统的思考方法。可以如此看待这样的一个变化过程:面向对象为这个世界的描述提供了大量基础对象和基础对象的组合形态(各种组件),这个时候,我们如果从对象层面要观察一个庞大的业务系统就会显得过于繁复,于是,我们如果考虑对业务系统整体进行切割,每一个抽象的切面形成一个完整的业务系统的一个层面,于是,相关的分析与研究就基于这样的面的考虑,然后下面细化为对象和组件,上面组合形成为业务系统。
所以,本书认为面向方面的软件开发方法只是基于 OO 方法的一个较高抽象层面的方法,并不是一个完全崭新的开发方法论。
[1] 《软件开发方法评述》和胡朝晖博士早年撰写的《关于软件工程理论的认识与运用误区》一文。