面向对象软件工程方法学实践

2008-04-09 04:03:46来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

两位研究面向对象软件工程的美国学者 (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左右。同时在系统可维护性、重用度及其他功能和性能指标上,均超过了我们以往采用结构化方法开发的系统。
  对停留在程序主导级开发的软件开发人员来说,他们选择 OOP 的原因也往往是被动的。其实,在程序主导开发者的辞典中是找不到“方法学”这一词的,或者把“方法学”与“程序算法”混为一谈。至于把 OOP 看成是 OOSE 的全部就更不足为怪了。
问题2 对象抽象的出发点是现实世界的问题描述,还是可执行的实例对象?
  在现实世界早期抽象阶段,面向对象方法与其他方法区别并不大,都要从现实世界的问题描述出发,即从用户接口、问题领域的知识和经验出发,构筑现实世界的问题模型,也就是确定目标系统是“做什么的”。面向对象的问题分析模型从3个侧面进行描述,即对象模型 (对象的静态结构)、动态模型(对象相互作用的顺序)和功能模型(数据变换及功能依存关系)。软件工程的抽象原则、层次原则和分割原则同样适用于面向对象方法,即对象抽象与功能抽象原则是一样的,也是从高级到低级、从逻辑到物理,逐级细分。每一级抽象都重复对象建模 (对象识别)→动态建模(事件识别)→功能建模(操作识别)的过程,直到每一个对象实例在物理(程序编码)上全部实现。
  对象抽象是从逻辑级还是物理级出发,与开发前是否进行方法学选择一样,也是区分OOSE 与 OOP 的试金石。由于许多工具或语言(如PB、C++、Motif) 都支持OOP,使一些程序级系统开发人员可以很方便地不经过逻辑抽象就直接开发物理对象,在早期阶段意识不到从物理层即实例对象出发进行系统开发的祸患,孰不知正是这种随心所欲的 OOP 不仅无法发挥面向对象方法应有的优越性,而且还会给开发后期带来大量返工作业。
  和以往采用结构化方法一样,我们在系统设计阶段也引入了原型化方法,以便用系统样品即原型与用户对话,求得对需求理解的勾通,避免或减少后期返工。大多OOP工具都为开发原型提供便利,问题在于原型与最终产品间的关系,即原型是逻辑对象还是物理对象的样品。若是后者,那就等同于最终产品。在木已成舟时再让用户评审,若发现问题,要么推倒重来,要么强迫用户削足适履。事实上,我们为设计评审而基于逻辑对象开发的原型,相当部分被用户否决。但由于尚未进行对象实例即物理级开发,而是使用超类对象原型统一模拟对象事件和操作,所以无论是对象模型、动态模型还是功能模型,修改起来都不困难。
问题3 设计阶段是否先设计超类,是否在实例对象设计开始之前完成超类对象的实现?

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:统一建模语言UML轻松入门之基本概念

下一篇:面向对象技术概述