1. 程式人生 > >【新手向】面向過程與面向物件的區別

【新手向】面向過程與面向物件的區別

 我大學的專業是跟硬體息息相關的自動化專業,因此最開始接觸的程式語言是C語言,典型的面向過程語言。後來自學java和前端的時候感覺和C差距還是蠻大的,“類”、“封裝”、“繼承”這些概念都不瞭解是什麼意思,教程讓怎麼用自己就怎麼寫,對“面向物件”和“面向過程”這兩個詞沒有概念,現在回顧一下這二者說下自己的理解。


一、應用

 語言的使用場景最能體現出兩種語言的優缺點,在與硬體相關的領域,比如微控制器、嵌入式開發等等,基本都是C語言這樣的面向過程語言,甚至是彙編這樣的低階語言,因為在硬體領域追求的是效能。面向過程語言效能更加優越,可以最大化的讓小小的晶片“物盡其用”,但開發效率相比面嚮物件語言要低很多。

 而我們常用的計算機軟體大部分則是java這樣的面嚮物件語言所開發的,面嚮物件語言開發效率更高,而且鑑於計算機相關配置的快速發展,雖然效能不如面向過程語言,但是這個劣勢在計算機系統中可以忽略不計。

 後文會說明是什麼原因導致了效能的優劣。


二、面向過程

 顧名思義,面向過程就是針對整個事件的從開始到結束的流程進行程式設計,也就是對步驟的編寫,屬於是比較形象的程式語言,因此初學者入門面向過程語言要比入門面向物件語言更簡單一些。

 用開車來舉例,面向過程的編寫過程是:開車門 > 系安全帶 > 打火 > 鬆手剎 > 掛擋 > 起步,一步一步從頭到尾的對整個事件進行程式設計,和我們常規的思考方式相同。


三、面向物件

 對每個涉及到的事物進行編寫,然後以搭積木的方式組合到一起來形成一個系統,屬於是比較抽象的程式語言,理解起來有一定的難度,學習的起點比面向過程語言更高,但如果理解了之後學習速度會比面向過程語言快很多。

 同樣是開車,面嚮物件語言是針對每一個涉及到的物件進行程式設計,物件又包含了屬性與方法。比如車門是白色的,白色就是車門這個物件的屬性,車門物件還有兩個方法:“開啟車門”、“關閉車門”。這個屬性為“白色”,有“開啟車門”和“關閉車門”兩種方法的車門就是一個我們所說的物件。

 面向物件就需要將整個過程中涉及到的車門、發動機、輪子等等都作為物件先編寫好,然後根據我們過程中的需要去一個一個呼叫。當開車門時,我們就會拿到我們之前編寫好的車門物件,執行“開啟車門”這個方法。


四、對比

 面向過程與面向物件就好比印表機列印與人類繪畫,印表機從上到下一絲一絲的列印,而人類繪畫則是先畫一個物體,然後再畫另一個物體,然後所有物體拼到一起構成一幅畫。

開發效率

 面嚮物件語言之所以被計算機軟體開發者大量使用,是因為面嚮物件語言在開發效率上有個非常明顯的優勢,就是低耦合,每個物件都是相互獨立的,一個物件的改變不會影響其他物件。

 面向過程語言就不是這樣,很多情況下都是牽一髮而動全身,就好比你今天計劃好了看電影、逛街、吃飯,突然老闆通知你要開會,那你一整天的計劃就都被打亂,不得不重新計劃。因此面向過程語言很少在計算機軟體中使用,而更多用於需求一開始就很明確的硬體領域。

效能

 面向過程語言仍在被硬體領域大量使用的重要一點是效能相比面嚮物件語言更好,最根本的就是對資源的佔用。大部分面嚮物件語言沒有指標這個概念(C++基於C發展而來因此包含了指標),沒有指標也就意味著無法直接操作記憶體,這樣的好處是安全,而面向過程語言則可以通過指標來直接操作記憶體。

 這次用買車來舉例,面向過程就好比是私人訂製,各方面都由自己設計打造,哪怕是設計個獨輪車也是可以的,但是有可能由於設計的不合理導致車的崩潰。

 面向物件的話就是去4S店買車,各種車型擺在你面前給你選,可以在已有車型的基礎上選顏色等等,但是對於基本的發動機等要素是不可變的,雖然不如私人訂製更適合自己,但更加安全方便。

 實際應用中的差異在於,面嚮物件語言使用物件前需要先例項化(不懂例項化的話可以理解為建立)這個物件,假如我只需要“開啟車門”,我就必須例項化整個車門物件,儘管我沒有用到“關閉車門”這個方法。因此如果我要執行了物件的其中一個方法,我就必須要載入這個物件包含的所有屬性與方法,對資源的佔用就比面向過程語言要多很多了。

 C語言這類面向過程語言就沒有物件的概念,但是由於需要自己親自操刀來操作記憶體,因此只有對記憶體、堆疊、資料型別這類概念有較為全面的理解之後才可以運用自如,否則很容易導致程式的崩潰。

 總的來說面向過程語言理解容易,但是掌握很難,面嚮物件語言則與之相反,一旦理解的話學習起來也是很快的。