軟件中的對(duì)象同領(lǐng)域中的概念有著密切的關(guān)系。
我們知道概念是人們?cè)谀硞€(gè)領(lǐng)域中實(shí)踐經(jīng)驗(yàn)的總結(jié),并可能發(fā)展為理論。概念是以客觀事物為基礎(chǔ),但不是對(duì)客觀事物的刻板反映。它來自于實(shí)踐,所以包含主體因素,這是很重要的。實(shí)踐是概念的根本來源,理論上的需要對(duì)概念形成也有一些作用。
軟件中使用的對(duì)象類似于領(lǐng)域中使用的概念。《UML與模式應(yīng)用》中說,面向?qū)ο缶褪前凑崭拍疃皇枪δ苓M(jìn)行分解。為什么軟件要使用概念性元素呢?因?yàn)槿说恼J(rèn)識(shí)是概念性的,而軟件由人來使用,人來開發(fā)。為了提供有良好概念性的用戶接口,軟件本身適宜采用概念性元素。由人來開發(fā)的軟件則更需要采用概念性元素,軟件本身和領(lǐng)域?qū)嵺`都有巨大的復(fù)雜性,人不是按照功能性元素來思考的,面向?qū)ο罂梢宰岄_發(fā)人員用概念性元素思考,從而增加對(duì)復(fù)雜性的適應(yīng)和控制能力。
領(lǐng)域概念是對(duì)象的重要來源,但是對(duì)象也形成于軟件開發(fā)的過程。一方面,軟件的使用沒有改變領(lǐng)域?qū)嵺`的本質(zhì),至少?zèng)]有完全改變,而概念反映了領(lǐng)域中已經(jīng)成熟的認(rèn)識(shí),所以是非常重要的指導(dǎo)和參考。另一方面,領(lǐng)域?qū)嵺`由軟件進(jìn)行和由人進(jìn)行確實(shí)非常不同,要求進(jìn)行新的認(rèn)識(shí),軟件本身的需要也會(huì)影響到對(duì)象的形成。
面向?qū)ο蟮幕咎卣鞣从持拍畹幕咎卣鳌?/p>
- 封裝:概念不是靜態(tài)的,它的屬性和操作不可分。
- 通信:概念不是孤立的,概念的屬性可以其他概念構(gòu)成,也可以在屬性中引用其他概念,概念的操作過程中會(huì)用到其它的概念。
- 抽象:從具體概念可以進(jìn)一步產(chǎn)生抽象概念。
- 多態(tài):抽象概念有著多樣的具體表現(xiàn)。
Stroustrup的《C++程序設(shè)計(jì)語言》中說:
“類應(yīng)該用于模擬程序員的和應(yīng)用的世界里的那些概念。...一個(gè)概念不會(huì)孤立地存在,它總與一些相關(guān)的概念共存,并在與相關(guān)概念的相互關(guān)系中表現(xiàn)出它的大部分力量。...因?yàn)槲覀円妙惐硎靖拍睿瑔栴}就變成了如何去表示概念之間的關(guān)系。然而,我們無法在程序語言里表述任意的關(guān)系。即使能這樣做,我們也未必想去做它。我們的類應(yīng)該定義得比日常概念更窄一些——而且也更精確。”
我們可以體會(huì)這段話的深刻性。
- 類用來定義概念。首先,概念不是靜態(tài)的,它的屬性和操作不可分,封裝是面向?qū)ο蟮牡谝粋€(gè)特征。然后,概念不是孤立的,一個(gè)概念總是與相關(guān)概念共存,最基本的關(guān)系有兩對(duì):封裝和通信,抽象和多態(tài)。前者反映了分工與合作關(guān)系,后者反映了抽象與具體關(guān)系。類是面向?qū)ο蟮暮诵模瑥奶接戭惖淖饔贸霭l(fā),就引出了面向?qū)ο蟮乃膫€(gè)基本特征。
- 類所定義的概念不但來自應(yīng)用領(lǐng)域,也來自程序員引入的東西。
- “我們無法在程序語言里表述任意的關(guān)系。即使能這樣做,我們也未必想去做它。”