評論(0

面向對象編程

標籤: 暫無標籤

面向對象編程是一種計算機編程架構。

     面向對象編程(Object Oriented Programming,OOP,面向對象程序設計)是一種計算機編程架構。OOP 的一條基本原則是計算機程序是由單個能夠起到子程序作用的單元或對象組合而成。OOP 達到了軟體工程的三個主要目標:重用性、靈活性和擴展性。為了實現整體運算,每個對象都能夠接收信息、處理數據和向其它對象發送信息。

面向對象編程面向對象編程

 

 

1 面向對象編程 -OOP 主要有以下的概念和組件

      什麼是OOP?
  OOP的許多原始思想都來之於Simula語言,並在Smalltalk語言的完善和標準化過程中得到更多的擴展和對以前的思想的重新註解。可以說OO思想和OOPL幾乎是同步發展相互促進的。與函數式程序設計(functional-programming)和邏輯式程序設計(logic-programming)所代表的接近於機器的實際計算模型所不同的是,OOP幾乎沒有引入精確的數學描敘,而是傾向於建立一個對象模型,它能夠近似的反映應用領域內的實體之間的關係,其本質是更接近於一種人類認知事物所採用的哲學觀的計算模型。由此,導致了一個自然的話題,那就是OOP到底是什麼?[D&T1988][B.S1991].。在OOP中,對象作為計算主體,擁有自己的名稱,狀態以及接受外界消息的介面。在對象模型中,產生新對象,舊對象銷毀,發送消息,響應消息就構成OOP計算模型的根本。
  對象的產生有兩種基本方式。一種是以原型(prototype)對象為基礎產生新的對象。一種是以類(class)為基礎產生新對象。原型的概念已經在認知心理學中被用來解釋概念學習的遞增特性,原型模型本身就是企圖通過提供一個有代表性的對象為基礎來產生各種新的對象,並由此繼續產生更符合實際應用的對象。而原型-委託也是OOP中的對象抽象,代碼共享機制中的一種。一個類提供了一個或者多個對象的通用性描敘。從形式化的觀點看,類與類型有關,因此一個類相當於是從該類中產生的實例的集合。而這樣的觀點也會帶來一些矛盾,比較典型的就是在繼承體系下,子集(子類)對象和父集(父類)對象之間的行為相融性可能很難達到,這也就是OOP中常被引用的---子類型(subtype)不等於子類(subclass)[Budd2002]。而在一種所有皆對象的世界觀背景下,在類模型基礎上還誕生出了一種擁有元類(metaclass)的新對象模型。即類本身也是一種其他類的對象。以上三種根本不同的觀點各自定義了三種基於類(class-based),基於原型(prototype-based)和基於元類(metaclass-based)的對象模型。而這三種對象模型也就導致了許多不同的程序設計語言(如果我們暫時把靜態與動態的差別放在一邊)。是的,我們經常接觸的C++, Java都是使用基於類的對象模型,但除此之外還有很多我們所沒有接觸的OOPL採用了完全不一樣的對象模型,他們是在用另外一種觀點詮釋OOP的內涵。

面向對象編程面向對象編程

     組件 - 數據和功能一起在運行著的計算機程序中形成的單元,組件在 OOP 計算機程序中是模塊和結構化的基礎。 
      抽象性 - 程序有能力忽略正在處理中信息的某些方面,即對信息主要方面關注的能力。 
      封裝 - 也叫做信息封裝:確保組件不會以不可預期的方式改變其它組件的內部狀態;只有在那些提供了內部狀態改變方法的組件中,才可以訪問其內部狀態。每類組件都提供了一個與其它組件聯繫的介面,並規定了其它組件進行調用的方法。 
      多態性 - 組件的引用和類集會涉及到其它許多不同類型的組件,而且引用組件所產生的結果得依據實際調用的類型。 
     繼承性 - 允許在現存的組件基礎上創建子類組件,這統一併增強了多態性和封裝性。典型地來說就是用類來對組件進行分組,而且還可以定義新類為現存的類的擴展,這樣就可以將類組織成樹形或網狀結構,這體現了動作的通用性。

  

  

面向對象編程面向對象編程
由於抽象性、封裝性、重用性以及便於使用等方面的原因,以組件為基礎的編程在腳本語言中已經變得特別流行。Python 和 Ruby 是最近才出現的語言,在開發時完全採用了 OOP 的思想,而流行的 Perl 腳本語言從版本5開始也慢慢地加入了新的面向對象的功能組件。用組件代替「現實」上的實體成為 JavaScript(ECMAScript) 得以流行的原因,有論證表明對組件進行適當的組合就可以在英特網上代替 HTML 和 XML 的文檔對象模型(DOM)。  (JavaScript並不是真正的面向對象語言)

2oop的基本思想

 

面向對象編程面向對象編程

     OOP的許多原始思想都來之於Simula語言,並在Smalltalk語言的完善和標準化過程中得到更多的擴展和對以前的思想的重新註解。可以說OO思想和OOPL幾乎是同步發展相互促進的。與函數式程序設計(functional-programming)和邏輯式程序設計(logic-programming)所代表的接近於機器的實際計算模型所不同的是,OOP幾乎沒有引入精確的數學描敘,而是傾向於建立一個對象模型,它能夠近似的反映應用領域內的實體之間的關係,其本質是更接近於一種人類認知事物所採用的哲學觀的計算模型。由此,導致了一個自然的話題,那就是OOP到底是什麼?【D&T 1988】【B.S 1991】 .。在OOP中,對象作為計算主體,擁有自己的名稱,狀態以及接受外界消息的介面。在對象模型中,產生新對象,舊對象銷毀,發送消息,響應消息就構成OOP計算模型的根本。

      對象的產生有兩種基本方式。一種是以原型(prototype)對象為基礎產生新的對象。一種是以類(class)為基礎產生新對象。原型的概念已經在認知心理學中被用來解釋概念學習的遞增特性,原型模型本身就是企圖通過提供一個有代表性的對象為基礎來產生各種新的對象,並由此繼續產生更符合實際應用的對象。而原型-委託也是OOP中的對象抽象,代碼共享機制中的一種。一個類提供了一個或者多個對象的通用性描敘。從形式化的觀點看,類與類型有關,因此一個類相當於是從該類中產生的實例的集合。而這樣的觀點也會帶來一些矛盾,比較典型的就是在繼承體系下,子集(子類)對象和父集(父類)對象之間的行為相融性可能很難達到,這也就是OOP中常被引用的---子類型(subtype)不等於子類(subclass)【Budd 2002】。而在一種所有皆??一種擁有元類(metaclass)的新對象模型。即類本身也是一種其他類的對象。以上三種根本不同的觀點各自定義了三種基於類(class-based),基於原型(prototype-based)和基於元類(metaclass-based)的對象模型。而這三種對象模型也就導致了許多不同的程序設計語言(如果我們暫時把靜態與動態的差別放在一邊)。是的,我們經常接觸的C ,Java都是使用基於類的對象模型,但除此之外還有很多我們所沒有接觸的OOPL採用了完全不一樣的對象模型,他們是在用另外一種觀點詮釋OOP的內涵。

      什麼是oop的基本思想呢?把組件的實現和介面分開,並且讓組件具有多態性。不過,兩者還是有根本的不同。oop強調在程序構造中語言要素的語法。你必須得繼承,使用類,使用對象,對象傳遞消息。gp不關心你繼承或是不繼承,它的開端是分析產品的分類,有些什麼種類,他們的行為如何。就是說,兩件東西相等意味著什麼?怎樣正確地定義相等操作?不單單是相等操作那麼簡單,你往深處分析就會發現「相等」這個一般觀念意味著兩個對象部分,或者至少基本部分是相等的,據此我們就可以有一個通用的相等操作。再說對象的種類。假設存在一個順序序列和一組對於順序序列的操作。那麼這些操作的語義是什麼?從複雜度權衡的角度看,我們應該向用戶提供什麼樣的順序序列?該種序列上存在那些操作?那種排序是我們需要的?只有對這些組件的概念型分類搞清楚了,我們才能提到實現的問題:使用模板、繼承還是宏?使用什麼語言和技術?gp的基本觀點是把抽象的軟體組件和它們的行為用標準的分類學分類,出發點就是要建造真實的、高效的和不取決於語言的演算法和數據結構。當然最終的載體還是語言,沒有語言沒法編程。stl使用c ,你也可以用ada來實現,用其他的語言來實現也行,結果會有所不同,但基本的東西是一樣的。到處都要用到二分查找和排序,而這就是人們正在做的。對於容器的語義,不同的語言會帶來輕微的不同。但是基本的區別很清楚是gp所依存的語義,以及語義分解。例如,我們決定需要一個組件swap,然後指出這個組件在不同的語言中如果工作。顯然重點是語義以及語義分類。而oop所強調的(我認為是過分強調的)是清楚的定義類之間的層次關係。oop告訴了你如何建立層次關係,卻沒有告訴你這些關係的實質。
(這段不太好理解,有一些術語可能要過一段時間才會有合適的中文翻譯——譯者)

      面向對象的編程方法OOP是九十年代才流行的一種軟體編程方法。它強調對象的「抽象」、「封裝」、「繼承」、「多態」。我們講程序設計是由「數據結構」 「演算法」組成的。從宏觀的角度講,OOP下的對象是以編程為中心的,是面向程序的對象。我們今天要講的OOD是面向信息的對象,是以用戶信息為中心的。

3 面向對象編程 -OOP技術的歷史

  面向對象技術最初是從面向對象的程序設計開始的,它的出現以60年代simula語言為標誌。80年代中後期,面向對象程序設計逐漸成熟,被計算機界理解和接受,人們又開始進一步考慮面向對象的開發問題。這就是九十年代以Microsoft Visual系列OOP軟體的流行的背景。

  傳統的結構化分析與設計開發方法是一個線性過程,因此,傳統的結構化分析與設計方法要求現實系統的業務管理規範,處理數據齊全,用戶能全面完整地其業務需求。

  傳統的軟體結構和設計方法難以適應軟體生產自動化的要求,因為它以過程為中心進行功能組合,軟體的擴充和復用能力很差。

  對象是對現實世界實體的模擬,因面能更容易地理解需求,即使用戶和分析者之間具有不同的教育背景和工作特點,也可很好地溝通。

  區別面向對象的開發和傳統過程的開發的要素有:對象識別和抽象、封裝、多態性和繼承。

  對象(Object)是一個現實實體的抽象,由現實實體的過程或信息牲來定義。一個對象可被認為是一個把數據(屬性)和程序(方法)封裝在一起的實體,這個程序產生該對象的動作或對它接受到的外界信號的反應。這些對象操作有時稱為方法。對象是個動態的概念,其中的屬性反映了對象當前的狀態。

  類(Class)用來描述具有相同的屬性和方法的對象的集合。它定義了該集合中每個對象所共有的屬性和方法。對象是類的實例。

  由上分析不難看出,儘管OOP技術更看中用戶的對象模型,但其目的都是以編程為目的的,而不是以用戶的信息為中心的,總想把用戶的信息納入到某個用戶不感興趣的「程序對象」中。

4 面向對象編程 -OOP 的優缺點

       OOP 的優點:使人們的編程與實際的世界更加接近,所有的對象被賦予屬性和方法,結果編程就更加富有人性化。

      OOP 的也有缺點,就 C 而言,由於面向更高的邏輯抽象層,使得 C 在實現的時候,不得不做出性能上面的犧牲,有時候甚至是致命的 ( 所有對象的屬性都經過內置多重指針的間接引用是其性能損失的主要原因之一;不過,筆者的局限性在於未使用過 VC 外的面向對象語言,所以不是十分肯定,哈哈,有人笑出來了… )。

      在計算機速度飛速發展的今天,你可能會說,一丁點的性能犧牲沒什麼大不了。是的,從面向對象的角度,使的編程的結構更加清晰完整,數據更加獨立和易於管理,性能的犧牲可以帶來這麼多的好處,沒有理由不做穩賺的生意吧?

      不過,在某些對速度要求極高特殊場合,例如你做的是電信的交換系統,每秒鐘有超過百萬的人同時進行電話交換,如果,每一個數據交換過程都是一個對象,那麼總的性能損失將是天文數字!!

      或者這個例子不夠貼身,再舉個例子吧。假如你受聘於一個遊戲設計公司,老闆希望做出來的遊戲可以更多的兼顧到更多的電腦使用者,遊戲每秒鐘的運行的幀可以更多,子彈和爆炸物可以更多、更華麗。那麼,你會發現使用 C 會使你的程序變得笨拙,無法滿足你的需求,除非你非得要你的遊戲運行於奔騰四的機器上 ( 如果不是,而你又堅持用 C 的對象編程,那麼請減少主角的槍的威力吧 )。

      如果你是冥頑不寧的人,你說不相信 OOP 會有性能上的損失,那麼,我記得曾看到在 CSDN 上關於 VB 和 VC 執行效率的討論的文章,講述的就是使用了 MFC 以後,執行效率甚至低於 VB 開發出來的東西。請各位驗證一下:如果使用的是純粹的 C 語言語法的話,那麼一定會比在 VB 編出來的東西要快很多 ( GetTickCount 函數可以查閱 MSDN ,如果想更加精確一些,可以使用 QueryPerformanceCounter 函數 )。

5 面向對象編程 -OOP的未來

    在未來三年,程序員編寫代碼的方式會發生那些變化?

     現在有一個趨勢,編譯器廠商試圖把其特有的「對象模型」和圖形界面(GUI)細節推銷給用戶。比如微軟的COM和Inprise的類屬性「properties」。對於用戶來說,這既不必要,也不情願。我所希望看到的程序庫,應該是用標準C 打造,界面靈活,值得信賴的程序庫。通常,這些界面應該是平台無關的。C 的表達能力極強,即使不使用大量的宏,也應該足以達成這一要求。就算有些地方無法百分之百的遵守這一原則,也應該將對於平台和廠家的依賴性限制起來。這個目標的完成情況,可以反映軟體工具產業對於應用程序開發行業的關注程度。我懷疑目前對於那些獨立的、跨平台廠商來說,並不存在相應的市場。如果能夠建立這樣的市場,也許能夠促進廠商們為客戶做出「真正有用的」產品。

       在網路應用的增長中,一個很重要的部分是小型移動設備和特殊Internet設備的爆炸性增長。這些設備各有各的操作系統,或者只在某種特定的設備領域內有共同的操作系統。我們現在還可以一一列舉出這些設備——家庭接入設備、蜂窩電話、電子報紙、PDA、自動網路設備等等。但是這些設備領域的數量和深入程度將會很快變得難以估量。我們都知道這個市場大得驚人,PC的興起與之相比不過小菜一碟。因此在這些設備的應用程序市場上,競爭將會相當殘酷。獲勝的重要手段之一,就是儘快進入市場。開發人員需要優秀的工具,迅速高效地撰寫和調試他們的軟體。平台無關性也是制勝秘訣之一,它使得程序員能夠開發出支持多種設備平台的軟體。

6 面向對象編程 -不同OOP語言各有什麼優勢和劣勢?

    Stroustrup: C 的優點自始至終都是這麼幾條:靈活、高效,而且並非專有語言。現在ISO C 標準的出現,鞏固了最後一點。

    我認為C 的高效是它最基本的優點。這種高效來自於其特有的數據和計算模型,較之Java和C#,這種模型更加貼近機器。不過,哪些程序才真正地渴望這麼高的效率?這是個問題。我認為這類程序非常多。人們對於計算機的期望,永遠都超越硬體科技的發展速度。很顯然,Java和C#的設計者的想法不同,他們認為,在很多地方效率問題無關緊要。

    C 主要的缺點,歸罪於糟糕的教育(是那些始終認為C 是個純粹面向對象語言的人,和那些把C 當成C語言變體的人導致了這種情況),歸罪於不同平台上的不一致性,歸罪於不完整、不標準的編譯器實現,歸罪於平台無關的系統級程序庫的缺少。

    這些問題歸於一點,就是缺乏一個卓越的廠商,能夠滿足整個C 社區的需求,勇於投入大量的資金開發必要的程序庫。   

7參考書籍

      《C++程序設計語言》BjarneStroustrup著裘宗燕譯機械工業出版社2002年
  《設計模式》ErichGamma等著李英軍等譯機械工業出版社2000年
  《面向對象軟體開發原理》Anton著袁兆山等譯機械工業出版社2003年
  《面向對象編程導論》TimothyA.Budd著黃明軍等譯機械工業出版社2003年
  《面向對象分析與設計》GradyBooch著馮博琴等譯機械工業出版社2003年
  《面向對象軟體構造》(英文版.第二版)BertrandMeyer著機械工業出版社2003年

上一篇[賜姓]    下一篇 [MVC模式]

相關評論

同義詞:暫無同義詞