這是技術(shù)面試過(guò)程中經(jīng)常問(wèn)的問(wèn)題,真要徹底的講明白,不是一件很容易的事情。可以簡(jiǎn)單的用C語(yǔ)言和C++兩種語(yǔ)言的本質(zhì)區(qū)別來(lái)具體解釋,首先從設(shè)計(jì)模式來(lái)講面向?qū)ο蟾尤菀仔纬煽蚣芴匦裕F(xiàn)在高級(jí)語(yǔ)言基本上都支持面向?qū)ο螅駄ava,python都是這個(gè)樣子。
從事編程十幾年兩種思想的編程語(yǔ)言都有一些涉獵,整體給人感覺(jué)面相對(duì)對(duì)象更加容易理解,面向?qū)ο蟾映橄螅F(xiàn)在就一些具體的特性做一個(gè)大概的了解。
如何理解面向過(guò)程
面向過(guò)程和大家正常是思維模式接近,把一個(gè)問(wèn)題按照從左到右,從上到下的解決方案分解成N個(gè)小步驟然后挨個(gè)去執(zhí)行,說(shuō)的再抽象一點(diǎn)就是模塊化,具體實(shí)現(xiàn)通過(guò)函數(shù)來(lái)完成,函數(shù)里面又可以調(diào)用函數(shù),最終功能點(diǎn)就是被無(wú)數(shù)個(gè)函數(shù)來(lái)完成。
從代碼邏輯上分析,主函數(shù)main函數(shù)下面分成幾個(gè)大的功能函數(shù),這幾個(gè)函數(shù)又被分解成無(wú)數(shù)個(gè)小函數(shù)完成,稍微復(fù)雜點(diǎn)開(kāi)啟多個(gè)線程異步處理一些功能,基本上就是面向過(guò)程的全過(guò)程了,非常容易理解,底層的功能模塊也能別的功能模塊共用,不能講面向過(guò)程沒(méi)有共用性,只不過(guò)相對(duì)框架性看起來(lái)差些,linux內(nèi)核絕大部分代碼都是C語(yǔ)言完成,如果沒(méi)有框架性不可能這么穩(wěn)定的運(yùn)行,也正是這么靈活的功能模塊調(diào)用,早就了高效,所以在某些領(lǐng)域C語(yǔ)言依然是編程首先,同時(shí)也是基石,現(xiàn)在很多編程語(yǔ)言的底層都是C語(yǔ)言來(lái)完成的。
如果能用C語(yǔ)言的框架把一個(gè)系統(tǒng)構(gòu)建的十分完善并且具備很強(qiáng)的擴(kuò)展性,一定是編程的高手,這主要靠?jī)?nèi)在功底把零散的東西有機(jī)的結(jié)合成一種框架,不像面向?qū)ο笞詭С橄竽P腕w系。
如何理解面向?qū)ο?/h3>
面向?qū)ο笤谀J缴虾兔嫦蜻^(guò)程截然不同,面向?qū)ο笫窍瘸橄笠粋€(gè)模型,然后把這個(gè)模型實(shí)例化來(lái)使用,這個(gè)抽象模型就是大家經(jīng)常聽(tīng)到的類的概念,類并不能直接去使用,而是需要直接實(shí)例化,所以做了很多年面向過(guò)程的老程序員,發(fā)現(xiàn)面向?qū)ο箢惐仨殞?shí)例化,特別是想調(diào)用里面其中的一個(gè)方法的時(shí)候,還需要拿到對(duì)方的實(shí)例,然后才能直接去調(diào)用,放在面向過(guò)程的編程里面是可以直接功能函數(shù)。
面向?qū)ο罄锩娴念悾鋵?shí)是面向?qū)ο罄锩娼Y(jié)構(gòu)體的延伸,把這個(gè)概念放大化了。類主要是兩個(gè)部分構(gòu)成,屬性和方法,屬性就是變量,方法就是功能模塊。當(dāng)然面向?qū)ο笞钪饕母拍钍前咽挛锍橄蠡e個(gè)例子,把各種動(dòng)物抽象成一個(gè)類,常見(jiàn)的狗,雞鴨鵝等共有的屬性,都有能走動(dòng)的動(dòng)作,都有腳屬性,但不同的動(dòng)物數(shù)量不一樣,抽象成一個(gè)動(dòng)物類,如果要弄一個(gè)狗的類首先繼承一個(gè)動(dòng)物類,并且把動(dòng)物基本的特性繼承過(guò)來(lái),如果覺(jué)得有些方法差異太大就覆蓋掉,同時(shí)增加新的特性封裝成一個(gè)新的類,然后實(shí)例化進(jìn)行具體使用,還可以同時(shí)繼承多個(gè)類,拿到共性的方法或者屬性,這樣子能很好的繼承已經(jīng)有的功能,特別積累并且繼承以前的功能。
面向?qū)ο笤诖a量上會(huì)比面向過(guò)程的會(huì)少一些,畢竟有些功能方法可以直接繼承過(guò)來(lái)用,所以開(kāi)發(fā)面向?qū)ο蟮某绦騿T切換到面向過(guò)程會(huì)覺(jué)得特別不舒服,有些共有的方法直接繼承過(guò)來(lái)去用非常順其自然,面向過(guò)程調(diào)用更加突兀或者直接一點(diǎn)。面向?qū)ο笤诮鉀Q復(fù)雜是邏輯上更加占據(jù)一定的優(yōu)勢(shì),而且越用越有感覺(jué)。
如何理解面向?qū)ο蟮娜齻€(gè)特性?
1.封裝性
就是把屬性和方法都放在一個(gè)類里面,而且還可以通過(guò)訪問(wèn)類的權(quán)限屬性給區(qū)分開(kāi),更加安全,不想要釋放的功能,直接搞成私有機(jī)制,正好符合軟件架構(gòu)里面高內(nèi)聚低耦合,自己內(nèi)部的事情就不要暴露出來(lái),外部接口盡量簡(jiǎn)單,所以在設(shè)計(jì)上就符合軟件設(shè)計(jì)的理念,封裝性還具有安全性了,不想讓外部訪問(wèn)的時(shí)候可以屏蔽。
2.繼承性
就是把之前已經(jīng)實(shí)現(xiàn)好的代碼或者方法通過(guò)繼承的方法拿過(guò)來(lái)使用,能節(jié)省大量的代碼量,符合代碼設(shè)計(jì)里面的繼承優(yōu)秀代碼特性,而且寫(xiě)好的類還能給后來(lái)的人繼續(xù)使用,面向?qū)ο笳Z(yǔ)言更能形象的稱之為站在巨人的肩上
3.多態(tài)性
由于可以繼承多個(gè)類,能夠組合成多種特性,但多態(tài)的關(guān)鍵是覆蓋,就是同一個(gè)方法可以用不同的方式去實(shí)現(xiàn),展現(xiàn)出多態(tài)性。
雖然看似這些概念很簡(jiǎn)單,說(shuō)起來(lái)要比較容易,還是要真正在項(xiàng)目中去體現(xiàn),真正通過(guò)代碼來(lái)驗(yàn)證自己的想法,通過(guò)大型的項(xiàng)目實(shí)戰(zhàn)再回歸研究這些基本的概念,就會(huì)對(duì)這個(gè)設(shè)計(jì)者充滿無(wú)線的欽佩。