面向過程、基於對象、面向對象

我們可理解“純粹”的面向對象程序設計方法是什麼樣的:  
   
  (1)   所有東西都是對象。可將對象想象成一種新型變量;它保存着數據,但可要求它對自身進行操作。理論上講,可從要解決的問題身上提出所有概念性的組件,然後在程序中將其表達爲一個對象。

  (2)   程序是一大堆對象的組合;通過消息傳遞,各對象知道自己該做些什麼。爲了向對象發出請求,需向那個對象“發送一條消息”。更具體地講,可將消息想象爲一個調用請求,它調用的是從屬於目標對象的一個子例程或函數。  

  (3)   每個對象都有自己的存儲空間,可容納其他對象。或者說,通過封裝現有對象,可製作出新型對象。所以,儘管對象的概念非常簡單,但在程序中卻可達到任意高的複雜程度。  

  (4)   每個對象都有一種類型。根據語法,每個對象都是某個“類”的一個“實例”。其中,“類”(Class)是“類型”(Type)的同義詞。一個類最重要的特徵就是“能將什麼消息發給它?”。

  (5)   同一類所有對象都能接收相同的消息。這實際是別有含義的一種說法,大家不久便能理解。由於類型爲“圓”(Circle)的一個對象也屬於類型爲“形狀”(Shape)的一個對象,所以一個圓完全能接收形狀消息。這意味着可讓程序代碼統一指揮“形狀”,令其自動控制所有符合“形狀”描述的對象,其中自然包括“圓”。這一特性稱爲對象的“可替換性”,是OOP最重要的概念之一。   

  一些語言設計者認爲面向對象的程序設計本身並不足以方便解決所有形式的程序問題,提倡將不同的方法組合成“多形程序設計語言”

面向對象其實是現實世界模型的自然延伸。

現實世界中任何實體都可以看作是對象。

對象之間通過消息相互作用。

如果說傳統的過程式編程語言是以過程爲中心以算法爲驅動的話,面向對象的編程語言則是以對象爲中心以消息爲驅動。

用公式表示:

過程式編程語言爲:程序=算法+數據;

面向對象編程語言爲:程序=對象+消息。

關於基於對象的一些說法:

區別的方面:

面向對象,將軟件程序的元素構造成對象,指定對象類型,表示對象屬性,和描述對象方法,定義對象後即可用於創建這種
類型的對象的具體實例並構造其他更復雜的對象類型。
 
基於對象的編程語言,並不支持所有面向對象的功能,往往基於對象只提供一部分面向對象的功能,有時加入自己的新功能。
 
例:java是面向對象的程序設計語言,JAVASCRIPT是基於對象的程序設計語言(腳本語言),javascript並不支持所有
java面向對象的功能,致使支持其中一部分!
 
例:VB6.0是基於對象的,只支持封裝,不具有繼承性、多態性。
 
有關聯的方面:
 
按照傳統的思想,面向對象和基於對象之間的界限可以說是既清楚又模糊。說它清楚,是因爲面嚮對象語言必須從語法上直
接支持繼承和動態綁定,也就是虛函數機制。說它模糊,是因爲基於對象的語言可以在沒有語法直接支持的情況下,達成與
面嚮對象語言相同的效果。
 
舉個例子,在很多用C語言寫成的操作系統裏,“File”這個概念,既可以代表磁盤文件,也可以代表串行口,還可以代表各種各樣的設備,這不是多態性是什麼?有一個概念大家必須改變,就大部分當前項目而言,C語言已經是一種基於對象甚至面向對象的語言,
而不是單純的“面向過程”語言,例如在Win32 API編程中,實際上我們就是在按照面向對象的模式撰寫程序。另外,最經典的基於對象語言是Ada83。按照我現在的體會,面向對象這個概念,更多的是說一種環境和一種設計思維方式。要談這個問題,實在需要不少篇幅,
這裏就不多說了。
 
Object-oriented支持Polymorphism,而Object-based不支持Polymorphism.主要的區別就在於此。
 
支持多態的代價是額外的間接性--不論是在“內存的獲得”或是在“類型的決斷”上。C++通過class的pointers和references來支持多態,這種程序設計風格就叫面向對象。C++也支持具體的ADT程序風格,被稱爲基於對象,它只支持封裝,不支持類型的擴充。一個Object-based設計可能比一個對等的Object-oriented設計速度更快而且空間更緊湊。
速度快是因爲所有的函數引發操作都在編譯時期解析完成,不需要設置virtual機制;
空間緊湊則是因爲每一個class object不需要負擔傳統上爲了支持virtual機制而需要的額外負擔。
不過,Object-based設計比較沒有彈性。這是引用《深度探索C++對象模型》上第一章最後幾段的話。上面有更詳細的討論!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章