陳新龍
簡單講一講面向?qū)ο蠛兔嫦蜻^程的編程思想。目前市面上流行著不同的編程語言,例如Scratch、Python、Java、GO、C等等,經(jīng)常有同學(xué)會問小陳老師,這么多的編程語言,那么到底哪一種編程語言好學(xué)?哪一種編程語言容易上手呢?這些編程語言之間有什么區(qū)別呢?
目前的編程語言底層邏輯都離不開三大編程思想:面向過程編程、面向?qū)ο缶幊毯兔嫦蚯忻婢幊?。其?shí)編程的這些思想都源自我們的日常生活中,重要的不是學(xué)編程本身,而是通過編程來解決問題。
面向過程:面向過程的思想是把一個(gè)項(xiàng)目、一件事情按照一定的順序,從頭到尾一步一步地做下去,先做什么,后做什么,一直到結(jié)束。這種思想最好理解,和我們?nèi)粘W鍪虑榈姆椒ㄒ恢隆?/p>
面向?qū)ο螅好嫦驅(qū)ο蟮乃枷胧前岩粋€(gè)項(xiàng)目或者一件事情分解成更小的項(xiàng)目,或是分解成更小的部分。每一部分負(fù)責(zé)單一方向的功能,最后再將這些部分組合而成為一個(gè)整體。好比制造汽車,汽車公司不會從頭開始打造汽車,他們會從配件廠商那里購買所需要的零件如發(fā)動(dòng)機(jī)、外殼、玻璃、輪胎最后進(jìn)行總裝即可。這種思想適合多人的分工合作,類似公司的模式,在公司中分成各個(gè)部門,每個(gè)部門分別負(fù)責(zé)該部門的職務(wù),這樣各個(gè)部門可以充分發(fā)揮自己的特色,產(chǎn)品只要符合標(biāo)準(zhǔn)就可以了。
面向過程的核心是分析出解決問題所需的步驟,然后用函數(shù)把這些步驟一步一步解決實(shí)現(xiàn),使用的時(shí)候一個(gè)一個(gè)調(diào)取就可以了。
面向?qū)ο笫前褬?gòu)成問題的事物分解成各個(gè)對象,建立對象的目的不是為了完成一個(gè)步驟,而是為了描述某個(gè)事物在整個(gè)解決問題的步驟中的行為。
假設(shè)我們需要編寫一個(gè)五子棋游戲。按照面向過程的設(shè)計(jì)思路就是首先分析問題的步驟:1.開始游戲;2.繪制棋盤;3.黑子先走;4.白子后走;5.判斷輸贏。從第六步開始重復(fù)3、4、5的步驟,直至判斷輸贏得出了最后的勝負(fù)結(jié)果。
如果按照面向?qū)ο蟮乃枷雭斫鉀Q五子棋的問題,可以分成三大業(yè)務(wù):1.黑白雙方,這兩方的行為是一模一樣的都是下棋;2.棋盤系統(tǒng)負(fù)責(zé)繪制畫面;3.規(guī)則系統(tǒng),負(fù)責(zé)判定勝負(fù)結(jié)果。
從上述描述我們可以看出,面向?qū)ο笫且怨δ軄韯澐值?,而不是步驟,同樣是繪制棋盤,這個(gè)行為在面向過程設(shè)計(jì)中分散成多個(gè)步驟,很可能繪制出不同的版本,因?yàn)樵O(shè)計(jì)人員會根據(jù)實(shí)際情況進(jìn)行各種各樣的簡化。而面向?qū)ο蟮脑O(shè)計(jì)中,繪圖只可能在棋盤對象中出現(xiàn),從而保證了繪圖的統(tǒng)一。
兩種思想在初期可能感受不出有什么區(qū)別,如果后期游戲需要升級,在游戲中增加一些其他功能時(shí)就能體現(xiàn)出區(qū)別了。比如我想在游戲中加入悔棋的功能,在面向過程的代碼中我需要重新構(gòu)造,程序的順序需要大幅度調(diào)整,但是如果是面向?qū)ο蟮拇a中,只用改動(dòng)棋盤對象就可以了,只需要在棋盤對象中加入悔棋的功能,不會對整體的順序產(chǎn)生大的影響。
針對不同的問題我們可以通過不同的思維模式去嘗試多種解決方法。條條大路通羅馬,沒有對錯(cuò)之分,只是針對不同的問題考慮合適的處理方法而已,比如是否需要考慮后期代碼的擴(kuò)展維護(hù)及突發(fā)故障等情況。