软件中的对象同领域中的概念有着密切的关系。
我们知道概念是人们在某个领域中实践经验的总结,并可能发展为理论。概念是以客观事物为基础,但不是对客观事物的刻板反映。它来自于实践,所以包含主体因素,这是很重要的。实践是概念的根本来源,理论上的需要对概念形成也有一些作用。
软件中使用的对象类似于领域中使用的概念。《UML与模式应用》中说,面向对象就是按照概念而不是功能进行分解。为什么软件要使用概念性元素呢?因为人的认识是概念性的,而软件由人来使用,人来开发。为了提供有良好概念性的用户接口,软件本身适宜采用概念性元素。由人来开发的软件则更需要采用概念性元素,软件本身和领域实践都有巨大的复杂性,人不是按照功能性元素来思考的,面向对象可以让开发人员用概念性元素思考,从而增加对复杂性的适应和控制能力。
领域概念是对象的重要来源,但是对象也形成于软件开发的过程。一方面,软件的使用没有改变领域实践的本质,至少没有完全改变,而概念反映了领域中已经成熟的认识,所以是非常重要的指导和参考。另一方面,领域实践由软件进行和由人进行确实非常不同,要求进行新的认识,软件本身的需要也会影响到对象的形成。
面向对象的基本特征反映着概念的基本特征。
- 封装:概念不是静态的,它的属性和操作不可分。
- 通信:概念不是孤立的,概念的属性可以其他概念构成,也可以在属性中引用其他概念,概念的操作过程中会用到其它的概念。
- 抽象:从具体概念可以进一步产生抽象概念。
- 多态:抽象概念有着多样的具体表现。
Stroustrup的《C++程序设计语言》中说:
“类应该用于模拟程序员的和应用的世界里的那些概念。...一个概念不会孤立地存在,它总与一些相关的概念共存,并在与相关概念的相互关系中表现出它的大部分力量。...因为我们要用类表示概念,问题就变成了如何去表示概念之间的关系。然而,我们无法在程序语言里表述任意的关系。即使能这样做,我们也未必想去做它。我们的类应该定义得比日常概念更窄一些——而且也更精确。”
我们可以体会这段话的深刻性。
- 类用来定义概念。首先,概念不是静态的,它的属性和操作不可分,封装是面向对象的第一个特征。然后,概念不是孤立的,一个概念总是与相关概念共存,最基本的关系有两对:封装和通信,抽象和多态。前者反映了分工与合作关系,后者反映了抽象与具体关系。类是面向对象的核心,从探讨类的作用出发,就引出了面向对象的四个基本特征。
- 类所定义的概念不但来自应用领域,也来自程序员引入的东西。
- “我们无法在程序语言里表述任意的关系。即使能这样做,我们也未必想去做它。”