面向對象 和 面向過程

面向對象的思想是在面向過程之後纔出現的,讓我們首先來看看什麼是面向過程吧!

面向過程

面向過程的程序設計思想的核心是功能的分解。
當程序員試圖用 C 或 Pascal 語言來設計程序以解決一個實際問題時,第一步要做的工作就是將問題分解成若干個稱爲模塊的功能塊,然後根據模塊功能來設計一系列用於存儲數據的數據結構, 最後編寫一些過程(或函數) 對這些數據進行操作。最終的程序就是由這些過程構成的。顯然, 這種方法將數據結構和過程作爲兩個實體來對待,其着重點在過程, 設計人員首先考慮如何將功能分解,在每一個過程中又要着重安排程序的操作序列, 但同時程序員在編程時又必須時時考慮數據結構,因爲畢竟要將操作作用於數據上。數據結構和過程的這種分離, 給軟件人員造成沉重的負擔。例如,我們不可能要求數據結構始終沒有變化, 且不說在軟件維護的時候數據結構有可能發生變化, 就是在軟件開發的過程中也不能保證數據結構不變化。面向過程的程序設計的缺點之一就是一旦數據結構需要變更的時候, 必須修改與之有關的所有模塊。因此,面向過程的程序的可重用性差, 維護代價高。

面向對象

面向對象程序設計是一種新的程序設計範型。面向對象程序的主要結構特點是: 第一,程序一般由類的定義和類的使用兩部分組成, 在主程序中定義各對象並規定它們之間傳遞消息的規律;第二, 程序中的一切操作都是通過向對象發送消息來實現的,對象接收到消息後,啓動有關方法完成相應的操作。
面向對象程序設計的最大優點就是軟件具有可重用性。當人們對軟件系統的要求有所改變時,並不需要程序員做大量的工作, 就能使系統做相應的變化。
類與對象是面向對象程序設計中最重要的概念,也是一個難點, 想要掌握面向對象程
序設計的技術,首先就要很好地理解這兩個概念。究竟什麼是對象 ? 什麼是類呢 ?
有一個例子來明白麪向過程和麪向對象:
面向過程
考慮一個銀行系統。該系統允許顧客開設不同類型的銀行賬戶,其中包括現金賬戶、支票賬戶和貸款賬戶,同時允許顧客存款取款和轉賬。根據面向過程的程序設計方法,首先我們將銀行系統分解成三個模塊分別負責存款、取款和轉賬三項工作。這三個過程是 MakeDeposit、WithDraw 和 Transfer。接着, 建立一個簡單的數據結構:

struct account
{
    char name;
    / * 姓名 */
    · unsigned long accountId;
    / * 賬號 */
    float balance;
    / * 餘額 */
    float interestYTD / * 年利息 */
    char accountType / * 賬戶類型 (現金、支票和貸款) * /
} ;

然後,對每個過程按照一定的操作順序編寫程序。
現在,我們來分析一下, 程序員所關心的是否與顧客一致。對於一個顧客來說, 他最關心的是賬戶中還有多少錢,利息是多少, 錢存在銀行是否安全, 而不會對存錢和取錢的程序執行的過程感興趣。對他而言, 只是需要知道存、取款手續, 並按照這些手續去做就足夠了。但程序設計人員所關注的是如何寫存、取款的代碼, 如何在已經建立的數據結構中填寫數據並管理它們。可見,程序員與顧客關心的事情是不一致的, 這是由於數據結構與“過程”的分離造成的。我們再進一步分析,顧客與他們的銀行賬戶有沒有特殊的關係。在軟件系統中,由於顧客只不過是一串字符和數字, 因而不用考慮到底是誰擁有該賬戶,賬戶裏的內容是什麼,而銀行賬號也只不過是一個整數。顯然, 這與實際的情況不符。
另外,我們還注意到, 由於數據結構與“過程”的分離, 程序員可以非常方便地修改賬目,因爲對他來說, 只不過是在修改數據結構中的數字, 實際上他可能通過修改數據而走顧客的錢 !
最後, 我們考慮如果數據結構發生了一些變化會產生什麼樣的結果。對於 accountType 數據項, 原來只有現金賬戶、支票賬戶和貸款賬戶三種取值, 程序只能識別這三種取值。由於賬戶類型的不同, 我們在編寫存款等過程時, 將以不同的操作序列與之對應( 在
同一個過程中分情況處理)。對現金賬戶、支票賬戶和貸款賬戶的處理不會完全相同。假設現在需要增加一種賬戶類型———退休賬戶, 後果如何 ? 原來的程序肯定出錯。因爲在原來的程序中我們只考慮了以上三種賬戶的情況,對於新增加的賬戶類型, 原來的程序不會處理。也就是說, 每增加一種新的賬戶類型, 都必須重新編寫程序代碼, 可見其維護軟件的開銷是相當大的。
上述這些問題的出現都是由於面向過程程序設計的解決方法的着重點在功能, 而我們通過分析發現,數據對於客戶( 尤其是顧客)似乎更重要。在這裏, 程序員關心的是如何做( how to do) , 而顧客則關心的是做什麼( what to do) ,這是由於過程和數據的分離造成
的。使用面向對象的程序設計技術是解決這些問題的最好方法。
面向對象
我們還是通過解決銀行賬戶問題來討論什麼是面向對象的程序設計。用面向對象的程序設計方法解決銀行賬戶問題, 我們的着重點應該放在銀行賬戶上。我們要了解賬戶上的顧客想做什麼,什麼對於他們是最重要的, 等等。簡而言之, 在面向對象的程序設計中,着重點在那些將要被操作的數據, 而不是在實現這些操作的過程。數據構成了軟件分解的基礎,而不是功能。我們首先要分析顧客在賬戶( 數據)中要做什麼, 然後提供相應的操作,更重要的是不能將數據和相應操作看成兩個分離的實體, 而是要把它們作爲一個完整的實體來對待。數據與定義在它上面的用戶需要的操作構成一個整體。同時, 數據本身不能被外部程序和過程直接存取。如果想修改銀行賬戶中的數據, 惟一的辦法是在該數據上提供修改操作, 這些修改操作是以用戶應得到的利益爲根據。當我們把對銀行賬戶的操作定義在數據上,銀行賬戶就是一個類, 稱爲銀行賬戶類。作爲其實例, 我們可以建立許多具體的銀行賬戶,而每一個具體的銀行賬戶就是銀行賬戶類的一個對象。

總結

  1. 面向對象關心的是實現的過程,側重於怎麼做,而不是做什麼,就像我們做個蛋炒飯,面向過程的程序會明確第一步起鍋燒油,接着放入雞蛋,最後再放米飯。關注的是整個程序的執行順序,並按照順序執行。
  2. 面向對象主要關注的對象是數據本身,我們編寫一個數據集合,並在數據集合上定義可以進行的操作,並且外部不能更改數據的屬性。當我們在要做蛋炒飯的時候,我們就直接找個廚師對象,叫他幫我們做就好了。

沒有哪一種語言是純面向對象的,因爲程序要執行麼就一定會有過程,就一定會有面向過程的思想。
但是面向對象易維護、易複用、易擴展,由於面向對象有封裝、繼承、多態性的特性,可以設計出低耦合的系統,使系統 更加靈活、更加易於維護。

事實上,我們人類就是以面相對象的方式認識世界的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章