1. 程式人生 > >面向物件與面向過程的理解

面向物件與面向過程的理解

       由於之前學過面向過程的c語言,因此在學習java的時候,免不了在心裡將兩者對比一番,比如,經常想到一個包裡面的其他的class就像c裡的子函式一般,被主函式呼叫。但是java畢竟是面向物件的一門程式語言,而之前也一直不明白麵向物件與面向過程的區別。雖然老師舉過一個例子:將大象放到冰箱。用面向過程的方法就是:開啟冰箱,放入大象,關閉冰箱。用面向物件的方法是:找一個物件,可以實現以上將大象放入冰箱的功能。

    當然,老師講完這個例子,我還是沒有很明白,覺得只不過是將三個函式功能整合為一個函數了而已,到時候直接呼叫這個函式就ok,在c裡也可以這麼幹啊,那java有什麼優勢呢?直到看了head first java這本書,它裡面舉得例子是在太形象,立刻明白了。

    書中,以程式設計實現三個幾何圖形的旋轉與播放音樂功能為背景,兩個程式設計人員C與J分別使用c和java進行開發工作。一開始,C用c語言編了兩個函式rotate和play, 而J用java編了三個物件class,物件內的內容也是rotate與play。現在開來,貌似用c還更省事一點,直接函式呼叫就ok;但且慢,既然是開發,當然客戶會有臨時更改有求的可能,現在客戶說第三個圖形播放的音樂型別是與其他圖形不同的,那C就用c語言這麼幹,在play裡面加上個判斷語句好了,最後再測試一下寫的程式;而J只需要在第三個圖形這個class裡修改就好了,並且前兩個物件沒有修改不需要再次測試。如果這還不夠,客戶又提要求了,再加個不規則圖形吧,而且旋轉中心也變變,前三個都用中心點作為旋轉點,第四個用左上角的點作為旋轉點吧,那C只好又一次在rotate里加上判斷語句,再次對程式進行測試,而J只新寫一個class,裡面的rotate是以左上角的點作為旋轉點的。

    到這裡,面向物件與面向過程的區別就出來了。如果客戶不斷的提要求,就要不斷修改並測試,這時,使用java明顯的可以更易修改與測試,因此,java才會受到開發人員的歡迎。本質上,面向物件與面向過程並沒有優劣之分,只是程式設計的思想不同,角度不同而已,在具體的函式功能的實現上都是一樣的。面向過程如c語言,是將許多物件的所有功能都寫成單獨的函式,在使用時呼叫;面向物件是把某一物件的所有功能寫在這一物件class下,如果另一物件有相同的功能,則此功能會在另一物件class裡再寫一遍,習慣了c語言的人會覺得囉嗦費事。

    因此,抽象的理解下來,這兩種思維方式無非是:有A、B兩個集合對應,現在是固定A集合,將B集合裡的每條內容對應到A集合裡的相應位置,還是固定B集合,將A集合裡的每條內容對應到B集合裡的相應位置。那我們把這個抽象的思想在java和c的對比中具體化:A集合是功能 B集合是物件。我們知道A集合與B集合是對應的,並且A集合的不同功能可能對應B集合的同一個物件,如冰箱這一個物件會有開門與關門不同的功能;另一方面,A集合的同一功能可能對應B集合的不同物件,即不同物件都會有這種功能,如冰箱與汽車都會用到開門這一功能。現在面向過程如c語言就是將A集合功能固定,先編寫所用到的所有功能,在主函式中呼叫就是了;而面向物件則是將B集合物件固定,寫出所出現的所有物件,將功能放入物件。

    由上可看出,面向過程如c語言,寫起來很方便簡潔,直接呼叫函式,但是需要修改的時候花費時間較長,在客戶不斷提要求修改情況下,很可能導致程式語言結構臃腫,如上例中不斷在rotate和play中加判斷語句,測試起來也會花費大量時間,因此它只適合書寫小程式。而面向物件如java,在每個物件下都要寫這個物件的功能,在功能重複的時候,會顯得囉嗦,不如直接函式呼叫來的簡潔,但在開發中,應對隨時可能出現的變化,有極強的適應能力,因此,這種面向物件的語言,只有在大型程式的編寫與需求經常變化的環境下才能凸顯出其優勢。故第一段中那個大象放到冰箱的例子並不能讓人理解這兩種方式的不同也就不奇怪了(沒有變化,程式功能簡單,體現不出面向物件)。