1. 程式人生 > >面向物件程式設計思想---OOP

面向物件程式設計思想---OOP

在瞭解一些OOP知識後,覺得很有必要看看到底什麼是面向物件程式設計,這篇文章寫的很好,認真看下去收穫很大,所以就轉載了,感謝原創!


面向物件的方法論:
 來自c++primer第十章
面向物件是一種程式設計的概念性方法,面向物件最重要的特徵是抽象、封裝和資料隱藏、多型、繼承、程式碼的可重用性。下面用一個例子來展示面向過程和麵向物件程式設計的差別要編寫一個程式用於記錄壘球隊的統計資料,涉及的資料包括隊員姓名、擊球次數、擊中次數、命中率等。


      如果採用面向過程的程式設計方法,那我們需要先輸入這些球隊的相關資料,因此我們可能需要一個函式專門來處理輸入,輸入或許從檔案或許從控制檯。在獲取資料後,我們需要進行一些計算,比如命中率,這或許需要另一個用於計算的函式。計算完成後就是輸出結果了,必然需要一個函式來格式化並輸出結果。當一場新的比賽結束後,就要更新結果,我們不想重新來過,因此設計了一個函式用來更新已有的資料和輸出結果。好了,現在考慮一下怎麼表示這些資料呢?將每個隊員的資訊資料組織成一個結構體,然後用一個結構陣列。簡而言之,在採用面向過程的程式設計方法時,首先要考慮遵循的步驟,然後考慮如何表示這些資料。


     如果採用面向物件的程式設計方法又如何?我們首先考慮資料:不僅考慮資料如何表示,還要考慮資料如何使用。我們要跟蹤的是什麼,當然是隊員。因此需要有一個物件表示隊員的方法面面。這將是基本資料單元——一個表示選手的基本資訊和統計資料的物件。我們需要一些處理物件的方法:首先需要將資訊資料加到該物件的方法,其次還需要一些計算資料(比如命中率)的方法,計算方法應當自動完成而無需使用者的干涉,另外還得有資料更新新的方法。因此使用者與資料互動有三種:初始化、更新和報告結果——這就是介面。簡而言之,採用OOP的方法時,首先從使用者的角度考慮——描述物件所需的資料以及描述使用者與資料互動所需的操作。完成對介面的描述後,需要確定如何實現介面和資料儲存。最後使用確定的方法實現程式。


    我的評註: 在面向過程的方法中,我們頭腦中首先出現的是類似流程圖的的東西,而採用OOP我們頭腦中首先出現的是類似物件關係圖的東西。



來自百度百科
      用傳統的結構化方法開發大型軟體系統涉及各種不同領域的知識,在開發需求模糊或需求動態變化的系統時,所開發出的軟體系統往往不能真正滿足使用者的需要。用結構化方法開發的軟體,其穩定性、可修改性和可重用性都比較差,這是因為結構化方法的本質是功能分解,從代表目標系統整體功能的單個處理著手,自頂向下不斷把複雜的處理分解為子處理,這樣一層一層的分解下去,直到僅剩下若干個容易實現的子處理功能為止,然後用相應的工具來描述各個最低層的處理。因此,結構化方法是圍繞實現處理功能的“過程”來構造系統的。然而,使用者需求的變化大部分是針對功能的,因此,這種變化對於基於過程的設計來說是災難性的。用這種方法設計出來的系統結構常常是不穩定的 ,使用者需求的變化往往造成系統結構的較大變化,從而需要花費很大代價才能實現這種變化。


 


     我的評註:這種以軟體功能作為出發點的設計方法難以應付一個重要事實,就是客戶的需求可能發生調整,軟體執行的環境也有可能發生變化。由於功能是層層劃分的,這種變化往往使我們陷入牽一髮而動全身的窘境。


 


