對(duì)任何程序設(shè)計(jì)語言,語法當(dāng)然就是基本規(guī)則,這如同武學(xué)中的一招一式,談不上擴(kuò)展與境界,關(guān)鍵是要記住并熟練,讓一招一式都標(biāo)準(zhǔn)到位,這也是之后境界提升的基礎(chǔ)。
C語言層次:語法 -> 計(jì)算過程
在C的境界里,沒有高層的東西,可以說就是蠻干式的技術(shù)。要做什么,就是一步一步按各個(gè)步驟來,通過一層一層的關(guān)系,終于從最初的輸入實(shí)現(xiàn)到了最終的結(jié)果,所以任務(wù)也就完成了。
這個(gè)原理很簡(jiǎn)單,所以做法也是首先能想到的,最基本的。這在項(xiàng)目簡(jiǎn)單不復(fù)雜時(shí)確實(shí)很好,但是當(dāng)系統(tǒng)龐大復(fù)雜時(shí)其缺陷也就出現(xiàn)了:
對(duì)一個(gè)龐大的系統(tǒng),中間的可能性也就多了,要考慮的情況也就多了。如果還是按這種見招拆招的方式,那么主流程勢(shì)必淹沒在無窮無盡的if-else之中,一方面,寫系統(tǒng)的人就容易出現(xiàn)顧此失彼考慮不周的錯(cuò)誤;而對(duì)后來的維護(hù)者,就如同是在迷宮中漫游一般的噩夢(mèng)。即使硬著頭皮忍受煎熬讀這些代碼,就是有深厚功力的人,抓到了主藤蔓終于沒有被迷失,那也是消耗了很多的腦細(xì)胞能暫時(shí)理解了作者的思路。不過遺憾的是:回頭即忘了。下次查找問題或者修改維護(hù)時(shí)基本上又需要重頭再來。
C武功的這種缺陷也就催生了后面的設(shè)計(jì)方式。
小結(jié):C武功精準(zhǔn)有效,易于掌握。然而面對(duì)復(fù)雜問題時(shí)會(huì)感覺頭緒紛亂,條理不清,無論是對(duì)開發(fā)者還是維護(hù)者,都是令人頭痛的問題。
C++語言層次:語法 -> 對(duì)象 -> 算法
C++的境界比C的境界就高了一層。C++思想認(rèn)為:由于問題域很紛雜,如果用一條流水線來完成這個(gè)產(chǎn)品,這個(gè)流水線就會(huì)很長而且還會(huì)引出很多分支,這實(shí)在是一種很不利于開發(fā)管理的設(shè)計(jì)。所以我們可以在流水線上加入一些“工廠”。這些工廠就是一個(gè)一個(gè)的類,他們接受上流工廠的產(chǎn)品,然后按自己的流水線加工,加工好以后再把自己的產(chǎn)品送到下流的工廠。而這些工廠就是一個(gè)一個(gè)的對(duì)象。因?yàn)橛辛斯S,我們眼中就不再是像亂麻一樣的流水線了,而是幾條清晰的流水線聯(lián)系著若干工廠,這樣就清晰多了,也非常易于理解了。
在C++世界里,我們把這種思想叫做面向?qū)ο螅窗褑栴}設(shè)計(jì)為一個(gè)一個(gè)的對(duì)象域。這樣,對(duì)復(fù)雜的問題,就能較好的整體把握,各個(gè)擊破了!
Java語言層次:語法 -> 對(duì)象 -> 算法對(duì)象
Java武功的思想基本與C++的相同,兩者都是面向?qū)ο螅贿^其要求的是不允許任何流水線暴露在外,也就是“一切皆是對(duì)象”。而C++為了兼容C,可以允許存在全局變量、全局函數(shù)等。
然而,在程序設(shè)計(jì)中,還有一個(gè)問題:回調(diào)。是的,有許多種情況是程序員不能預(yù)估事情觸發(fā)的時(shí)刻的,只能說明發(fā)生了這樣的事情時(shí)該怎么辦。在程序設(shè)計(jì)領(lǐng)域,應(yīng)對(duì)這樣的突發(fā)事件,我們只能先向操作系統(tǒng)注冊(cè),告知他如果發(fā)生該事情,請(qǐng)執(zhí)行這個(gè)操作。這就叫回調(diào)。
而應(yīng)對(duì)回調(diào),C/C++本身沒有提供任何的設(shè)施支持,需要我們定義每一個(gè)關(guān)注的事情。然而Java與此不同,因?yàn)镴ava是在虛擬機(jī)環(huán)境下運(yùn)行,支持跨平臺(tái),所以其提供有完備的支持設(shè)施。任何你關(guān)注的事情,只要去找到它提供的設(shè)施進(jìn)行擴(kuò)展實(shí)現(xiàn)即可。也正是這個(gè)原理,所以你也就自然發(fā)現(xiàn)Java武功的“面向?qū)ο?#8221;思想更加徹底。或許,這也是Java與C++在境界上的最大區(qū)別了。