前兩天去面試了一家單位,問了這個問題,但是並不是很明白,所以答得也是吞吞吐吐的。今天在網上看到了網友整理過的資料,我感覺非常的好,這給大家分享一下。
面向過程就是分析出解決問題所需要的步驟,然後用函數把這些步驟一步一步實現,使用的時候一個一個依次調用就可以了。物件導向是把構成問題事務分解成各個對象,建立對象的目的不是為了完成一個步驟,而是為了描敘某個事物在整個解決問題的步驟中的行為。
例如五子棋,面向過程的設計思路就是首先分析問題的步驟:
1、開始遊戲,
2、黑子先走,
3、繪製畫面,
4、判斷輸贏,
5、輪到白子,
6、繪製畫面,
7、判斷輸贏,
8、返回步驟2,
9、輸出最後結果。
把上面每個步驟用分別的函數來實現,問題就解決了。
而物件導向的設計則是從另外的思路來解決問題。整個五子棋可以分為:
1、黑白雙方,這兩方的行為是一模一樣的,
2、棋盤系統,負責繪製畫面,
3、規則系統,負責判定諸如犯規、輸贏等。
第一類對象(玩家對象)負責接受使用者輸入,並告知第二類對象(棋盤對象)棋子布局的變化,棋盤對象接收到了棋子的變化就要負責在螢幕上面顯示出這種變化,同時利用第三類對象(規則系統)來對棋局進行判定。
可以明顯地看出,物件導向是以功能來劃分問題,而不是步驟。同樣是繪製棋局,這樣的行為在面向過程的設計中分散在了總多步驟中,很可能出現不同的繪製版本,因為通常設計人員會考慮到實際情況進行各種各樣的簡化。而物件導向的設計中,繪圖只可能在棋盤對象中出現,從而保證了繪圖的統一。
功能上的統一保證了物件導向設計的可擴充性。比如我要加入悔棋的功能,如果要改動面向過程的設計,那麼從輸入到判斷到顯示這一連串的步驟都要改動,甚至步驟之間的循序都要進行大規模調整。如果是物件導向的話,只用改動棋盤對象就行了,棋盤系統儲存了黑白雙方的棋譜,簡單回溯就可以了,而顯示和規則判斷則不用顧及,同時整個對對象功能的調用順序都沒有變化,改動只是局部的。
轉載自:http://xr1128.javaeye.com/blog/366998