面向物件是一種思想,是軟體領域的世界觀、方法論
     面向物件的思想已經涉及到軟體開發的各個方面。如,面向物件的分析(OOA,Object Oriented Analysis),面向物件的設計(OOD,Object Oriented Design)、以及我們經常說的面向物件的程式設計實現(OOP,Object Oriented Programming)。許多有關面向物件的文章都只是講述在面向物件的開發中所需要注意的問題或所採用的比較好的設計方法。看這些文章只有真正懂得什麼是物件,什麼是面向物件,才能最大程度地對自己有所裨益。這一點,恐怕對初學者甚至是從事相關工作多年的人員也會對它們的概念模糊不清。


 


        很多人沒有區分“面向物件”和“基於物件”兩個不同的概念。面向物件的三大特點(封裝,繼承,多型)缺一不可。通常“基於物件”是使用物件,但是無法利用現有的物件模板產生新的物件型別,繼而產生新的物件,也就是說“基於物件”沒有繼承的特點。而“多型”表示為父類型別的子類物件例項,沒有了繼承的概念也就無從談論“多型”。現在的很多流行技術都是基於物件的,它們使用一些封裝好的物件,呼叫物件的方法,設定物件的屬性。但是它們無法讓程式設計師派生新物件型別。他們只能使用現有物件的方法和屬性。所以當你判斷一個新的技術是否是面向物件的時候,通常可以使用後兩個特性來加以判斷。“面向物件”和“基於物件”都實現了“封裝”的概念,但是面向物件實現了“繼承和多型”,而“基於物件”沒有實現這些,的確很饒口。 


  從事面向物件程式設計的人按照分工來說,可以分為“類庫的建立者”和“類庫的使用者”。使用類庫的人並不都是具備了面向物件思想的人,通常知道如何繼承和派生新物件就可以使用類庫了,然而我們的思維並沒有真正的轉過來,使用類庫只是在形式上是面向物件,而實質上只是庫函式的一種擴充套件。 


  面向物件是一種思想,是我們考慮事情的方法,通常表現為我們是將問題的解決按照過程方式來解決呢,還是將問題抽象為一個物件來解決它。很多情況下,我們會不知不覺的按照過程方式來解決它,而不是考慮將要解決問題抽象為物件去解決它。有些人打著面向物件的幌子,幹著過程程式設計的勾當。


 


        我的評註:必須在一開始就運用面向物件的方法來分析問題,而不是依據所需功能到物件庫裡面尋找所需的物件進行派生擴充套件。再用過程性的方法來使用這些類。


 


什麼阻礙了我們理解面向物件的思想:
    CPU作為計算機的大腦,不斷迴圈地讀取下一條指令並執行,這個過程是如此的嚴格以至給了計算機系的學生們強烈的暗示,我們必須確保我們的程式碼每個步驟都準確無誤。因此在初學程式設計的階段,我們總是將主要的精力放在檢查程式碼的邏輯過程上,邏輯判斷是否正確,條件分支是否足夠,演算法的步驟是否清晰無誤。沒有辦法,誰叫計算機本身就是個類似面向過程的東西呢?我們只得將我們的程式碼排列好等待CPU的檢閱。


     我們必須要理解計算機的工作方式,在編寫程式的初級階段採用面向過程的方式也無可厚非。但這往往導致我們後來要耗費更多的腦細胞來擺脫“過程”對我們的束縛,以達到對OOP的真正理解。現實世界本來就是有各種物件組成的,為了編寫程式,我們偏偏要把它理解成一個個過程,然後為了更好地編寫程式,又要回歸現實——採用OOP。


     我認為計算機是一個面向過程的裝置,從這個角度較,我們的程式也應該是面向過程的。但程式是由人編寫的,人眼中世界是面向物件的。這是一對矛盾體,解決這個矛盾的關鍵先進的程式設計方法——OOP以及對OOP有良好支援的編譯器。OOP希望我們以更人性化、更接近現實的方式來編寫程式,這樣產生的程式更能適應客觀世界的變化,而編譯器會替計算機產生它所期望的指令過程。為了達到這種完美的轉換,編譯器默默地做了許多時,產生了許多我們看不見的程式碼和資料,因此OOP會相對地讓程式損失一些效率。因此只有計算機效能達到一定程度我們才能享受OOP帶來的好處;而在這種條件下,這種效能的損失是完全值得的,因為OOP使程式更容易編寫、維護,如果僅僅為了並不重要的效能提升而將程式設計地難以編寫、難以維護又有什麼意義?


 


     一邊是面向過程的計算機,一邊是面向物件的現實世界,OOP必然要在這兩者之間尋求互動和平衡。抱著這種出發點,希望能夠理解OOP的方方面面。


 


