面向对象编程思想---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的方方面面。
?
面向對象的本質和面向對象的程序語言:
? ? 面向對象的本質是什么?答案是抽象。從面對的問題域抽象出解決問題所需的對象是面向對象方法的核心思想。能否恰當抽象出足夠的對象類型,特別是抽象出潛在的對象是決定軟件設計好壞的關鍵。如果從更寬泛的角度講,對我們所面對的復雜問題進行抽象,抓住本質,得出高度精煉的邏輯模型,對問題的求解具有重要的意義。從這個角度來說,抽象并不僅僅局限于對象的抽象,也包括流程和更高層的系統結構。
? ? 而封裝、繼承、多態是面向對象的特征,這是采用面向對象的方法所能夠達到的效果。注意區分特點和本質。
面向對象的方法論:
?來自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的方方面面。
?
面向對象的本質和面向對象的程序語言:
? ? 面向對象的本質是什么?答案是抽象。從面對的問題域抽象出解決問題所需的對象是面向對象方法的核心思想。能否恰當抽象出足夠的對象類型,特別是抽象出潛在的對象是決定軟件設計好壞的關鍵。如果從更寬泛的角度講,對我們所面對的復雜問題進行抽象,抓住本質,得出高度精煉的邏輯模型,對問題的求解具有重要的意義。從這個角度來說,抽象并不僅僅局限于對象的抽象,也包括流程和更高層的系統結構。
? ? 而封裝、繼承、多態是面向對象的特征,這是采用面向對象的方法所能夠達到的效果。注意區分特點和本質。
? ? 而面向對象的程序語言應該為實現面向對象的本質和特征提供支持。我們說一種語言是面向對象的,實際上是對它對面向對象的軟件是想提供了支持。因此C++的虛函數、多重繼承和面向對象之間并沒有什么必然的聯系,不過是此種語言用以支持多態和繼承的手段選擇罷了。
轉自:http://blog.csdn.net/longhuihu/article/details/5584423
總結
以上是生活随笔為你收集整理的面向对象编程思想---OOP的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于Session的使用和优化
- 下一篇: 【成长点滴】对SMART原则的一些粗浅理