淺析面向過程與面向?qū)ο?/h2>

在面試時經(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>

  1. 找出題目實體,抽象成對象的概念。

  2. 分析實體屬性和功能,給對象賦一些屬性和方法。

  3. 讓實體相互作用得出結果,讓每個對象去執(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ū)別就是使用對象的屬性和方法時前面需要加對象名稱,變量是自由的,屬性是屬于對象的。

  1. 聲明對象的三種方式

         var obj = new Object(); //通過new對象
         var obj = Object(); //聲明new
         var obj = {}; //直接通過對象常量聲明
    
  2. 給對象添加屬性

         obj.name = "鋼鐵俠";
         obj["age"] = 40; //使用中括號方式與通過.的方式添加屬性等價 
         obj.sex = "男";
    
  3. 給對象添加方法

         obj.showName = function(){
             alert(this.name); //鋼鐵俠
         }
    
  4. 使用對象的屬性和方法

         alert(obj.age); //40
         obj.showName(); //40
    
  5. 刪除其中一個屬性或者函數(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) 更加靈活、更加易于維護

缺點:性能比面向過程低

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容