面向物件的本質和麵向物件的程式語言:
    面向物件的本質是什麼?答案是抽象。從面對的問題域抽象出解決問題所需的物件是面向物件方法的核心思想。能否恰當抽象出足夠的物件型別,特別是抽象出潛在的物件是決定軟體設計好壞的關鍵。如果從更寬泛的角度講,對我們所面對的複雜問題進行抽象,抓住本質,得出高度精煉的邏輯模型,對問題的求解具有重要的意義。從這個角度來說,抽象並不僅僅侷限於物件的抽象,也包括流程和更高層的系統結構。


    而封裝、繼承、多型是面向物件的特徵,這是採用面向物件的方法所能夠達到的效果。注意區分特點和本質。


相關推薦

面向物件程式設計思想---OOP

在瞭解一些OOP知識後,覺得很有必要看看到底什麼是面向物件程式設計,這篇文章寫的很好,認真看下去收穫很大,所以就轉載了,感謝原創! 面向物件的方法論:  來自c++primer第十章 面向物件是一種程式設計的概念性方法,面向物件最重要的特徵是抽象、封裝和資料隱藏、多型、繼承、程式碼的可重用性。下面用一個例子來

面向物件程式設計OOP思想小結

Concepts 類(class):對我們要解決問題的抽象,比如建造房子的藍圖;但實現機制上來講,類是根據藍圖構建而成的,儲存在記憶體中的,用來表示物件的資料。 物件(object):根據類構建的實體,比如根據藍圖造出來的房子;實現時,通常是複製類的資料到新的記憶體空間,有可能需要改變初始值。

3.Java面向物件程式設計OOA/OOP/OOD/OOAD()/UML類圖、函數語言程式設計Scala(JVM)---類與物件、封裝繼承多型、構造方法、覆寫/重寫/override

一、緒論 1.面向物件程式設計正規化(C++、Java、Go)------能進行現實生活的抽象。             每個物件都是一個類。類中包含屬性與方法。 OOA:面向物件分析 OOP:面向物件程式設計

初探面向物件程式設計oop與設計模式

1. 程式設計方式 我們目前的程式設計方式大體可以有以下三種程式設計方式: 順序程式設計 程序式程式設計 面向物件程式設計 在講面向物件程式設計時先講一下什麼是順序程式設計,什麼是程序式程式設計,什麼是面向物件程式設計: 順序程式設計:

CoreJava學習第五課 --- 進入第二階段:面向物件程式設計思想

面向物件程式設計思想 1.面向過程 ​ 從計算機執行角度出發 ,程式碼執行過程核心為從程式的執行過程出發,構建程式設計思路,例: 哥德巴赫猜想 // 面向過程 1 使用者輸入一個數n 2 驗證數字的正確性 2.1 正確就繼續向下

python快速學習系列(6):面向物件程式設計OOP

一、面向物件程式設計: 1.比設計模式更重要的是設計原則: 1)面向物件設計的目標: ·可擴充套件:新特性很容易新增到現有系統中,基本不影響系統原有功能 ·可修改:當修改某一部分程式碼時,不會影響到其他不相關的部分 ·可替代:用具有相同介面的程式碼去替換系統中某一部分程式碼時,系統不受影

Java面向物件程式設計思想(一)

