我對(duì)什么是真正的對(duì)象,以及軟件中的對(duì)象在分析階段、設(shè)計(jì)階段、實(shí)現(xiàn)階段的一些看法
Posted on 2011-09-10 12:08 netfocus 閱讀(8118) 評(píng)論(30) 收藏 舉報(bào)最近對(duì)OO的理解又有了一些新的認(rèn)識(shí),拿出來和大家分享一下。為了能讓大家簡單直觀清晰的知道我想表達(dá)的主要意思,我不說廢話了。直接提出問題,然后回答。
- 什么是真正的對(duì)象?
- 什么是面向?qū)ο蠓治鲭A段時(shí)的對(duì)象?
- 什么是面向?qū)ο笤O(shè)計(jì)階段時(shí)的對(duì)象?
- 什么是面向?qū)ο髮?shí)現(xiàn)階段時(shí)的對(duì)象?
真正的對(duì)象
我所理解的真正的對(duì)象就是現(xiàn)實(shí)生活中客觀存在或不存在的真正的對(duì)象。這個(gè)對(duì)象有一個(gè)明顯的特征就是它具有非常多的狀態(tài)特征和行為特征。比如一個(gè)人是一個(gè)對(duì)象,他在一生中會(huì)經(jīng)歷無數(shù)個(gè)交互場景,在這個(gè)過程中,每個(gè)人的行為特征會(huì)不斷增多,大部分行為是通過后天學(xué)習(xí)得到的,只有少數(shù)行為是先天就具有的;另一方面,對(duì)于狀態(tài)特征也是在時(shí)不時(shí)的變化,比如你的身高、體重,等等。最后,人因?yàn)闀?huì)參與到不同的交互場景,會(huì)導(dǎo)致和他關(guān)聯(lián)的各種關(guān)聯(lián)信息也會(huì)不斷增多,比如你去上大學(xué),老師給你一張借書卡,此時(shí)你就擁有了一張借書卡,可以理解為你多了一個(gè)關(guān)聯(lián)信息;哪一天你去參加英語四級(jí)考試,考了70分,然后你擁有了一本四級(jí)考試證書,上面寫這成績?yōu)?0分,此時(shí)你也同樣多了一個(gè)關(guān)聯(lián)信息,就是一本英語四級(jí)考試證書;
這里我想表達(dá)的主要觀點(diǎn)是:現(xiàn)實(shí)生活中的對(duì)象:1)兼具各種場景下的所有狀態(tài)和行為特征;2)固有狀態(tài)會(huì)時(shí)不時(shí)的變化,通過參與交互場景還會(huì)增加一些關(guān)聯(lián)信息;3)行為會(huì)不斷增多,一般是通過學(xué)習(xí)得到;因此,我們從中可以知道,現(xiàn)實(shí)生活中的對(duì)象肯定不是我們?cè)O(shè)計(jì)軟件時(shí)候的對(duì)象,因?yàn)樗侨绱说膹?fù)雜,包含了或關(guān)聯(lián)了非常多的狀態(tài)特征和行為特征;
面向?qū)ο蠓治鲭A段時(shí)的對(duì)象
既然是分析階段,那我們就不要過多的考慮任何設(shè)計(jì)階段的思想。我覺得在分析階段,我們?cè)诜治鰧?duì)象時(shí)主要考慮兩個(gè)方面:1)對(duì)象的狀態(tài)特征變化規(guī)律;2)對(duì)象的行為特征變化規(guī)律;分析階段,我們往往從某個(gè)場景出發(fā),分析該場景中有哪些“對(duì)象”,此時(shí)的“對(duì)象”之所以加雙引號(hào)是因?yàn)樗皇钦嬲膶?duì)象,而是真正的對(duì)象的某個(gè)方面,我們?cè)谀硞€(gè)場景下只關(guān)心對(duì)象的某個(gè)方面;我覺得分析階段的對(duì)象和現(xiàn)實(shí)生活中的對(duì)象應(yīng)該是一致的,或者至少是邏輯上是一致的。也就是說,在面向?qū)ο蟮姆治鲭A段,我們應(yīng)該將現(xiàn)實(shí)生活中我們所理解的對(duì)象的一切特征在腦子里描述清楚。比如同一個(gè)人,它在不同的場景下(一個(gè)場景代表了一個(gè)考慮問題的邊界)會(huì)參與不同的交互活動(dòng)。 這句話體現(xiàn)的含義是:1)同一個(gè)對(duì)象會(huì)參與不同的場景,行駛各種交互行為;2)同一個(gè)對(duì)象我們會(huì)根據(jù)我們不同的認(rèn)識(shí)角度,對(duì)同一個(gè)對(duì)象的關(guān)注角度的不同,將其理解為不同的類型或角色;比如一個(gè)人,在家里可能是父親,在公司可能是職員,在比賽場上可能是運(yùn)動(dòng)員。但無論我們給這個(gè)人授予什么樣的稱謂,這個(gè)人始終是同一個(gè)對(duì)象。所以,在面向?qū)ο蟮姆治鲭A段,對(duì)象給我們的感覺是它在不停的變換其類型或角色;上面在談到什么是真正的現(xiàn)實(shí)生活中的對(duì)象時(shí)提到,對(duì)象在參與到交互活動(dòng)后會(huì)多出一些關(guān)聯(lián)信息,這些信息是屬于誰的呢?答案是:這些信息屬于扮演了某個(gè)角色的對(duì)象的;之所以強(qiáng)調(diào)扮演了某個(gè)角色,是因?yàn)橄胱尨蠹颐鞔_對(duì)象一定是在扮演某個(gè)角色參與到某個(gè)場景交互活動(dòng)后才具有那些關(guān)聯(lián)信息的。總結(jié):我覺得在面向?qū)ο蟮姆治鲭A段,我們分析的要點(diǎn)是:1)站在現(xiàn)實(shí)生活中真正的對(duì)象的角度去理解對(duì)象的狀態(tài)特征和行為特征的變化規(guī)律;2)理解真正的對(duì)象和對(duì)象的某一個(gè)方面(即我們所關(guān)心的“對(duì)象”),3)理解同一個(gè)對(duì)象會(huì)扮演不同角色參與到不同交互場景;4)理解對(duì)象的關(guān)聯(lián)信息如何產(chǎn)生,關(guān)聯(lián)信息是屬于誰的;
面向?qū)ο笤O(shè)計(jì)階段時(shí)的對(duì)象
首先說一下,目前的編程語言實(shí)現(xiàn)對(duì)象時(shí),是以哪些方式讓創(chuàng)建對(duì)象的。1)C#等基于類型的靜態(tài)語言,類型規(guī)定了對(duì)象可以具有的狀態(tài)特征和行為特征,對(duì)象的一切狀態(tài)和行為都是由其所屬的類型確定的;這又一個(gè)很明顯的好處時(shí),我們?cè)谌魏螘r(shí)候都知道對(duì)象的類型或接口,從而就能明確知道其數(shù)據(jù)結(jié)構(gòu),也就知道對(duì)象的狀態(tài),從而可以方便的持久化對(duì)象的狀態(tài)或者重建對(duì)象;但這種為對(duì)象帶來狀態(tài)和行為特征的設(shè)計(jì)思路同時(shí)也有一個(gè)缺點(diǎn)就是對(duì)象的類型或其表現(xiàn)出來的接口無法更改。這點(diǎn)是違背“真正的對(duì)象”或者“分析階段的對(duì)象”的特征的;2)javascript等弱類型的動(dòng)態(tài)語言,這種語言認(rèn)為對(duì)象無類型,對(duì)象的狀態(tài)和行為不需要從類型為模板獲取,狀態(tài)和行為可以隨時(shí)附加到某個(gè)對(duì)象上。這種思路其實(shí)很好,因?yàn)楹芊仙厦嫣岬降恼嬲膶?duì)象的狀態(tài)特征與行為特征的變化規(guī)律。但是這種語言也有一些致命的缺點(diǎn):1)由于沒有類型,導(dǎo)致無法在使用時(shí)明確知道其具有哪些狀態(tài)和行為,這會(huì)增加編程出錯(cuò)的可能性,只有在運(yùn)行階段在會(huì)檢測到訪問了不存在的狀態(tài)或行為;2)同樣是弱類型的原因,對(duì)象無法被持久化,因?yàn)椴恢酪志没男顟B(tài),同樣,更不用說重建對(duì)象了;所以,基于這兩個(gè)缺點(diǎn),我覺得動(dòng)態(tài)語言不適合在服務(wù)器端大量使用去做工程實(shí)現(xiàn)業(yè)務(wù)邏輯,而在一些不需要持久化對(duì)象狀態(tài)的客戶端環(huán)境,只在內(nèi)存中處理邏輯的情況下使用這種語言比較適合;
當(dāng)我們?cè)谠O(shè)計(jì)軟件時(shí),如果是用C#等靜態(tài)語言、基于類和接口的語言去設(shè)計(jì)對(duì)象時(shí),該如何設(shè)計(jì)呢?在設(shè)計(jì)階段,我覺得目標(biāo)就是把分析階段得到的對(duì)象用盡量平滑的方式轉(zhuǎn)換為設(shè)計(jì);需要把握的要點(diǎn)是:1)從一個(gè)基本的類創(chuàng)建出對(duì)象;2)用盡量平滑的設(shè)計(jì)思路去支持一個(gè)對(duì)象表現(xiàn)出不同類型或角色的特點(diǎn);舉個(gè)例子吧:
xuehua.Eat(); //吃飯
var teacher = xuehua.ActAs<ITeacher>();//扮演教師角色
teacher.Teach(); //教書
xuehua這個(gè)對(duì)象首先是一個(gè)人,所以從Person這個(gè)基本類型中獲取基本的狀態(tài)特征和行為特征(如吃飯);然后當(dāng)xuehua去教書時(shí),他會(huì)扮演教師的角色,扮演之后他就是一個(gè)教師了,然后他就具有了教師這個(gè)角色所賦予的行為(教書)了。上面的代碼看上去和真正的對(duì)象在現(xiàn)實(shí)生活中的變化規(guī)律類似,非常平滑;這樣做有幾個(gè)好處:1)強(qiáng)類型;2)對(duì)象交互模型與現(xiàn)實(shí)生活中的交互模型完全一致,所以代碼非常容易懂,可讀性強(qiáng);3)對(duì)象不會(huì)隨著參與交互場景的增多而變得臃腫和復(fù)雜,因?yàn)橛捎谝肓私巧母拍睿覀儗⒔换ツP蛯?shí)現(xiàn)為對(duì)象扮演某個(gè)角色參與交互活動(dòng)的方式來設(shè)計(jì),做到了對(duì)象動(dòng)態(tài)被賦予身份,從而具有與該身份相關(guān)的狀態(tài)特征和行為特征;4)對(duì)象參與交互場景后所關(guān)聯(lián)的一些關(guān)聯(lián)信息不會(huì)直接存放在對(duì)象上,而是放在了“扮演了某個(gè)角色的對(duì)象”上,在上面的例子中就是teacher對(duì)象;
面向?qū)ο髮?shí)現(xiàn)階段時(shí)的對(duì)象
那么如何實(shí)現(xiàn)這樣的設(shè)計(jì)呢?
var teacher = xuehua.ActAs<ITeacher>();
其實(shí)很簡單,可以類用裝飾模式來實(shí)現(xiàn),我們都知道,設(shè)計(jì)模式中的裝飾模式可以動(dòng)態(tài)給一個(gè)對(duì)象增加狀態(tài)或行為。所以在實(shí)現(xiàn)階段,我們可以設(shè)計(jì)一個(gè)Teacher類,大概設(shè)計(jì)如下:
{
private Person actor;
public Teacher(Person actor)
{
this.actor = actor;
}
public void Teach()
{
//do the teach operation.
}
}
teacher就是實(shí)現(xiàn)階段的對(duì)象,而Teacher類則是實(shí)現(xiàn)階段的對(duì)象的類型;可以看到Teacher類關(guān)聯(lián)了一個(gè)Person對(duì)象,同時(shí)實(shí)現(xiàn)了ITeacher角色接口。所以ActAs,
var teacher = xuehua.ActAs<ITeacher>();
這個(gè)函數(shù)做的事情就是在內(nèi)部創(chuàng)建一個(gè)Teacher類的實(shí)例,該實(shí)例對(duì)當(dāng)前的Person對(duì)象有一個(gè)引用,然后返回。也許你會(huì)說,返回回來的teacher對(duì)象已經(jīng)不是原來的xuehua對(duì)象了,而是一個(gè)新的對(duì)象,并且封裝了xuehua這個(gè)對(duì)象;沒錯(cuò),所以說這是實(shí)現(xiàn)上的問題。我們?cè)陉P(guān)注業(yè)務(wù)時(shí),關(guān)心的不是當(dāng)前對(duì)象的真正類型,而是關(guān)心對(duì)象的狀態(tài)特征、行為特征,或者技術(shù)化一點(diǎn)來講就是關(guān)心對(duì)象的交互模型,關(guān)心的是對(duì)象扮演什么角色在進(jìn)行交互。
好了,就說這么多吧,下午要去參加知識(shí)分享。希望我的文章能帶給大家一些啟發(fā)。
浙公網(wǎng)安備 33010602011771號(hào)