解讀面向?qū)ο蟮某绦蛟O(shè)計(二)
面向?qū)ο缶幊蹋∣bjectOrientedProgramming,OOP,面向?qū)ο蟪绦蛟O(shè)計)是一種計算機編程架構(gòu)。接上一篇。OOP的一條基本原則是計算機程序是由單個能夠起到子程序作用的單元或?qū)ο蠼M合而成。OOP達到了軟件工程的三個主要目標(biāo):重用性、靈活性和擴展性。
一、OOP技術(shù)的歷史
面向?qū)ο蠹夹g(shù)最初是從面向?qū)ο蟮某绦蛟O(shè)計開始的,它的出現(xiàn)以60年代simula語言為標(biāo)志。80年代中后期,面向?qū)ο蟪绦蛟O(shè)計逐漸成熟,被計算機界理解和接受,人們又開始進一步考慮面向?qū)ο蟮拈_發(fā)問題。這就是九十年代以MicrosoftVisual系列OOP軟件的流行的背景。
傳統(tǒng)的結(jié)構(gòu)化分析與設(shè)計開發(fā)方法是一個線性過程,因此,傳統(tǒng)的結(jié)構(gòu)化分析與設(shè)計方法要求現(xiàn)實系統(tǒng)的業(yè)務(wù)管理規(guī)范,處理數(shù)據(jù)齊全,用戶能全面完整地其業(yè)務(wù)需求。
傳統(tǒng)的軟件結(jié)構(gòu)和設(shè)計方法難以適應(yīng)軟件生產(chǎn)自動化的要求,因為它以過程為中心進行功能組合,軟件的擴充和復(fù)用能力很差。
對象是對現(xiàn)實世界實體的模擬,因面能更容易地理解需求,即使用戶和分析者之間具有不同的教育背景和工作特點,也可很好地溝通。
區(qū)別面向?qū)ο蟮拈_發(fā)和傳統(tǒng)過程的開發(fā)的要素有:對象識別和抽象、封裝、多態(tài)性和繼承。
對象(Object)是一個現(xiàn)實實體的抽象,由現(xiàn)實實體的過程或信息牲來定義。一個對象可被認為是一個把數(shù)據(jù)(屬性)和程序(方法)封裝在一起的實體,這個程序產(chǎn)生該對象的動作或?qū)λ邮艿降耐饨缧盘柕姆磻?yīng)。這些對象操作有時稱為方法。對象是個動態(tài)的概念,其中的屬性反映了對象當(dāng)前的狀態(tài)。
類(Class)用來描述具有相同的屬性和方法的對象的集合。它定義了該集合中每個對象所共有的屬性和方法。對象是類的實例。
由上分析不難看出,盡管OOP技術(shù)更看中用戶的對象模型,但其目的都是以編程為目的的,而不是以用戶的信息為中心的,總想把用戶的信息納入到某個用戶不感興趣的“程序?qū)ο?#8221;中。
二、OOP的優(yōu)缺點
OOP的優(yōu)點:
使人們的編程與實際的世界更加接近,所有的對象被賦予屬性和方法,結(jié)果編程就更加富有人性化。
OOP的缺點:
就C++而言,由于面向更高的邏輯抽象層,使得C++在實現(xiàn)的時候,不得不做出性能上面的犧牲,有時候甚至是致命的(所有對象的屬性都經(jīng)過內(nèi)置多重指針的間接引用是其性能損失的主要原因之一;不過,筆者的局限性在于未使用過VC++外的面向?qū)ο笳Z言,所以不是十分肯定,哈哈,有人笑出來了…)。
在計算機速度飛速發(fā)展的今天,你可能會說,一丁點的性能犧牲沒什么大不了。是的,從面向?qū)ο蟮慕嵌龋沟木幊痰慕Y(jié)構(gòu)更加清晰完整,數(shù)據(jù)更加獨立和易于管理,性能的犧牲可以帶來這么多的好處,沒有理由不做穩(wěn)賺的生意吧?
不過,在某些對速度要求極高特殊場合,例如你做的是電信的交換系統(tǒng),每秒鐘有超過百萬的人同時進行電話交換,如果,每一個數(shù)據(jù)交換過程都是一個對象,那么總的性能損失將是天文數(shù)字!!
或者這個例子不夠貼身,再舉個例子吧。假如你受聘于一個游戲設(shè)計公司,老板希望做出來的游戲可以更多的兼顧到更多的電腦使用者,游戲每秒鐘的運行的幀可以更多,子彈和爆炸物可以更多、更華麗。那么,你會發(fā)現(xiàn)使用C++會使你的程序變得笨拙,無法滿足你的需求,除非你非得要你的游戲運行于奔騰四的機器上(如果不是,而你又堅持用C++的對象編程,那么請減少主角的槍的威力吧)。
如果你是冥頑不寧的人,你說不相信OOP會有性能上的損失,那么,我記得曾看到在CSDN上關(guān)于VB和VC執(zhí)行效率的討論的文章,講述的就是使用了MFC以后,執(zhí)行效率甚至低于VB開發(fā)出來的東西。請各位驗證一下:如果使用的是純粹的C語言語法的話,那么一定會比在VB編出來的東西要快很多(GetTickCount函數(shù)可以查閱MSDN,如果想更加精確一些,可以使用QueryPerformanceCounter函數(shù))。