宣告:學基礎,在校學生,本文所有內容來自純書本,然後通過自己的理解和參考編寫而來,如有說的不對的地方,歡迎評論指錯!(僅做學習交流) 類和物件的建立 類的建立:(public private protected)+ class + 類名 { <類

面向物件程式設計OOP

面向物件: 把一切看做物件(例項),用各種物件之間的關係來描述事務 物件: 定義: 現實生活中的物體或實體 特徵: 物件有很多屬性(名詞或形容詞) 年齡,姓名,性別... 物件有很多行為(

面向物件程式設計思想的魅力

        說說面向物件程式設計         在學習面向程式之前,我先學了C語言,也就是面向過程的程式設計。學完C後的第一個感覺只能編寫一些及其簡單的題目,什麼判斷大小,或者利用一些迴圈語句,用批量判斷大小。最起碼我那時還不懂C專家的程式設計思想,所以覺得自己什麼都

面向物件程式設計思想總結

什麼是面向物件程式設計?   就是把一類具有相同屬性和動作的實體抽象成為計算機裡面的類, 也就是物件的模板, 把屬性和方法封裝成一個類中. 處理業務的流程就是物件之間的資訊傳遞. 把程式中的所有東西當做物件來進行處理.  為什麼需要面向物件程式設計?      

js面向物件程式設計思想

<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title></title> </head> <body> </bo

C語言中的結構體與面向物件程式設計思想

沒有萬能的程式設計技術 沒有隻產生正確的結果的程式語言 不是每個專案的程式設計都是從零開始的 —-《Object-Oriented Programming With ANSI-C》 一、C語言結構體 1、結構體是什麼 (1

PHP的面向物件程式設計思想

這篇文章介紹了在PHP中的面向物件程式設計(OOP,Object Oriented Programming)。同時演示瞭如何通過使用一些OOP的概念和PHP的技巧來減少編碼和提高質量。PHP 是一個混合型語言,你可以使用OOP,也可以使用傳統的過程化程式設計。然而,隨著專

C#之淺析面向物件程式設計思想(二)

<pre name="code" class="csharp">//My concern is my chief concern.     俗話說:“龍生龍鳳生鳳,老鼠的兒子會打洞”,可見在生活中,這種面向物件的思想(既“繼承”)已經深入人心,這篇部落格,就

C#之淺析面向物件程式設計思想(一)

   縱觀MicroSoft公司的幾種主流語言,C是面向過程,VB既有面向過程也有面向物件的特性,而C#則是純粹的面向物件的程式語言。在UML的學習過程中,畫類圖、物件圖的時候面向物件的思想就已經用到了具體的學習中,而C#的學習過程中我們接著深入來學習這種思想,只不過這次是

1.面向物件程式設計思想(封裝繼承多型介面)

封裝: 1.定義:隱藏物件的屬性和實現細節,僅對外公開介面,控制在程式中屬性的讀和修改的訪問級別。 2.封裝的目的是:增強安全性和簡化程式設計,使用者不必瞭解具體的實現細節,而只是要通過外部介面,一特定的訪問許可權來使用類的成員。 3.封裝的基本要求是:把所有的屬性

JavaScript 面向物件程式設計思想物件的使用方法

程式設計思想:    面向過程:所有事情都是親力親為,注重的是過程    面向物件:提出需求,找物件,物件解決,注重的是結果    Js不是一門面向物件的語言,是基於物件的語言,Js來模擬面向物件    面向物件的特徵:封裝,繼承,多型    物件:具體特指的某個事物,有特徵

面向物件程式設計思想

一、什麼是面向物件 所謂的面向物件,是一種程式設計思想,程式設計思路,程式碼的書寫格式 二、物件的優點   1. 物件中,可以定義並且儲存多個數據單元以及所有JavaScript支援的資料型別 例:     2. 物件中,呼叫具體資料很方便,呼叫資料時,不用考慮資料的順序 例:    

【小家java】POP(面向過程程式設計)、OOP面向物件程式設計)、AOP(面向切面程式設計)三種程式設計思想的區別和聯絡

相關閱讀 【小家java】java5新特性(簡述十大新特性) 重要一躍 【小家java】java6新特性(簡述十大新特性) 雞肋升級 【小家java】java7新特性(簡述八大新特性) 不溫不火 【小家java】java8新特性(簡述十大新特性) 飽受讚譽 【小家java】java9

Javascript object.constructor屬性與面向物件程式設計(oop)

定義和用法 在 JavaScript 中, constructor 屬性返回物件的建構函式。 返回值是函式的引用,不是函式名: JavaScript 陣列 constructor 屬性返回 function Array() { [native code] } JavaScript 數字 co