面向對象與面向過程的優缺點


面向過程 

  優點:性能比面向對象高,因為類調用時需要實例化,開銷比較大,比較消耗資源;比如單片機、嵌入式開發、Linux/Unix等一般采用面向過程開發,性能是最重要的因素。 

  缺點:沒有面向對象易維護、易復用、易擴展 

  面向對象 

  優點:易維護、易復用、易擴展,由於面向對象有封裝、繼承、多態性的特性,可以設計出低耦合的系統,使系統更加靈活、更加易於維護 

  缺點:性能比面向過程低 

  面向對象程序設計的一些顯著的特性包括: 

  .程序設計的重點在於數據而不是過程; 

  .程序被划分為所謂的對象; 

  .數據結構為表現對象的特性而設計; 

  .函數作為對某個對象數據的操作,與數據結構緊密的結合在一起; 

  .數據被隱藏起來,不能為外部函數訪問; 

  .對象之間可以通過函數溝通; 

  .新的數據和函數可以在需要的時候輕而易舉的添加進來; 

  .在程序設計過程中遵循由下至上(bottom-up)的設計方法。 

  面向對象程序設計在程序設計模式中是一個新的概念,對於不同的人可能意味着不同的內容。我們對面向對象程序設計的定義是"面向對象程序設計是一種方法,這種方法為數據和函數提供共同的獨立內存空間,這些數據和函數可以作為模板以便在需要時創建類似模塊的拷貝。這樣的程序設計方法稱為面向對象程序設計。" 

  從以上定義可以看到,一個對象被認為是計算機內存中的一個獨立區間,在這個區間中保存着數據和能夠訪問數據的一組操作。因為內存區間是相互獨立的,所以對象可以不經修改就應用於多個不同的程序中。 

  什么是面向對象程序設計? 

  面向對象程序設計(OOP)技術汲取了結構化程序設計中好的思想,並將這些思想與一些新的、強大的理念相結合,從而給你的程序設計工作提供了一種全新的方法。通常,在面向對象的程序設計風格中,你會將一個問題分解為一些相互關聯的子集,每個子集內部都包含了相關的數據和函數。同時,你會以某種方式將這些子集分為不同等級,而一個對象就是已定義的某個類型的變量。當你定義了一個對象,你就隱含的創建了一個新的數據類型。 

  對象 

  在一個面向對象的系統中,對象是運行期的基本實體。它可以用來表示一個人或者說一個銀行帳戶,一張數據表格,或者其它什么需要被程序處理的東西。它也可以用來表示用戶定義的數據,例如一個向量,時間或者列表。在面向對象程序設計中,問題的分析一般以對象及對象間的自然聯系為依據。如前所述,對象在內存中占有一定空間,並且具有一個與之關聯的地址,就像Pascal中的record和 C中的結構一樣。 

  當一個程序運行時,對象之間通過互發消息來相互作用。例如,程序中包含一個"customer"對象和一個 "account"對象,而customer對象可能會向account對象發送一個消息,查詢其銀行帳目。每個對象都包含數據以及操作這些數據的代碼。即使不了解彼此的數據和代碼的細節,對象之間依然可以相互作用,所要了解的只是對象能夠接受的消息的類型,以及對象返回的響應的類型,雖然不同的人會以不同的方法實現它們。 

  類 

  我們剛才提到,對象包含數據以及操作這些數據的代碼。一個對象所包含的所有數據和代碼可以通過類來構成一個用戶定義的數據類型。事實上,對象就是類類型(class type)的變量。一旦定義了一個類,我們就可以創建這個類的多個對象,每個對象與一組數據相關,而這組數據的類型在類中定義。因此,一個類就是具有相同類型的對象的抽象。例如,芒果、蘋果和桔子都是fruit類的對象。類是用戶定義的數據類型,但在一個程序設計語言中,它和內建的數據類型行為相同。比如創建一個類對象的語法和創建一個整數對象的語法一模一樣。 

  數據抽象和封裝 

  把數據和函數包裝在一個單獨的單元(稱為類)的行為稱為封裝。數據封裝是類的最典型特點。數據不能被外界訪問,只能被封裝在同一個類中的函數訪問。這些函數提供了對象數據和程序之間的接口。避免數據被程序直接訪問的概念被稱為"數據隱藏"。 

  抽象指僅表現核心的特性而不描述背景細節的行為。類使用了抽象的概念,並且被定義為一系列抽象的屬性如尺寸、重量和價格,以及操作這些屬性的函數。類封裝了將要被創建的對象的所有核心屬性。因為類使用了數據抽象的概念,所以它們被稱為抽象數據類型(ADT)。 

  封裝 

  封裝機制將數據和代碼捆綁到一起,避免了外界的干擾和不確定性。它同樣允許創建對象。簡單的說,一個對象就是一個封裝了數據和操作這些數據的代碼的邏輯實體。 

  在一個對象內部,某些代碼和(或)某些數據可以是私有的,不能被外界訪問。通過這種方式,對象對內部數據提供了不同級別的保護,以防止程序中無關的部分意外的改變或錯誤的使用了對象的私有部分。 

  繼承 

  繼承是可以讓某個類型的對象獲得另一個類型的對象的屬性的方法。它支持按級分類的概念。例如,知更鳥屬於飛鳥類,也屬於鳥類。這種分類的原則是,每一個子類都具有父類的公共特性。 

  在 OOP中,繼承的概念很好的支持了代碼的重用性(reusability),也就是說,我們可以向一個已經存在的類中添加新的特性,而不必改變這個類。這可以通過從這個已存在的類派生一個新類來實現。這個新的類將具有原來那個類的特性,以及新的特性。而繼承機制的魅力和強大就在於它允許程序員利用已經存在的類(接近需要,而不是完全符合需要的類),並且可以以某種方式修改這個類,而不會影響其它的東西。 

  注意,每個子類只定義那些這個類所特有的特性。而如果沒有按級分類,每類都必須顯式的定義它所有的特性。 

  多態 

  多態是OOP的另一個重要概念。多態的意思是事物具有不同形式的能力。舉個例子,對於不同的實例,某個操作可能會有不同的行為。這個行為依賴於所要操作數據的類型。比如說加法操作,如果操作的數據是數,它對兩個數求和。如果操作的數據是字符串,則它將連接兩個字符串。 

  多態機制使具有不同內部結構的對象可以共享相同的外部接口。這意味着,雖然針對不同對象的具體操作不同,但通過一個公共的類,它們(那些操作)可以通過相同的方式予以調用。多態在實現繼承的過程中被廣泛應用。 

  面向對象程序設計語言支持多態,術語稱之為"one interface multiple method(一個接口,多個實現)"。簡單來說,多態機制允許通過相同的接口引發一組相關但不相同的動作,通過這種方式,可以減少代碼的復雜度。在某個特定的情況下應該作出怎樣的動作,這由編譯器決定,而不需要程序員手工干預。 

  在多函數程序中,許多重要的數據被聲明為全局變量,這樣它們才可以被所有的函數訪問。每個函數又可以具有它自己的局部變量。全局變量很容易被某個函數不經意之間改變。而在一個大程序中,很難分辨每個函數都使用了哪些變量。如果我們需要修改某個外部數據的結構,我們就要修改所有訪問這個數據的函數。這很容易導致bug的產生。 

  在結構化程序設計中,另一個嚴重的缺陷是不能很好的模擬真實世界的問題。這是因為函數都是面向過程的,而不是真正的對應於問題中的各個元素。 

  面向過程的程序設計的一些特點如下 

  .強調做(算法); 

  .大程序被分隔為許多小程序,這些小程序稱為函數; 

  .大多數函數共享全局數據; 

  .數據開放的由一個函數流向另一個函數。函數把數據從一種形式轉換為另一種形式。 

  采用由上至下的程序設計方法。 

  動態綁定 

  綁定指的是將一個過程調用與相應代碼鏈接起來的行為。動態綁定的意思是,與給定的過程調用相關聯的代碼只有在運行期才可知。它與多態和繼承的聯系極為緊密。一個多態引用的函數調用決定於這個引用的動態類型。 

  消息傳遞 

  一個面向對象的程序由許多對象組成,這些對象之間需要相互溝通。因此,在面向對象程序設計語言中,程序設計的主要步驟如下: 

  1、創建類,這些類定義了對象及其行為; 

  2、由類定義創建對象; 

  3、建立對象之間的通訊。 

  對象之間通過收發信息相互溝通,這一點類似於人與人之間的信息傳遞。信息傳遞的概念使得真實世界的直接模擬更易於和建立系統交流。 

  對於某個特定對象來說,消息就是請求執行某個過程,因此,消息的接收對象會調用一個函數(過程),以產生預期的結果。傳遞的消息的內容包括接收消息的對象的名字,需要調用的函數的名字,以及必要的信息。 

  對象就有一個生命周期。它們可以被創建和銷毀。只要對象正處於其生存期,就可以與其進行通訊。 

  OOP的優點 

  OOP具有許多優點,無論是對於程序設計者或者用戶來說都是如此。面向對象為軟件產品擴展和質量保證中的許多問題提供了解決辦法。這項技術能夠大大提高程序員的生產力,並可提高軟件的質量以及降低其維護費用。其主要的優點陳列於下: 

  1、通過繼承,我們可以大幅減少多余的代碼,並擴展現有代碼的用途; 

  2、我們可以在標准的模塊上(這里所謂的"標准"指程序員之間彼此達成的協議)構建我們的程序,而不必一切從頭開始。這可以減少軟件開發時間並提高生產效率; 

  3、數據隱藏的概念幫助程序員們保護程序免受外部代碼的侵襲; 

  4、允許一個對象的多個實例同時存在,而且彼此之間不會相互干擾; 

  5、允許將問題空間中的對象直接映射到程序中; 

  6、基於對象的工程可以很容易的分割為獨立的部分; 

  7、以數據為中心的設計方法允許我們抓住可實現模型的更多細節; 

  8、面向對象的系統很容易從小到大逐步升級; 

  9、對象間通訊所使用的消息傳遞技術與外部系統接口部分的描述更簡單; 

  10、更便於控制軟件復雜度。 

  當需要將以上所說的所有特性有機的結合於一個面向對象系統中,它們之間的相對重要性就取決於工程的類型和程序員的喜好。為了獲得上述的某些優勢,必須考慮很多事情。例如,對象庫必須可以被重用。技術還在不停的發展,現有的產品也會很快的更新換代。如果重用沒有能夠實現,那么就需要進行嚴格的控制和管理。 

  易於使用的開發軟件往往難以編寫。面向對象程序設計工具有望解決這個問題。 

  面向對象程序設計語言 

  面向對象技術並不是某個特定語言的特權。如同結構化程序設計一樣,OOP概念可以在很多語言比如C和Pascal中實現。但是,當程序越來越大時,程序設計工作會變得拙劣而混亂。而一個支持OOP概念的程序設計語言則可以讓一切變得簡單。 

  一個語言必須支持幾個主要的OOP概念才能稱其是面向對象的。根據所支持的OOP特性,語言可以分為以下兩類: 

  1、基於對象的程序設計語言; 

  2、面向對象的程序設計語言。 

  基於對象的程序設計語言僅支持封裝和對象辨識。 

  一個面向對象的程序設計語言所要支持的重要特性如下: 

  .數據封裝 

  .數據隱藏和訪問機制 

  .對象的自動初始化和清除 

  .操作符重載 

  支持對象風格程序設計的語言稱為基於對象的程序設計語言。它們不支持繼承和動態綁定。 

  Ada就是一個典型的基於對象的程序設計語言。 

  面向對象的程序設計不僅僅包含基於對象程序設計的特性,還支持繼承和動態綁定。 

  OOP的應用 

  OOP最有前途的應用領域如下: 

  1、實時系統; 

  2、仿真和建模; 

  3、面相對象數據庫; 

  4、超文本、超媒體和擴展文本; 

  5、AI和專家系統; 

  6、神經網絡和並行程序設計; 

  7、決策支持和辦公自動化系統; 

  8、CIM/CAM/CAD系統。 

  Via 

  業務邏輯比較簡單的適合用面向過程,例如統計當前在線用戶數,一條SQL語句就可以搞定的沒有多大必要用面向對象,也沒有必要用什么設計模式,那樣就是簡單問題復雜化了。 

  業務邏輯比較復雜的適合用面向對象,這樣當需求有變化時,維護起來會比較方便。 

  面向對象的局部是面向過程的,比如某個類里面某個方法里面實際就是面向過程的,而面向過程會借用面向對象的一些優點來進行優化。 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM