面向過程
優勢:性能比面向對象高,由於類調用時須要實例化,開銷比較大,比較消耗資源;好比單片機、嵌入式開發、Linux/Unix等通常採用面向過程開發,性能是最重要的因素。
缺點:沒有面向對象易維護、易複用、易擴展
面向對象
優勢:易維護、易複用、易擴展,因爲面向對象有封裝、繼承、多態性的特性,能夠設計出低耦合的系統,使系統更加靈活、更加易於維護
缺點:性能比面向過程低
面向對象程序設計的一些顯著的特性包括:
.程序設計的重點在於數據而不是過程;
.程序被劃分爲所謂的對象;
.數據結構爲表現對象的特性而設計;
.函數做爲對某個對象數據的操做,與數據結構緊密的結合在一塊兒;
.數據被隱藏起來,不能爲外部函數訪問;
.對象之間能夠經過函數溝通;
.新的數據和函數能夠在須要的時候垂手可得的添加進來;
.在程序設計過程當中遵循由下至上(bottom-up)的設計方法。
面向對象程序設計在程序設計模式中是一個新的概念,對於不一樣的人可能意味着不一樣的內容。咱們對面向對象程序設計的定義是"面向對象程序設計是一種方法,這種方法爲數據和函數提供共同的獨立內存空間,這些數據和函數能夠做爲模板以便在須要時建立相似模塊的拷貝。這樣的程序設計方法稱爲面向對象程序設計。"
從以上定義能夠看到,一個對象被認爲是計算機內存中的一個獨立區間,在這個區間中保存着數據和可以訪問數據的一組操做。由於內存區間是相互獨立的,因此對象能夠不經修改就應用於多個不一樣的程序中。
什麼是面向對象程序設計?
面向對象程序設計(OOP)技術汲取告終構化程序設計中好的思想,並將這些思想與一些新的、強大的理念相結合,從而給你的程序設計工做提供了一種全新的方法。一般,在面向對象的程序設計風格中,你會將一個問題分解爲一些相互關聯的子集,每一個子集內部都包含了相關的數據和函數。同時,你會以某種方式將這些子集分爲不一樣等級,而一個對象就是已定義的某個類型的變量。當你定義了一個對象,你就隱含的建立了一個新的數據類型。
對象
在一個面向對象的系統中,對象是運行期的基本實體。它能夠用來表示一我的或者說一個銀行賬戶,一張數據表格,或者其它什麼須要被程序處理的東西。它也能夠用來表示用戶定義的數據,例如一個向量,時間或者列表。在面向對象程序設計中,問題的分析通常以對象及對象間的天然聯繫爲依據。如前所述,對象在內存中佔有必定空間,而且具備一個與之關聯的地址,就像Pascal中的record和 C中的結構同樣。
當一個程序運行時,對象之間經過互發消息來相互做用。例如,程序中包含一個"customer"對象和一個 "account"對象,而customer對象可能會向account對象發送一個消息,查詢其銀行賬目。每一個對象都包含數據以及操做這些數據的代碼。即便不瞭解彼此的數據和代碼的細節,對象之間依然能夠相互做用,所要了解的只是對象可以接受的消息的類型,以及對象返回的響應的類型,雖然不一樣的人會以不一樣的方法實現它們。
類
咱們剛纔提到,對象包含數據以及操做這些數據的代碼。一個對象所包含的全部數據和代碼能夠經過類來構成一個用戶定義的數據類型。事實上,對象就是類類型(class type)的變量。一旦定義了一個類,咱們就能夠建立這個類的多個對象,每一個對象與一組數據相關,而這組數據的類型在類中定義。所以,一個類就是具備相同類型的對象的抽象。例如,芒果、蘋果和桔子都是fruit類的對象。類是用戶定義的數據類型,但在一個程序設計語言中,它和內建的數據類型行爲相同。好比建立一個類對象的語法和建立一個整數對象的語法如出一轍。
數據抽象和封裝
把數據和函數包裝在一個單獨的單元(稱爲類)的行爲稱爲封裝。數據封裝是類的最典型特色。數據不能被外界訪問,只能被封裝在同一個類中的函數訪問。這些函數提供了對象數據和程序之間的接口。避免數據被程序直接訪問的概念被稱爲"數據隱藏"。
抽象指僅表現核心的特性而不描述背景細節的行爲。類使用了抽象的概念,而且被定義爲一系列抽象的屬性如尺寸、重量和價格,以及操做這些屬性的函數。類封裝了將要被建立的對象的全部核心屬性。由於類使用了數據抽象的概念,因此它們被稱爲抽象數據類型(ADT)。
封裝
封裝機制將數據和代碼捆綁到一塊兒,避免了外界的干擾和不肯定性。它一樣容許建立對象。簡單的說,一個對象就是一個封裝了數據和操做這些數據的代碼的邏輯實體。
在一個對象內部,某些代碼和(或)某些數據能夠是私有的,不能被外界訪問。經過這種方式,對象對內部數據提供了不一樣級別的保護,以防止程序中無關的部分意外的改變或錯誤的使用了對象的私有部分。
繼承
繼承是可讓某個類型的對象得到另外一個類型的對象的屬性的方法。它支持按級分類的概念。例如,知更鳥屬於飛鳥類,也屬於鳥類。這種分類的原則是,每個子類都具備父類的公共特性。
在 OOP中,繼承的概念很好的支持了代碼的重用性(reusability),也就是說,咱們能夠向一個已經存在的類中添加新的特性,而沒必要改變這個類。這能夠經過從這個已存在的類派生一個新類來實現。這個新的類將具備原來那個類的特性,以及新的特性。而繼承機制的魅力和強大就在於它容許程序員利用已經存在的類(接近須要,而不是徹底符合須要的類),而且能夠以某種方式修改這個類,而不會影響其它的東西。
注意,每一個子類只定義那些這個類所特有的特性。而若是沒有按級分類,每類都必須顯式的定義它全部的特性。
多態
多態是OOP的另外一個重要概念。多態的意思是事物具備不一樣形式的能力。舉個例子,對於不一樣的實例,某個操做可能會有不一樣的行爲。這個行爲依賴於所要操做數據的類型。好比說加法操做,若是操做的數據是數,它對兩個數求和。若是操做的數據是字符串,則它將鏈接兩個字符串。
多態機制使具備不一樣內部結構的對象能夠共享相同的外部接口。這意味着,雖然針對不一樣對象的具體操做不一樣,但經過一個公共的類,它們(那些操做)能夠經過相同的方式予以調用。多態在實現繼承的過程當中被普遍應用。
面向對象程序設計語言支持多態,術語稱之爲"one interface multiple method(一個接口,多個實現)"。簡單來講,多態機制容許經過相同的接口引起一組相關但不相同的動做,經過這種方式,能夠減小代碼的複雜度。在某個特定的狀況下應該做出怎樣的動做,這由編譯器決定,而不須要程序員手工干預。
在多函數程序中,許多重要的數據被聲明爲全局變量,這樣它們才能夠被全部的函數訪問。每一個函數又能夠具備它本身的局部變量。全局變量很容易被某個函數不經意之間改變。而在一個大程序中,很難分辨每一個函數都使用了哪些變量。若是咱們須要修改某個外部數據的結構,咱們就要修改全部訪問這個數據的函數。這很容易致使bug的產生。
在結構化程序設計中,另外一個嚴重的缺陷是不能很好的模擬真實世界的問題。這是由於函數都是面向過程的,而不是真正的對應於問題中的各個元素。
面向過程的程序設計的一些特色以下:
.強調作(算法);
.大程序被分隔爲許多小程序,這些小程序稱爲函數;
.大多數函數共享全局數據;
.數據開放的由一個函數流向另外一個函數。函數把數據從一種形式轉換爲另外一種形式。
採用由上至下的程序設計方法。
動態綁定
綁定指的是將一個過程調用與相應代碼連接起來的行爲。動態綁定的意思是,與給定的過程調用相關聯的代碼只有在運行期纔可知。它與多態和繼承的聯繫極爲緊密。一個多態引用的函數調用決定於這個引用的動態類型。
消息傳遞
一個面向對象的程序由許多對象組成,這些對象之間須要相互溝通。所以,在面向對象程序設計語言中,程序設計的主要步驟以下:
一、建立類,這些類定義了對象及其行爲;
二、由類定義建立對象;
三、創建對象之間的通信。
對象之間經過收發信息相互溝通,這一點相似於人與人之間的信息傳遞。信息傳遞的概念使得真實世界的直接模擬更易於和創建系統交流。
對於某個特定對象來講,消息就是請求執行某個過程,所以,消息的接收對象會調用一個函數(過程),以產生預期的結果。傳遞的消息的內容包括接收消息的對象的名字,須要調用的函數的名字,以及必要的信息。
對象就有一個生命週期。它們能夠被建立和銷燬。只要對象正處於其生存期,就能夠與其進行通信。
OOP的優勢
OOP具備許多優勢,不管是對於程序設計者或者用戶來講都是如此。面向對象爲軟件產品擴展和質量保證中的許多問題提供瞭解決辦法。這項技術可以大大提升程序員的生產力,並可提升軟件的質量以及下降其維護費用。其主要的優勢陳列於下:
一、經過繼承,咱們能夠大幅減小多餘的代碼,並擴展示有代碼的用途;
二、咱們能夠在標準的模塊上(這裏所謂的"標準"指程序員之間彼此達成的協議)構建咱們的程序,而沒必要一切從頭開始。這能夠減小軟件開發時間並提升生產效率;
三、數據隱藏的概念幫助程序員們保護程序免受外部代碼的侵襲;
四、容許一個對象的多個實例同時存在,並且彼此之間不會相互干擾;
五、容許將問題空間中的對象直接映射到程序中;
六、基於對象的工程能夠很容易的分割爲獨立的部分;
七、以數據爲中心的設計方法容許咱們抓住可實現模型的更多細節;
八、面向對象的系統很容易從小到大逐步升級;
九、對象間通信所使用的消息傳遞技術與外部系統接口部分的描述更簡單;
十、更便於控制軟件複雜度。
當須要將以上所說的全部特性有機的結合於一個面向對象系統中,它們之間的相對重要性就取決於工程的類型和程序員的喜愛。爲了得到上述的某些優點,必須考慮不少事情。例如,對象庫必須能夠被重用。技術還在不停的發展,現有的產品也會很快的更新換代。若是重用沒有可以實現,那麼就須要進行嚴格的控制和管理。
易於使用的開發軟件每每難以編寫。面向對象程序設計工具備望解決這個問題。
面向對象程序設計語言
面向對象技術並非某個特定語言的特權。如同結構化程序設計同樣,OOP概念能夠在不少語言好比C和Pascal中實現。可是,當程序愈來愈大時,程序設計工做會變得拙劣而混亂。而一個支持OOP概念的程序設計語言則可讓一切變得簡單。
一個語言必須支持幾個主要的OOP概念才能稱其是面向對象的。根據所支持的OOP特性,語言能夠分爲如下兩類:
一、基於對象的程序設計語言;
二、面向對象的程序設計語言。
基於對象的程序設計語言僅支持封裝和對象辨識。
一個面向對象的程序設計語言所要支持的重要特性以下:
.數據封裝
.數據隱藏和訪問機制
.對象的自動初始化和清除
.操做符重載
支持對象風格程序設計的語言稱爲基於對象的程序設計語言。它們不支持繼承和動態綁定。
Ada就是一個典型的基於對象的程序設計語言。
面向對象的程序設計不只僅包含基於對象程序設計的特性,還支持繼承和動態綁定。
OOP的應用
OOP最有前途的應用領域以下:
一、實時系統;
二、仿真和建模;
三、面相對象數據庫;
四、超文本、超媒體和擴展文本;
五、AI和專家系統;
六、神經網絡和並行程序設計;
七、決策支持和辦公自動化系統;
八、CIM/CAM/CAD系統。
Via
業務邏輯比較簡單的適合用面向過程,例如統計當前在線用戶數,一條SQL語句就能夠搞定的沒有多大必要用面向對象,也沒有必要用什麼設計模式,那樣就是簡單問題複雜化了。
業務邏輯比較複雜的適合用面向對象,這樣當需求有變化時,維護起來會比較方便。
面向對象的局部是面向過程的,好比某個類裏面某個方法裏面實際就是面向過程的,而面向過程會借用面向對象的一些優勢來進行優化。 程序員