|
首先必须申明的是,本文所讲述的观点仅适应于基于传统瀑布模型的面向对象系统实现过程,这一过程包括可行性分析、需求分析、面向对象分析与设计、面向对象实现及系统测试。所论述的观点并不适应于在系统实现过程中发现问题然后再修改系统设计的开发过程。 总的来说,学好面向对象语言的目的就是能够更好地进行面向对象的分析与设计。在这里或许会有这样的疑问,面向对象的分析与设计是设计层面上的东西,它使得系统设计人员把更多的精力放在系统的伸缩性、延展性以、稳定性以及可维护性上,很少会关注到某个过程的具体实施语言和实施细节;而从语言抽象的角度来看,各种面向对象语言其基本思想都是一致的,因此,或许会有不少的系统设计师注重于系统的设计层面,而对具体的面向对象语言却只是知其一二。 另一方面,在我们学习面向对象语言的过程中,大多数情况下都是首先学习该语言的过程化语法(比如在C++语言中,循环语句应该如何写,而对于Delphi语言,循环语句的语法又是如何),接着学习什么是类、什么是抽象、什么是封装、什么是继承、什么是构造函数和析构函数、什么是虚基类,等等这一系列的面向对象语言的特性。而后在自己做学习实验的时候,也顶多是写几个类,再继承一下,实现各自的方法,最后再到main函数中创建类的实例并通过调用实例的方法来获得计算结果。 其实,以上两种对待面向对象语言的态度都是不正确的。我们先来讨论后者。在我们学习面向对象语言的过程中,我们有没有想到过一个基本问题:为什么要学习面向对象语言?我们知道,世界上的万事万物都可以看作是属于不同类别的个体,或称之为对象,这些对象之间彼此存在着直接或间接的关联。面向对象的设计思想恰好也是以类、类与类之间的关系作为分析问题的基础点,因此,使用面向对象的分析与设计能够很自然地表示与系统相关的各个对象并表达这些对象之间的联系。通过面向对象的分析与设计,能够使得原本复杂的设计问题变得简单而有条理。面向对象语言作为面向对象分析与设计的最终描述性语言,使得面向对象分析与设计的结果能够很方便地编译成计算机可以识别的二进制代码或中间语言。由此可见,面向对象语言是一种具体形式,不同的语言有着相同的中心思想,然而却有着不同的表现形式。在学习面向对象语言的过程中,我们不应该把重点放在不同语言的各种表现形式上,而应该更多地了解面向对象语言是如何支持面向对象的分析与设计的,进而将面向对象思想用于解决系统设计问题。当然,在对问题进行分析的过程中,不要盲目地推崇面向对象思想,有些非常简单的问题可以使用结构化设计方法解决,就没有必要去创建几个将来可能永远都用不到的类了。 相反,学好面向对象语言,对做好面向对象的分析与设计非常重要。提倡在系统设计时不讨论系统的开发语言与开发环境这一思想是错误的。就面向对象的设计过程而言,如果你不知道各种面向对象语言的特点,那么你就无法在系统设计时确定系统开发使用哪种语言更加合适,在设计时要确定类以及类与类之间的关系更是无从谈起。 例如,在Delphi语言(在Delphi推出后,正式地将Object Pascal语言命名为Delphi语言,与传统的Pascal语言不同的是,Delphi语言是面向对象的语言)的早期版本(Delphi 8.0以前)中,并不支持运算符重载,然而C++就支持。再譬如,不同的面向对象语言在接口的定义方面也存在差别,Delphi语言和C#语言可以使用interface关键字,而标准C++则没有,它是通过创建具有纯虚函数的抽象类来实现的。还有就是,C++支持类的多重继承,为了保证同一函数定义在子类中只有一个版本,就需要使用虚继承的方式,而C#则只支持单类多接口继承。种种例子表明,面向对象的分析与设计的结果影响到了面向对象语言的选用,但面向对象语言的选用并不仅仅依赖于面向对象分析与设计的结果,这里存在一对矛盾,需要系统设计师在设计过程中综合各方面的决定因素来解决这个问题。 总之,光顾着系统设计而将面向对象语言扔到一边是不恰当的,过多地把精力放在学习面向对象语言的具体实现上也是不可取的,我们不仅要使我们的系统设计与面向对象语言统一起来,而且还要能够从各种面向对象语言的具体实现中抽象出面向对象思想,以帮助我们更好地完成系统分析和设计。
|