
在面試時經(jīng)常會被問到面向過程和面向?qū)ο笥惺裁磪^(qū)別,雖然都是編程的一種思想,但是他們的側重點不同,我們從以下幾個方面進行簡單總結。
歷史
面向過程的編程語言有匯編語言、C語言。C語言,是1972年貝爾實驗室的 D.M.Ritchie 在B語言的基礎上設計出的一種新的語言。他們的特點就是太底層了,當你在使用面向過程的編程語言編寫代碼的時候,你就需要把思維轉換成機器的思維,時刻要考慮開辟多大的內(nèi)存,存儲多大的數(shù)據(jù),數(shù)據(jù)在使用完畢的后什么時間釋放,這樣寫代碼學習成本太高,開發(fā)效率低,不適合編程的推廣與應用。
所以漸漸的就發(fā)展出來了更友好地面向?qū)ο缶幊陶Z言,面向?qū)ο缶幊趟枷胧呛茉缇吞岢鰜碓缭?967年的時候,在挪威計算中心的Kisten Nygaard和Ole Johan Dahl開發(fā)了Simula67語言,它提供了比子程序更高一級的抽象和封裝,引入了數(shù)據(jù)抽象和類的概念,這種語言被認為是第一個面向?qū)ο笳Z言。在20世紀80年代初期美國AT&T貝爾實驗室的本賈尼.斯特勞斯特盧普(Bjarne Stroustrup)博士發(fā)明并實現(xiàn)了C++(最初這種語言被稱作“C with Classes”)。一開始C++是作為C語言的增強版出現(xiàn)的,從給C語言增加類開始,不斷的增加新特性。目前主流的面向?qū)ο缶幊陶Z言有:Java、C++、Object-C、 JavaScript、Python、Go等,降低了學習成本,易于推廣,極大的激發(fā)了大家的學習熱情, 可以讓人們更加專注于如何使用編程語言實現(xiàn)想要的功能。
面向?qū)ο?Object Oriented,OO)是軟件開發(fā)方法。面向?qū)ο蟮母拍詈蛻靡殉搅顺绦蛟O計和軟件開發(fā),擴展到如數(shù)據(jù)庫系統(tǒng)、交互式界面、應用結構、應用平臺、分布式系統(tǒng)、網(wǎng)絡管理結構、CAD技術、人工智能等領域。面向?qū)ο笫且环N對現(xiàn)實世界理解和抽象的方法,是計算機編程技術發(fā)展到一定階段后的產(chǎn)物,是一種高級的編程思想。
對應于軟件開發(fā)的過程,面向?qū)ο驩O衍生出3個概念:OOA、OOD和OOP。采用面向?qū)ο筮M行分析的方式稱為OOA,采用面向?qū)ο筮M行設計的方式稱為OOD,采用面向?qū)ο筮M行編碼的方式稱為OOP。面向過程(OP)和面向?qū)ο?OO)本質(zhì)的區(qū)別在于分析方式的不同,最終導致了編碼方式的不同。
編程思想
案例:有一輛車,時速100km/h,行駛在長1000km的跨海大橋上,求多久能跑完?
面向過程編程思想:只關心數(shù)學邏輯。
var hours = 1000 / 100;
alert(hours);//10
面向?qū)ο缶幊趟枷耄簩⑸钸壿嬘成涞轿覀兊某绦蚶铩?/p>
找出題目實體,抽象成對象的概念。
分析實體屬性和功能,給對象賦一些屬性和方法。
讓實體相互作用得出結果,讓每個對象去執(zhí)行自己的方法。
var car = {
speed: 100,
run:function(road){
return road.length / this.speed;
}
}
var kuahaidaqiao = {
length:1000
}
var hours = car.run(kuahaidaqiao);
alert(hours);//10
面向過程(Procedure Oriented):看名字它是注重過程的。當解決一個問題的時候,面向過程會把事情拆分成: 一個個函數(shù)和數(shù)據(jù)(用于方法的參數(shù))。然后按照一定的順序,執(zhí)行完這些方法(每個方法看作一個個過程),等方法執(zhí)行完了,事情就搞定了。
面向?qū)ο螅∣bject Oriented):看名字它是注重對象的。當解決一個問題的時候,面向?qū)ο髸咽挛锍橄蟪蓪ο蟮母拍睿褪钦f這個問題里面有哪些對象,然后給對象賦一些屬性和方法,然后讓每個對象去執(zhí)行自己的方法,問題得到解決。
語法
JavaScript是一種基于對象的語言,但是它又不是一種真正的面向?qū)ο缶幊陶Z言,因為它沒有類(class)。類是具有一類相同特征事物的抽象概念。 在JS中一切皆對象,對象是具體的某一個實例,唯一的個體。在ECMA6語法中中新增了類這個概念。
對象的概念
在面向?qū)ο蟮木幊趟枷胫芯褪且詫傩院托袨榈姆绞饺シ治鐾活愂挛铮瑢⑵涔灿刑匦院托袨榈某橄蟪鰜?,并封閉起來對待,而且我們封閉的同一類事物的屬性和行為是互相關聯(lián)的,有著內(nèi)在的聯(lián)系。
【注】對象既能存儲屬性又能存儲函數(shù)。
【注】我們聲明的變量和函數(shù)對比對象的屬性和方法,使用方式相同,唯一的區(qū)別就是使用對象的屬性和方法時前面需要加對象名稱,變量是自由的,屬性是屬于對象的。
-
聲明對象的三種方式
var obj = new Object(); //通過new對象 var obj = Object(); //聲明new var obj = {}; //直接通過對象常量聲明 -
給對象添加屬性
obj.name = "鋼鐵俠"; obj["age"] = 40; //使用中括號方式與通過.的方式添加屬性等價 obj.sex = "男"; -
給對象添加方法
obj.showName = function(){ alert(this.name); //鋼鐵俠 } -
使用對象的屬性和方法
alert(obj.age); //40 obj.showName(); //40 -
刪除其中一個屬性或者函數(shù)
delete obj.age; delete obj.showName; alert(obj.age); //undefined obj.showName(); //報錯
數(shù)據(jù)結構
基本數(shù)據(jù)類型:存儲單個值
數(shù)組:處理批量的數(shù)據(jù)
對象:既能存儲數(shù)據(jù),又能存儲函數(shù)
面向過程是圍繞功能進行的,為每一個功能寫一個函數(shù),需要考慮其中的每一個細節(jié),以步驟劃分,可以這么比喻
面向過程的程序=算法+數(shù)據(jù)結構
而面向?qū)ο髣t像是組裝,先確定一個系統(tǒng)是由哪些對象組成,再分別去設計這些對象,將它們像零件一樣組裝起來形成有完整功能的系統(tǒng),以功能劃分,相當于
對象=算法+數(shù)據(jù)結構
面向?qū)ο蟮某绦?N個對象+控制信息
總結
面向過程
優(yōu)點:性能比面向?qū)ο蟾?,因為類調(diào)用時需要實例化,開銷比較大,比較消耗資源;比如單片機、嵌入式開發(fā)、 Linux/Unix等一般采用面向過程開發(fā),性能是最重要的因素。
缺點:沒有面向?qū)ο笠拙S護、易復用、易擴展
面向?qū)ο?/strong>
優(yōu)點:易維護、易復用、易擴展,由于面向?qū)ο笥蟹庋b、繼承、多態(tài)性的特性,可以設計出低耦合的系統(tǒng),使系統(tǒng) 更加靈活、更加易于維護
缺點:性能比面向過程低