面向对象软件工程方法学实践
北京工业大学计算机学院 赵晓华
两位研究面向对象软件工程的美国学者 (Stave Halladay 和 Michael Wiebel) 曾这
样说:"一般的面向对象编程(OOP) 思路不过是一批乌合之众,把灵机一动、随机应变的技
巧用于他们绞尽脑汁抽象出来的‘对象’而已。即使是最优秀的 OOP 程序员,他们所能
对付的极限也莫过于中等规模的开发项目。倘若程序员经验不足,系统规模又很大,那么
采用 OOP 只能把你引入漫无边际的泥沼之中。"
一方面是几乎没有一位软件工程学者认为 OOP 是完美无缺的,另一方面是 OOP 势如
破竹,近乎每一种最新推出的程序开发工具或语言都采用了 OOP 思路;一方面是越来越多
的"乌合之众"在毫无章法、随心所欲地处理着"对象",另一方面是经过近 30 年的积累已
经拥有了最大多数用户的结构化软件方法的日渐萎缩……面对这一现实,研究软件工程方
法学的专家们纷纷指出:"当前摆在软件开发方法学面前的一个重要课题是:从理论上理解
OOP 具有强大生命力的天然合理性,并完善面向对象软件工程方法学体系。"
一年来我们通过国内外一些实用系统的开发实践,对面向对象的软件工程方法进行了
较为深入的学习和探讨,特别是在北京市公路局计算机系统的一期工程实践中,借鉴国外
软件设计经验,较系统地采用了面向对象软件工程方法,受益匪浅。
一、是"设计主导"还是"程序主导"
在一个系统开发过程中是只采用 OOP 还是采用了 OOSE(面向对象软件工程)方法,关
键看整个开发过程是"设计主导"还是"程序主导"。
近年来,大量先进程序开发工具进入我国,这对提高软件开发效率无疑具有很大的作
用。然而,它们又往往使程序主导型软件开发人员在"以程序代系统"、"以算法代设计"的
误区里越陷越深。
一般的软件开发人员(包括那些只见程序不见系统的程序员)主观上都认为:软件开发
不应"系统设计主导"而应"程序算法主导"。但是用下面几个问题考察一下,结果往往相反
。
问题 1 在进行软件设计和选择软件开发工具之前,是否进行开发方法学的选择?
所谓方法学是指组织软件生产过程的一系列方法、技术和规范。方法学是软件开发
者长年失败和成功经验的理论性总结,从软件重用的思路来说,方法学重用的价值远非某
些程序组件重用可比。
以北京市公路局系统为例。首先,在系统调查阶段我们了解到:这个系统要分期 (递
增式) 开发。由于处于机构改革时期,系统生存期内的用户需求和系统结构变因很多。这
表明目标系统应该具有较强的可维护性,即每期开发成果应在后续工程中具有较高的可重
用率。其次,一期工程的工作量相当大(最后成果包括 124 个模块、72 类报表、119 个数
据库表、439 个窗口、912 个数据窗口),而开发者对公路局业务不了解,多为经验不足的
大学生,理解需求的能力较低。这表明采用的开发方法学必须能最大限度地减少重复劳动
,实现开发过程中的成果共享和重用;必须能支持消除需求理解误差的调整工序,使下游成
品阶段的设计变更比较容易进行。
在开发此系统之前,我们承接了一个国外软件的下游开发任务。由于它采用了面向对
象的软件设计,使我们深刻认识到国内外软件开发方法学和技术上的差距,颇受启发。
参照我们承接的国外软件开发工作量计算方法,即仅下游 120 个模块 (含报表) 的编
码和测试为 41 人月,那么公路局系统从上游设计开始近 200 个模块和报表、100 多个数据库
表的开发工作量至少也应在 120 人月以上。由于采用了面向对象的软件工程方法,尽管开
发人员大多经验不足,但是第一期工程总工时最终仍控制在 80 人月以内,降低成本 1/3 左