在談論面向對象和面向過程區別之前,我們需要了解一下什么是面向對象和面向過程是什么?總的來說,面向對象和面向過程都只是一種編程思想,對問題不同角度得去分析和解決。
1、思想上的區別
面向過程:簡單的來說,面向過程就是將事物分為不同的步驟,根據這些步驟去完成編程。我們可以以五子棋來理解面向過程思想。在面向對象的思路中就是先分析五子棋需要的步驟:
(1) 繪制棋盤
(2) 開始游戲
(3) 黑子下
(4) 繪制黑色棋子
(5) 判斷輸贏
(6) 白子下
(7) 繪制白色棋子
(8) 判斷輸贏
(9) 返回步驟(3)
然后,在開發過程中,將以上步驟一步一步地實現
面向對象:而面向對象的設計思路則是將問題分為不同的部分對象,并給對象賦予屬性和行為。同樣拿五子棋為例,在實現時,需要去分析需要那些對象。
(1) 棋子對象(負責黑白雙方落子等行為,僅需要給他們一個顏色屬性進行區分即可)
(2) 棋盤對象(負責繪制棋盤,包括棋子的位置繪制)
(3) 規則對象(負責對五子棋進行輸贏判斷,先后手順序判斷等)
從這個例子中,我們可以發現,面向過程在實現中比較抽象,考慮的方面比較多。而面向對象,用對象直接出發,更加趨向于我們人類的思想。
2、維護上的區別
不但在實現上,包括后續的功能維護上,也有很多不同。依舊以上述的五子棋為例。我們如果要在五子棋的游戲中添加一個新的操作,例如悔棋。那么他們雙方需要如何去實現呢。
面向過程:如果是面向過程的話,我們不但需要在每個人操作時判斷是否有悔棋操作,還可能對前期一系列的步驟進行修改,數據的存儲。對棋子的落子位置進行存放等等問題,改動可以說是十分巨大的。
面向對象:而面向對象就不需要有那么大的改動,因為在面向過程的思路中,整個五子棋游戲主要分為:棋子、棋盤、規則三部分組成。進一步分析如果我們加了悔棋,變化在哪里?規則是不會變得、棋子也不會變。唯一會變得就是棋子在棋盤上的布局。我們只需要在棋盤系統中增加一個棋譜回退的功能即可。局部的變化就可實現。
3、從性能上的區別
這個就是比較明顯得事情,首先,面向對象在實現中需要類得組成,而類得調用需要實例化,這樣開銷就比較大,會消耗很多得資源,相對于面向過程在性能上就會低一些。所以在主要考慮性能時,一般會采用面向過程而不是面向對象。
簡單的總結一下:
面向過程:性能方面比較高,但在維護、復用、擴展上比較差
面向對象:由于面向對象有三大特性:封裝、繼承、多態。也就帶來了三個特點:易維護、易復用、易擴展。但這也同時消耗了性能,所以性能方面比較低。
最后提個小問題:面向過程的性能一定比面向對象高嗎?