軟件中的對象同領域中的概念有著密切的關系。
我們知道概念是人們在某個領域中實踐經驗的總結,并可能發展為理論。概念是以客觀事物為基礎,但不是對客觀事物的刻板反映。它來自于實踐,所以包含主體因素,這是很重要的。實踐是概念的根本來源,理論上的需要對概念形成也有一些作用。
軟件中使用的對象類似于領域中使用的概念。《UML與模式應用》中說,面向對象就是按照概念而不是功能進行分解。為什么軟件要使用概念性元素呢?因為人的認識是概念性的,而軟件由人來使用,人來開發。為了提供有良好概念性的用戶接口,軟件本身適宜采用概念性元素。由人來開發的軟件則更需要采用概念性元素,軟件本身和領域實踐都有巨大的復雜性,人不是按照功能性元素來思考的,面向對象可以讓開發人員用概念性元素思考,從而增加對復雜性的適應和控制能力。
領域概念是對象的重要來源,但是對象也形成于軟件開發的過程。一方面,軟件的使用沒有改變領域實踐的本質,至少沒有完全改變,而概念反映了領域中已經成熟的認識,所以是非常重要的指導和參考。另一方面,領域實踐由軟件進行和由人進行確實非常不同,要求進行新的認識,軟件本身的需要也會影響到對象的形成。
面向對象的基本特征反映著概念的基本特征。
- 封裝:概念不是靜態的,它的屬性和操作不可分。
- 通信:概念不是孤立的,概念的屬性可以其他概念構成,也可以在屬性中引用其他概念,概念的操作過程中會用到其它的概念。
- 抽象:從具體概念可以進一步產生抽象概念。
- 多態:抽象概念有著多樣的具體表現。
Stroustrup的《C++程序設計語言》中說:
“類應該用于模擬程序員的和應用的世界里的那些概念。...一個概念不會孤立地存在,它總與一些相關的概念共存,并在與相關概念的相互關系中表現出它的大部分力量。...因為我們要用類表示概念,問題就變成了如何去表示概念之間的關系。然而,我們無法在程序語言里表述任意的關系。即使能這樣做,我們也未必想去做它。我們的類應該定義得比日常概念更窄一些——而且也更精確。”
我們可以體會這段話的深刻性。
- 類用來定義概念。首先,概念不是靜態的,它的屬性和操作不可分,封裝是面向對象的第一個特征。然后,概念不是孤立的,一個概念總是與相關概念共存,最基本的關系有兩對:封裝和通信,抽象和多態。前者反映了分工與合作關系,后者反映了抽象與具體關系。類是面向對象的核心,從探討類的作用出發,就引出了面向對象的四個基本特征。
- 類所定義的概念不但來自應用領域,也來自程序員引入的東西。
- “我們無法在程序語言里表述任意的關系。即使能這樣做,我們也未必想去做它。”