1. 程式人生 > >關於面向物件和麵向過程本質的區別(個人感悟)

關於面向物件和麵向過程本質的區別(個人感悟)

前言:

  接觸面向物件的概念也差不多兩年了,對於面向物件也有著自己的一些感悟,期間也看到過面向過程的一些文章,但總是對於兩種思想沒有明確的區別概念,剛好今天在某篇部落格上看到對於兩者的區別。所以便寫下這篇部落格來記錄下感悟。

  

一、面向物件的特點

   什麼是物件,簡單來說物件就是現實世界存在的任何事務都可以稱之為物件,有著自己獨特的個性。

          用思維導圖來簡潔表示一下就是這樣:

    

    面向物件就是構成問題事務分解成各個物件,建立物件的目的不是為了完成一個步驟,而是為了描敘某個事物在整個解決問題的步驟中的行為。

 

 

 

二、面向過程的特點

  什麼是過程,我認為過程就是步驟,是解決問題的按部就班。

   面向過程用圖片表示:

  

  面向過程不同於面向物件,面向過程分析出解決問題所需要的步驟,然後用函式把這些步驟一步一步實現,使用的時候一個一個依次呼叫就可以了。

 

 三、面向物件和麵向工程的區別

  之前在那篇部落格上看到這個比喻,覺得特別恰當,挺容易讓人理解的,現在分享一下:

    

  用面向過程的方法寫出來的程式是一份蛋炒飯,而用面向物件寫出來的程式是一份蓋澆飯。所謂蓋澆飯,北京叫蓋飯,東北叫燴飯,廣東叫碟頭飯,就是在一碗白米飯上面澆上一份蓋菜,你喜歡什麼菜,你就澆上什麼菜。我覺得這個比喻還是比較貼切的。

  蛋炒飯製作的細節,我不太清楚,因為我沒當過廚師,也不會做飯,但最後的一道工序肯定是把米飯和雞蛋混在一起炒勻。蓋澆飯呢,則是把米飯和蓋菜分別做好,你如果要一份紅燒肉蓋飯呢,就給你澆一份紅燒肉;如果要一份青椒土豆蓋澆飯,就給澆一份青椒土豆絲。

  蛋炒飯的好處就是入味均勻,吃起來香。如果恰巧你不愛吃雞蛋,只愛吃青菜的話,那麼唯一的辦法就是全部倒掉,重新做一份青菜炒飯了。蓋澆飯就沒這麼多麻煩,你只需要把上面的蓋菜撥掉,更換一份蓋菜就可以了。蓋澆飯的缺點是入味不均,可能沒有蛋炒飯那麼香。

  到底是蛋炒飯好還是蓋澆飯好呢?其實這類問題都很難回答,非要比個上下高低的話,就必須設定一個場景,否則只能說是各有所長。如果大家都不是美食家,沒那麼多講究,那麼從飯館角度來講的話,做蓋澆飯顯然比蛋炒飯更有優勢,他可以組合出來任意多的組合,而且不會浪費。

  蓋澆飯的好處就是”菜”“飯”分離,從而提高了製作蓋澆飯的靈活性。飯不滿意就換飯,菜不滿意換菜。用軟體工程的專業術語就是”可維護性“比較好,”飯” 和”菜”的耦合度比較低。蛋炒飯將”蛋”“飯”攪和在一起,想換”蛋”“飯”中任何一種都很困難,耦合度很高,以至於”可維護性”比較差。軟體工程追求的目標之一就是可維護性,可維護性主要表現在3個方面:可理解性、可測試性和可修改性。面向物件的好處之一就是顯著的改善了軟體系統的可維護性。

 

四、總結

  面向過程:

    優點:效能比面向物件高,因為類呼叫時需要例項化,開銷比較大,比較消耗資源;比如微控制器、嵌入式開發、 Linux/Unix等一般採用面向過程開發,效能是最重要的因素。
    缺點:沒有面向物件易維護、易複用、易擴充套件

  面向物件:

    優點:易維護、易複用、易擴充套件,由於面向物件有封裝、繼承、多型性的特性,可以設計出低耦合的系統,使系統 更加靈活、更加易於維護 
    缺點:效能比面向過程低

&n