面向對象程序設計的基本概念_第1頁
面向對象程序設計的基本概念_第2頁
面向對象程序設計的基本概念_第3頁
面向對象程序設計的基本概念_第4頁
面向對象程序設計的基本概念_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、面向對象程序設計的基本概念面向對象程序設計的基本概念2010-04-1420:01前言:面向對象程序設計(Object-OrientedProgramming,以下簡稱OOP)!種起源于六十年代的Simula語言,發(fā)展已經將近三十年的程序設計思想。其自身理論已經十分完善,并被多種面向對象程序設計語言(Object-OrientedProgrammingLanguage,以下簡稱OOPL決現。如果把Unix系統(tǒng)看成是國外在系統(tǒng)軟件方面的文化根基,那么Smalltalk語言無疑在OOPL域和Unix持有相同地位。由于很多原因,國內大部分程序設計人員并沒有很深的OO似及OOPL!論,很多人從一開始學

2、習到工作很多年都只是接觸到c/c+,java,vb,delphi等靜態(tài)類型語言,而對純粹的OO刖想以及作為OOPL艮基的Smalltalk以及動態(tài)類型語言知之甚少,不知道其實世界上還有一些可以針對變量不綁定類型的編程語言。而這些對比卻是深刻理解OO理論的重要部分,而國內這方面的資料也為數不多。故把自己的一些OC習心得寫下來做為一個系歹0文章(一共三篇,第一篇描敘OOP勺一些基本但容易被誤解的理論,第二篇主要說明各種OOPL典化和發(fā)展以及對于OOP理論的支持,第三篇主要是說模式和組件在OO仲的地位以及展望OOP勺未來),由于文章描敘的只是自己對于OOP/OOPL理解,錯誤以及淺薄之處在所難免,只

3、是希望對大家能起到拋磚引玉的作用。淺析OO的基石從抽象說起B(yǎng)ooch曾經在他自己的。頃域內的名著Booch94中開篇就論敘到了復雜性是軟件開發(fā)過程中所故有的特質。而人們處理復雜性的最根本武器就是抽象。廣義的抽象代表的是對復雜系統(tǒng)的簡化描敘或規(guī)格說明,為了突出系統(tǒng)的本質屆性而故意忽略其中的非實質性細節(jié)?!币粋€概念只有當能被最終用來實現的機制獨立的描敘,理解,分析時,才將這個概念限定為抽象的概念”。而Booch也給出了他心目中關于OO域內的狹義抽象定義:抽象表示一個對象與其他所有對象相區(qū)別的基本特征,因此提供了同觀察者角度有關的活晰定義的概念界限。”因此,根據不同觀察角度,我們可以針對OOP合出不

4、同級別的抽象層次。通常,面對一個典型的面向對象程序,Budd2002將其分成五個抽象層,分別覆蓋了OO仲的分析,設計與編程的各個階段:1, 最高級別的抽象層上,程序被看成是由很多相互作用并且遵守契約的對象所組成的對象集合。對象之間相互合作完成程序的計算任務。這個抽象級別上的典型代表就是設計模式思想(DesignPattern)。2, 第二個抽象層就是一個對象集單元,也就是一群定義之間有相互聯(lián)系的對象,在程序設計語!級別來看Java中是packages,C+中是namespace。這個抽象級別上的典型代表就是模塊化思想(Modularity)。3, 第三個抽象層所代表的是典型的OOP莫式:客戶/

5、服務器模型,這主要是用來抽象兩個對象之間的互交過程。在這個抽象級別上的典型代表就是對象之間的消息機制(MessagePassing)。4, 第四個抽象層就是針對一組相似對象定義一個類作為生成對象的棋板,類定義了對象的對外使用接口以及繼承對象所需的內部繼承接口,而這個抽象層次的典型代表就是接口編程(InterfaceProgramming)。5, 第五個抽象層就是實現一個類所需要的方法和成員變量的實現(Implementation)。在這里OOP終和POP(Procedure-OrientedProgramming)相融合。當然,我們可以根據各自的觀察角度劃分成更細的抽象層次比如說針對第五層抽象

6、用到的POPS論,我們還可以進一步的劃分出控制抽象(三種完全描敘圖靈機計算模型所需要的控制結構)以及數據抽象(ADTs)等等,并由此繼續(xù)下去(如果你的想象力足夠豐富的話:)。什么是OOP?OOP勺許多原始思想都來之于Simula語言,并在Smalltalk語言的完善和標準化過程中得到更多的擴展和對以前的思想的重新注解??梢哉fOC想和OOP乎是同步發(fā)展相互促進的。與函數式程序設計(functionalprogramming)和邏輯式程序設計(logic-programming)所代表的接近于機器的實際計算模型所不同的是,OOP!乎沒有引入精確的數學描敘,而是傾向于建立一個對象模型,它能夠近似的反

7、映應用領域內的實體之間的關系,其本質是更接近于一種人類認知事物所采用的哲學觀的計算模型。由此,導致了一個自然的話題,那就是OO倒底是什么?D&T1988B.S1991.。在OO仲,對象作為計算主體,擁有自己的名稱,狀態(tài)以及接受外界消息的接口。在對象模型中,產生新對象,舊對象銷毀,發(fā)送消息,響應消息就構成OOP+算模型的根本。對象的產生有兩種基本方式。一種是以原型(prototype)對象為基礎產生新的對象。一種是以類(class)為基礎產生新對象。原型的概念已經在認知心理學中被用來解釋概念學習的遞增特性,原型模型本身就是企圖通過提供一個有代表性的對象為基礎來產生各種新的對象,并由此繼續(xù)產生更符

8、合實際應用的對象。而原型-委托也是OO仲的對象抽象,代碼共享機制中的一種。一個類提供了一個或者多個對象的通用性描敘。從形式化的觀點看,類與類型有關,因此一個類相當于是從該類中產生的實例的集合。而這樣的觀點也會帶來一些矛盾,比較典型的就是在繼承體系下,子集(子類)對象和父集(父類)對象之間的行為相融性可能很難達到,這也就是OOW常被引用的-子類型(subtype)不等于子類(subclass)Budd2002。而在一種所有皆對象的世界觀背景下,在類模型基礎上還誕生出了一種擁有元類(metaclass)的新對象模型。即類本身也是一種其他類的對象。以上三種根本不同的觀點各自定義了三種基于類(clas

9、s-based),基于原型(prototype-based)和基于元類(metaclass-based)的對象模型。而這三種對象模型也就導致了許多不同的程序設計語言(如果我們暫時把靜態(tài)與動態(tài)的差別放在一邊)。是的,我們經常接觸的C+,Java都是使用基于類的對象模型,但除此之外還有很多我們所沒有接觸的OOPIX用了完全不一樣的對象模型,他們是在用另外一種觀點訟釋OOP勺內涵。什么是類型(type)?類型以及類型系統(tǒng)的起源以及研究與發(fā)展是獨立于OOP勺。早在五十年代的FORTRAN言編譯器實現中,就已經采用類型系統(tǒng)作為類型檢查的一種手段。廣義的類型一般被定義為一種約束,也就是一種邏輯公式。而在對

10、類型的研究過程中產生多種方法,比如C&W1985等。而代數方法(algebraicapproach)是一種非常好的建立類型的形式化規(guī)范的方法。代數中的一個類型對應于一系列元素,在它們之上定義代數操作。同時在此基礎上二階入演算已經被用于繼承和棋板所支持的模型。在上面兩種方法中,類型被認為是一系列滿足確定約束條件的元素,更抽象的方式可以把一個類型當作規(guī)定一個約束條件,如果我們規(guī)定的約束條件越好,相對應的被定義元素的集合就越精密,所以邏輯公式(logicalformulas)就成為描敘類型特征的最合適工具。在這里,我們不想深入的探究對于類型理論的各種不同的數學模型,我們需要明白的是類型(type)以

11、及類型理論這個在編程語言中經常應用到的概念的內涵是極其豐富的,而其自身理論的發(fā)展并非局限于OO比中,但當兩者相結合的時候就對我們的程序觀產生了巨大的影響。類(class),類型(type),接口(interface)這三個概念是在OO叫出現頻率最多,也最容易混淆的。而對于這三個概念的澄活也是文章寫作的初衷。讓我們先看看大師們對于這三個概念的描敘-ThefundamentalunitofprogramminginJavaprogramminglanguageistheclass,butthefundamentalunitoftheobject-orienteddesignisthetype.wh

12、ileclassesdefinetypes,itisveryusefulandpowerfultobeabletodefineatypewithoutdefiningaclass.Interfacedefinetypesinanabstractformasacollectionofmethodsorothertypesthatformthecontractforthetype.”Jams2000。InC+,AclassisauserdefinitetypeB.S1998。Atypeisanameusedtodenoteaparticularinterface-Anobjectmayhavema

13、nytypes,andwidelydifferentobjectscanshareatype.Partofanobjectsinterfacemaybecharacterizedbyonetype,andotherpartsbyothertypes.Twoobjectsofthesametypeneedonlysharepartsoftheirinterface.Interfacecancontainotherinterfaceassubset.Wesaythatatypeisasubtypeofanotherifitsinterfacecontaintheinterfaceofitssupe

14、rtype.OftenwespeakofasubtypeinheritingtheinterfaceofitssupertypeGamma1995在其中,一共出現了四個概念:類(class),類型(type),接口(interface)以及契約(contract)。這里我們說到的類型和上面提到的類型有所不同,是狹義的OO叫的類型。為了理解這幾個概念,我先劃分出三個概念域:一個是針對現實世界的,一個是針對特定程序設計范型的(在這里就是OC設計范型),最后一個是針對編譯器實現的。也就是說,在現實世界中的概念必須有一種手段映射到。砒型中去,而OO范型中的概念也應該在編譯器實現中有相同的概念對應。由此

15、,我們可以這樣說,類是做為現實世界中的概念,而傳統(tǒng)的OOPLTK會提供class關鍵字來表示對現實世界模擬的支持。而接口,是作為OOS序設計范型中與類對應的一個概念。在OO設計中,我們所要做的就是針對接口進行設計和編程,而接口的實質含義就是對象之間的一種契約。而類型就是編譯器實現中針對類和接口所定義的對應概念??梢赃@樣說,類是現實世界中存在的客觀概念,是唯物的。接口是設計人員定義出來的,存在于設計人員心中的概念,是唯心的。而類型是類和接口這兩種概念的編譯器實現的映射概念,也是唯物的。類型主要是用來指導編譯器的類型檢查的謂詞,類是創(chuàng)建現實對象的棋板,接口是OO設計中的關鍵概念。這三個概念相互區(qū)別

16、(分別位于不同的概念域),乂相互聯(lián)系(都是代表相同的概念的不同概念域的映射)。有了上面的理解,我們看看下面最常見的Java語句:peoplea=newman();這代表了什么狒序員向編譯器聲明了一個people類型(type)的對象變量a,而對象變量a本身卻指向了一個man類(class)的實體(而在編譯器中理解是對象變量a指向了一個類型為man的實體)。再讓我們回到Jams2000,其中句子的根本含義我們可以概括如下:聲明一個類或者一個接口都同時向編譯器注冊了一個新的類型,而此類或者接口以及類型都是共享同樣的一個名字。也就是說。編譯器所能理解的全部都是類型,而程序員的工作是把現實中的類概念轉

17、化為設計中的接口概念,而編譯器對應于上兩種概念都有直接的支持,那就是一個類聲明或者接口聲明在編譯器的理解來看就是一個類型聲明。但是反過來卻不一定成立。一個類可以有多個接口(一個類完全有可能實現了設計人員的多個契約條件),同時也就可能有多個類型(因為類型不過是接口這個設計域內的概念在編譯器中的實現)。多態(tài),替換原則,對象切割多態(tài)作為OO中的核心機制之一擁有著豐富的內涵。顧名思義,多態(tài)就是一種名稱多種形態(tài)的意思。其主要有三種形式:函數多態(tài),對象變量多態(tài),泛型多態(tài)。函數多態(tài)主要包括函數重載(overload)和改寫(overriding)。泛型多態(tài)(genericity)主要是提供了一種創(chuàng)建通用工具

18、的方法,可以在特定的場合將其特化。在這里,我們重點要考量的是對象變量多態(tài)。在理解對象變量多態(tài)之前,我們首先了解一下0誠心機制之一的替換原則。靜態(tài)類型的OOPL勺一個特征就是一個變量所包含的值(value)的類型可能并不等于這個變量所聲明的類型,在傳統(tǒng)的編程語言中并不具備這樣的特征,因為我們不可能把聲明為整型的變量賦上字符申的變量值。而替換原則發(fā)生作用的情況就隱含的描敘了兩種不同類型所具有的關聯(lián)-類型繼承。BarbaraLiskov曾經這樣描敘替換原則以及起作用的類型之間的關聯(lián):對于類型為S的每個對象s,存在一個類型為T的對象t,對于根據類型T所定義的所有程序P,如果用對象s替換對象t,程序P的

19、行為保持不變,那么類型S就是類型T的子類型Liskov1988在理解了多態(tài)以及替換原則后,我們可以繼續(xù)深入理解繼承與替換原則相結合所帶來的新的觀點。可以說繼承與替換原則的引入影響了幾乎所有的OOPL包括類型系統(tǒng),值語義/引用語義,對象內存空間分配等等。下面,我將試圖逐步的撥開其中的各種因果。首先考慮,peoplea;這樣的代碼在編譯器中將如何實現?可以肯定是首先將把類型people綁定到對象a上,然后必須為對象a分配空間。同時,我們創(chuàng)建people的子類man由于manISApeople。根據多態(tài)以及替換原則,我們當然可以讓對象a保存一個man類型的值(這就是替換原則的表現)。這是一種直觀的描

20、敘,但在編程語言的實現過程中就出現一些困難。我們知道繼承是一種擴展接口與實現的方式,那么我們就很難保證man類型不對people類型做擴展,而一旦做出擴展,我們如何能用存儲people對象的空間去存儲man類型的對象值呢?peoplea;manb=newman();a=b;這樣的代碼將首先把b對象進行切割,然后再存儲到a對象空間去。然而這并不是我們所期望的。那么,為了支持OOP勺繼承,多態(tài),替換原則,但卻需要避免對象切割的發(fā)生,面對對象a我們將采用何種分配空間模型呢?常用的有下面三種方式:1, 只為a分配基類people的存儲空間,不支持對象多態(tài)以及替換原則。這樣的模型內存分配緊湊,存儲效率很

21、高。2, 分配繼承樹中的最大類對象所需要空間(在這里是man類的對象值空間),這樣的模型簡單,同時可以實現多態(tài)和替換原則而避免對象切割問題,但是十分浪費內存空間十分明顯。3, 只分配用于保存一個指針所需要的存儲空間,在運行時通過堆來分配對象實際類型所需要的空間大小,這樣也可以實現多態(tài)和替換原則而避免對象切割問題。(也就是說a只是一個對象的引用,而不是真實的對象,真實對象的生成必須靠程序員顯式的聲明)。對于上面提到的三種內存模型,1和3都被一些程序設計語言所采用。相信說到這里,大家應該開始慢慢明白了。是的,C+乍為C語言的繼承者,對于效率的追求迫使它必須采用第一種最小靜態(tài)空間分配的方式,由于基于

22、??臻g的程序運行效率要比基于堆空間的程序運行效率高出許多,所以C+院許用棧空間保存對象,但同時也允許堆空間保存對象,可以說C+兜采用了1和3兩種相混合的內存模型,而C+州基于1內存模型的對象,也就是說基于棧內存空間的對象是沒有辦法體現多態(tài)和替換原則的(請思考一下在C+州什么對象是基于棧的),而基于3內存模型的對象將支持多態(tài)和替換原則(乂想一想在C+中什么對象是基于堆的)。這里,我們終于可以揭開第一層迷霧了,很多人都知道在C+州只有指針和引用才能支持對象的多態(tài)行為,但是為什么會如此?上面做出了最好的解釋。Java語舌由于設計理念和C+用著很大的區(qū)別,它米用的是第3種對象棋型,一切對象(除了基本類

23、型對象)都是基于堆分配的。這也是Java語言必須采用虛擬機的原因所在。在C+州很大一部分對象是不需要程序員進行管理的(靜態(tài)空間對象),而在Java中,如果不采用虛擬機機制,所有的對象都需要程序員管理,而這樣的開發(fā)代價將是巨大而不現實的。這也就揭開了第二層迷霧,當我們在對比C+新日Java語言的時候總是為虛擬機是否有其價值而爭論不休,但當你拋開所謂的好與不好的簡單討論,進入到其語言本身的內在對象存儲本質的時候,也許對于各種聲音才會有一個屆于自己的活醒認識。讓我們繼續(xù)望下走,不同的對象內存分配模型直接影響到其程序設計語言的賦值的含義。在各種編程語言中,賦值可以給出兩種不同的語義解釋:復制語義和指針

24、語義。很明顯,由于C+找持兩種相混合的對象存儲模型(但是默認的存儲方式是棧存儲),所以在C+州默認賦值語義米用的是前者,但C+W時提供了指針語義的功能支持(在拷貝構造函數和=運算符重載中用戶進行自定義)而在Java中采用的是后者。這也就是我們揭開的最后一道迷霧,不同的對象存儲模型直接導致了不同的賦值語義。面向對象的計算模型和可計算性編程就是用計算所需要的指令構成一種運算裝置,無論我們的程序設計思想以及程序設計語言如何發(fā)展和提高,最終我們所使用的底層計算數學模型并沒有改變。但高級程序設計語言給我們帶來的變革是在其語言環(huán)境中構建起了一個全新的,更抽象的虛擬計算模型。Smalltalk語言引入的對象

25、計算模型從根本上改變了以前的傳統(tǒng)計算模型,以前的計算模型突出的是順序計算過程中的機器狀態(tài),而現在的對象計算模型突出的對象之間的協(xié)作其計算結果由參加計算的所有的對象的狀態(tài)總體構成。而由于對象本身具有自身狀態(tài),我們也可以把一個對象看成是一個小的計算機器。這樣,面向對象的計算模型就演變成了許多小的計算機器的合作計算模型。圖靈機作為計算領域內的根本計算模型,精確的抓住了計算的要點:什么是可計算的,計算時間和空間存儲大小開銷有多大。計算模型活楚的界定了可計算性的范圍,也就界定了哪些問題是可求解,哪些問題是不可求解的。OOF%程序員提供了一種更加抽象和易于理解的新的計算模型,但其本身并沒有超越馮.諾依曼體

26、系所代表的圖靈機數學計算模型。所以我們不能期望00甬它幫助我們解決更多的問題,或者減少運算的復雜度。但OOFW能幫助我們用一種更容易被我們所理解和接受的方式去描敘和解決現實問題。結束這篇文章做為這個系列的第一篇,對于OO仲的許多核心概念和機制進行了有益的討論,作者衷心的希望通過這篇文章能夠讓大家對于OOFW更深入的理解,同時明白OOP乍為已經發(fā)展將近三十年的程序設計思想,其自身豐富的理論內涵不是單單學習幾門OOPIM可以領悟。最后期望本文能實現了它的初衷-拋磚引玉。Reference:D&T1988:TypeTheoriesandObject-OrientedprogrammingbyScottDanforthandChrisTomlinsononACMComputingSurveysVol.20No.1March1988Liskov1988:DataAbstractionandHierarchybyBarbaraLiskovonSigplanNotices,23(5),1988C&W1985Onunderstandingtypes,dataabstraction,andpolymorphismbyCardelli.LandWegne

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論