編程中面向過程和面向?qū)ο蟮膮^(qū)別
面向過程程序設(shè)計(jì)和對面對象程序設(shè)計(jì)都是程序設(shè)計(jì)的方法,這兩者有什么區(qū)別呢,下面小編來告訴你面向過程和面向?qū)ο筮@兩者方法的區(qū)別。
面對過程和面對對象的區(qū)別
面向過程就是分析出解決問題所需要的步驟,然后用函數(shù)把這些步驟一步一步實(shí)現(xiàn),使用的時(shí)候一個(gè)一個(gè)依次調(diào)用就可以了。
面向?qū)ο笫前褬?gòu)成問題事務(wù)分解成各個(gè)對象,建立對象的目的不是為了完成一個(gè)步驟,而是為了描敘某個(gè)事物在整個(gè)解決問題的步驟中的行為。
例如五子棋,面向過程的設(shè)計(jì)思路就是首先分析問題的步驟:
1、開始游戲
2、黑子先走
3、繪制畫面
4、判斷輸贏
5、輪到白子
6、繪制畫面
7、判斷輸贏
8、返回步驟2
9、輸出最后結(jié)果
把上面每個(gè)步驟用分別的函數(shù)來實(shí)現(xiàn),問題就解決了。
面向?qū)ο蟮脑O(shè)計(jì)則是從另外的思路來解決問題。整個(gè)五子棋可以分為
1、黑白雙方,這兩方的行為是一模一樣的,
2、棋盤系統(tǒng),負(fù)責(zé)繪制畫面
3、規(guī)則系統(tǒng),負(fù)責(zé)判定諸如犯規(guī)、輸贏等。
第一類對象(玩家對象)負(fù)責(zé)接受用戶輸入,并告知第二類對象(棋盤對象)棋子布局的變化,棋盤對象接收到了棋子的i變化就要負(fù)責(zé)在屏幕上面顯示出這種變化,同時(shí)利用第三類對象(規(guī)則系統(tǒng))來對棋局進(jìn)行判定。
可以明顯地看出,面向?qū)ο笫且怨δ軄韯澐謫栴},而不是步驟。同樣是繪制棋局,這樣的行為在面向過程的設(shè)計(jì)中分散在了總多步驟中,很可能出現(xiàn)不同的繪制版本,因?yàn)橥ǔTO(shè)計(jì)人員會考慮到實(shí)際情況進(jìn)行各種各樣的簡化。而面向?qū)ο蟮脑O(shè)計(jì)中,繪圖只可能在棋盤對象中出現(xiàn),從而保證了繪圖的統(tǒng)一。
功能上的統(tǒng)一保證了面向?qū)ο笤O(shè)計(jì)的可擴(kuò)展性。比如我要加入悔棋的功能,如果要改動(dòng)面向過程的設(shè)計(jì),那么從輸入到判斷到顯示這一連串的步驟都要改動(dòng),甚至步驟之間的循序都要進(jìn)行大規(guī)模調(diào)整。如果是面向?qū)ο蟮脑?,只用改?dòng)棋盤對象就行了,棋盤系統(tǒng)保存了黑白雙方的棋譜,簡單回溯就可以了,而顯示和規(guī)則判斷則不用顧及,同時(shí)整個(gè)對對象功能的調(diào)用順序都沒有變化,改動(dòng)只是局部的。
再比如我要把這個(gè)五子棋游戲改為圍棋游戲,如果你是面向過程設(shè)計(jì),那么五子棋的規(guī)則就分布在了你的程序的每一個(gè)角落,要改動(dòng)還不如重寫。但是如果你當(dāng)初就是面向?qū)ο蟮脑O(shè)計(jì),那么你只用改動(dòng)規(guī)則對象就可以了,五子棋和圍棋的區(qū)別不就是規(guī)則嗎?(當(dāng)然棋盤大小好像也不一樣,但是你會覺得這是一個(gè)難題嗎?直接在棋盤對象中進(jìn)行一番小改動(dòng)就可以了。)而下棋的大致步驟從面向?qū)ο蟮慕嵌葋砜礇]有任何變化。
當(dāng)然,要達(dá)到改動(dòng)只是局部的需要設(shè)計(jì)的人有足夠的經(jīng)驗(yàn),使用對象不能保證你的程序就是面向?qū)ο?,初學(xué)者或者很蹩腳的程序員很可能以面向?qū)ο笾摱忻嫦蜻^程之實(shí),這樣設(shè)計(jì)出來的所謂面向?qū)ο蟮某绦蚝茈y有良好的可移植性和可擴(kuò)展性。
小編推薦:
1、面向?qū)ο笙鄬γ嫦蜻^程的優(yōu)點(diǎn)
1) 結(jié)構(gòu)清晰。使人們的編程與實(shí)際的世界更加接近,所有的對象被賦予屬性和方法,結(jié)果編程就更加富有人性化。
2) 封裝性。減小外部對內(nèi)部的影響。封裝將對象有關(guān)的數(shù)據(jù)和行為封裝成整體來處理,使得對象以外的部分不能隨意存取對象的內(nèi)部屬性,從而有效地避免了外部錯(cuò)誤對它的影響,大大減小了查錯(cuò)和排錯(cuò)的難度。
3) 容易擴(kuò)展,代碼重用率高。容易擴(kuò)展,在大框架不變的情況下很容易就開發(fā)出適合自己的功能,實(shí)現(xiàn)簡單,可有效地減少程序的維護(hù)工作量,軟件開發(fā)效率高。
2、面向?qū)ο笙鄬γ嫦蜻^程的缺點(diǎn)
1) 增加工作量。如果一味地強(qiáng)調(diào)封裝,當(dāng)進(jìn)行修改對象內(nèi)部時(shí),對象的任何屬性都不允許外部直接存取,則要增加許多沒有其他意義、只負(fù)責(zé)讀或?qū)懙男袨?。這會為編程工作增加負(fù)擔(dān),增加運(yùn)行開銷,并且使程序顯得臃腫。
2) 性能低。由于面向更高的邏輯抽象層,使得面向?qū)ο笤趯?shí)現(xiàn)的時(shí)候,不得不做出性能上面的犧牲,計(jì)算時(shí)間和空間存儲大小的都開銷很大。