學(xué)習(xí)編程, 基本功是掌握編程語(yǔ)言,但編程的本質(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ù)(不同的編程語(yǔ)言有不同的調(diào)用方法,我這里寫的是直接調(diào)用):
下五子棋{
開始游戲();
黑子先走();
繪制畫面();
判斷輸贏();
輪到白子();
繪制畫面();
判斷輸贏();
返回到?黑子先走();
輸出最后結(jié)果;
}
可見,面向過程始終關(guān)注的是怎么一步一步地判斷棋局輸贏的,通過控制代碼,從而實(shí)現(xiàn)函數(shù)的順序執(zhí)行。
2. 面向?qū)ο?/h2>
在日常生活或編程中,簡(jiǎn)單的問題可以用面向過程的思路來解決,直接有效,但是當(dāng)問題的規(guī)模變得更大時(shí),用面向過程的思想是遠(yuǎn)遠(yuǎn)不夠的。所以慢慢就出現(xiàn)了面向?qū)ο蟮木幊趟枷搿J澜缟嫌泻芏嗳撕褪挛?,每一個(gè)都可以看做一個(gè)對(duì)象,而每個(gè)對(duì)象都有自己的屬性和行為,對(duì)象與對(duì)象之間通過方法來交互。面向?qū)ο笫且环N以“對(duì)象”為中心的編程思想,把要解決的問題分解成各個(gè)對(duì)象,建立對(duì)象的目的不是為了完成一個(gè)步驟,而是為了描敘某個(gè)對(duì)象在整個(gè)解決問題的步驟中的屬性和行為。
在下五子棋的例子中,用面向?qū)ο蟮姆椒▉斫鉀Q的話,首先將整個(gè)五子棋游戲分為三個(gè)對(duì)象:
(1)黑白雙方,這兩方的行為是一樣的。
(2)棋盤系統(tǒng),負(fù)責(zé)繪制畫面
(3)規(guī)則系統(tǒng),負(fù)責(zé)判定犯規(guī)、輸贏等。
然后賦予每個(gè)對(duì)象一些屬性和行為:
(4)第一類對(duì)象(黑白雙方)負(fù)責(zé)接受用戶輸入,并告知第二類對(duì)象(棋盤系統(tǒng))棋子布局的變化,棋盤系統(tǒng)接收到了棋子的變化,并負(fù)責(zé)在屏幕上面顯示出這種變化,同時(shí)利用第三類對(duì)象(規(guī)則系統(tǒng))來對(duì)棋局進(jìn)行判定。
可以看出,面向?qū)ο笫且怨δ軄韯澐謫栴},而不是以步驟解決。比如繪制畫面這個(gè)行為,在面向過程中是分散在了多個(gè)步驟中的,可能會(huì)出現(xiàn)不同的繪制版本,所以要考慮到實(shí)際情況進(jìn)行各種各樣的簡(jiǎn)化。而面向?qū)ο蟮脑O(shè)計(jì)中,繪圖只可能在棋盤系統(tǒng)這個(gè)對(duì)象中出現(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ū)ο?/h3>
優(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)要修改對(duì)象內(nèi)部時(shí),對(duì)象的屬性不允許外部直接存取,所以要增加許多沒有其他意義、只負(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ò)展能力差。文章來源:http://www.zghlxwxcb.cn/news/detail-474752.html
以上內(nèi)容轉(zhuǎn)自編程少年青少年編程愛好者學(xué)習(xí)交流社區(qū) - 編程少年文章來源地址http://www.zghlxwxcb.cn/news/detail-474752.html
到了這里,關(guān)于面向過程 VS 面向?qū)ο蟮奈恼戮徒榻B完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!