|
學(xué)習(xí)編程, 基本功是掌握編程語言,但編程的本質(zhì)是邏輯,所以編程思維的培養(yǎng)也很重要。面向過程和面向?qū)ο笫莾煞N重要的編程思想,下面講述一下這兩者的區(qū)別和優(yōu)缺點(diǎn)比較。 1. 面向過程面向過程是一種以事件為中心的編程思想,編程的時(shí)候把解決問題的步驟分析出來,然后用函數(shù)把這些步驟實(shí)現(xiàn),在一步一步的具體步驟中再按順序調(diào)用函數(shù)。 舉個(gè)例子,下五子棋,面向過程的設(shè)計(jì)思路是首先分析解決這個(gè)問題的步驟: (1)開始游戲(2)黑子先走(3)繪制畫面(4)判斷輸贏(5)輪到白子(6)繪制畫面(7)判斷輸贏(8)返回步驟(2) (9)輸出最后結(jié)果。 用函數(shù)實(shí)現(xiàn)上面一個(gè)一個(gè)的步驟,然后在下五子棋的主函數(shù)里依次調(diào)用上面的函數(shù)(不同的編程語言有不同的調(diào)用方法,我這里寫的是直接調(diào)用): 可見,面向過程始終關(guān)注的是怎么一步一步地判斷棋局輸贏的,通過控制代碼,從而實(shí)現(xiàn)函數(shù)的順序執(zhí)行。 2. 面向?qū)ο?/font>在日常生活或編程中,簡單的問題可以用面向過程的思路來解決,直接有效,但是當(dāng)問題的規(guī)模變得更大時(shí),用面向過程的思想是遠(yuǎn)遠(yuǎn)不夠的。所以慢慢就出現(xiàn)了面向?qū)ο蟮木幊趟枷?。世界上有很多人和事物,每一個(gè)都可以看做一個(gè)對象,而每個(gè)對象都有自己的屬性和行為,對象與對象之間通過方法來交互。面向?qū)ο笫且环N以“對象”為中心的編程思想,把要解決的問題分解成各個(gè)對象,建立對象的目的不是為了完成一個(gè)步驟,而是為了描敘某個(gè)對象在整個(gè)解決問題的步驟中的屬性和行為。
在下五子棋的例子中,用面向?qū)ο蟮姆椒▉斫鉀Q的話,首先將整個(gè)五子棋游戲分為三個(gè)對象: (1)黑白雙方,這兩方的行為是一樣的。 (2)棋盤系統(tǒng),負(fù)責(zé)繪制畫面 (3)規(guī)則系統(tǒng),負(fù)責(zé)判定犯規(guī)、輸贏等。 然后賦予每個(gè)對象一些屬性和行為: (4)第一類對象(黑白雙方)負(fù)責(zé)接受用戶輸入,并告知第二類對象(棋盤系統(tǒng))棋子布局的變化,棋盤系統(tǒng)接收到了棋子的變化,并負(fù)責(zé)在屏幕上面顯示出這種變化,同時(shí)利用第三類對象(規(guī)則系統(tǒng))來對棋局進(jìn)行判定。 可以看出,面向?qū)ο笫且怨δ軄韯澐謫栴},而不是以步驟解決。比如繪制畫面這個(gè)行為,在面向過程中是分散在了多個(gè)步驟中的,可能會(huì)出現(xiàn)不同的繪制版本,所以要考慮到實(shí)際情況進(jìn)行各種各樣的簡化。而面向?qū)ο蟮脑O(shè)計(jì)中,繪圖只可能在棋盤系統(tǒng)這個(gè)對象中出現(xiàn),從而保證了繪圖的統(tǒng)一。
3. 優(yōu)缺點(diǎn)比較面向過程優(yōu)點(diǎn): 流程化使得編程任務(wù)明確,在開發(fā)之前基本考慮了實(shí)現(xiàn)方式和最終結(jié)果,具體步驟清楚,便于節(jié)點(diǎn)分析。 效率高,面向過程強(qiáng)調(diào)代碼的短小精悍,善于結(jié)合數(shù)據(jù)結(jié)構(gòu)來開發(fā)高效率的程序。 缺點(diǎn): 需要深入的思考,耗費(fèi)精力,代碼重用性低,擴(kuò)展能力差,后期維護(hù)難度比較大。 面向?qū)ο?/font>優(yōu)點(diǎn): 結(jié)構(gòu)清晰,程序是模塊化和結(jié)構(gòu)化,更加符合人類的思維方式; 易擴(kuò)展,代碼重用率高,可繼承,可覆蓋,可以設(shè)計(jì)出低耦合的系統(tǒng); 易維護(hù),系統(tǒng)低耦合的特點(diǎn)有利于減少程序的后期維護(hù)工作量。 缺點(diǎn): 開銷大,當(dāng)要修改對象內(nèi)部時(shí),對象的屬性不允許外部直接存取,所以要增加許多沒有其他意義、只負(fù)責(zé)讀或?qū)懙男袨椤_@會(huì)為編程工作增加負(fù)擔(dān),增加運(yùn)行開銷,并且使程序顯得臃腫。 性能低,由于面向更高的邏輯抽象層,使得面向?qū)ο笤趯?shí)現(xiàn)的時(shí)候,不得不做出性能上面的犧牲,計(jì)算時(shí)間和空間存儲(chǔ)大小都開銷很大。
舉例說明兩者的優(yōu)缺點(diǎn),比如在五子棋游戲中增加悔棋的功能。在面向過程中,從輸入到顯示再到最后判斷的整個(gè)步驟都要改動(dòng),甚至函數(shù)的調(diào)用順序也要改動(dòng),而在面向?qū)ο蟮脑O(shè)計(jì)中,只需在棋盤系統(tǒng)中增加一個(gè)回溯的功能就可以了,黑白雙方和規(guī)則系統(tǒng)的屬性和行為都不需改動(dòng)。這個(gè)例子說明了面向?qū)ο蟪绦蛟O(shè)計(jì)中代碼間的相關(guān)性低(低耦合特性),使得代碼很容易被復(fù)用和擴(kuò)展,同時(shí)也說明了面向過程的代碼重用性低、擴(kuò)展能力差。 歡迎來“編玩邊學(xué)”一起編程,www.codepku.com |
|
|