轉:面向物件與面向過程的本質的區別
**注:**本文為轉載文章,原文地址:面向物件與面向過程的本質的區別
這篇文章寫的確實很好,通俗易懂
前言:
如果你很想搞明白麵向物件是什麼,面向過程是什麼,或者說二者之間的區別是什麼,那麼就花費一點時間來研讀一下這篇部落格,你一定會有很大的收穫的!
一、面向物件與面向過程的區別
面向過程就是分析出解決問題所需要的步驟,然後用函式把這些步驟一步一步實現,使用的時候一個一個依次呼叫就可以了;面向物件是把構成問題事務分解成各個物件,建立物件的目的不是為了完成一個步驟,而是為了描敘某個事物在整個解決問題的步驟中的行為。
可以拿生活中的例項來理解面向過程與面向物件,例如五子棋,面向過程的設計思路就是首先分析問題的步驟:1、開始遊戲,2、黑子先走,3、繪製畫面,4、判斷輸贏,5、輪到白子,6、繪製畫面,7、判斷輸贏,8、返回步驟2,9、輸出最後結果。把上面每個步驟用不同的方法來實現。
如果是面向物件的設計思想來解決問題。面向物件的設計則是從另外的思路來解決問題。整個五子棋可以分為1、黑白雙方,這兩方的行為是一模一樣的,2、棋盤系統,負責繪製畫面,3、規則系統,負責判定諸如犯規、輸贏等。第一類物件(玩家物件)負責接受使用者輸入,並告知第二類物件(棋盤物件)棋子佈局的變化,棋盤物件接收到了棋子的變化就要負責在螢幕上面顯示出這種變化,同時利用第三類物件(規則系統)來對棋局進行判定。
可以明顯地看出,面向物件是以功能來劃分問題,而不是步驟。同樣是繪製棋局,這樣的行為在面向過程的設計中分散在了多個步驟中,很可能出現不同的繪製版本,因為通常設計人員會考慮到實際情況進行各種各樣的簡化。而面向物件的設計中,繪圖只可能在棋盤物件中出現,從而保證了繪圖的統一。
上述的內容是從網上查到的,覺得這個例子非常的生動形象,我就寫了下來,現在就應該理解了他倆的區別了吧,其實就是兩句話,面向物件就是高度實物抽象化、面向過程就是自頂向下的程式設計!
二、面向物件的特點
在瞭解其特點之前,咱們先談談物件,物件就是現實世界存在的任何事務都可以稱之為物件,有著自己獨特的個性
屬性用來描述具體某個物件的特徵。比如小志身高180M,體重70KG,這裡身高、體重都是屬性。
面向物件的思想就是把一切都看成物件,而物件一般都由屬性+方法組成!
屬性屬於物件靜態的一面,用來形容物件的一些特性,方法屬於物件動態的一面,咱們舉一個例子,小明會跑,會說話,跑、說話這些行為就是物件的方法!所以為動態的一面, 我們把屬性和方法稱為這個物件的成員!
類:具有同種屬性的物件稱為類,是個抽象的概念。比如“人”就是一類,期中有一些人名,比如小明、小紅、小玲等等這些都是物件,類就相當於一個模具,他定義了它所包含的全體物件的公共特徵和功能,物件就是類的一個例項化,小明就是人的一個例項化!我們在做程式的時候,經常要將一個變數例項化,就是這個原理!我們一般在做程式的時候一般都不用類名的,比如我們在叫小明的時候,不會喊“人,你幹嘛呢!”而是說的是“小明,你在幹嘛呢!”
面向物件有三大特性,分別是封裝性、繼承性和多型性,這裡小編不給予太多的解釋,因為在後邊的部落格會專門總結的!
三、面向過程與面向物件的優缺點
很多資料上全都是一群很難理解的理論知識,整的小編頭都大了,後來發現了一個比較好的文章,寫的真是太棒了,通俗易懂,想要不明白都難!
用面向過程的方法寫出來的程式是一份蛋炒飯,而用面向物件寫出來的程式是一份蓋澆飯。所謂蓋澆飯,北京叫蓋飯,東北叫燴飯,廣東叫碟頭飯,就是在一碗白米飯上面澆上一份蓋菜,你喜歡什麼菜,你就澆上什麼菜。我覺得這個比喻還是比較貼切的。
蛋炒飯製作的細節,我不太清楚,因為我沒當過廚師,也不會做飯,但最後的一道工序肯定是把米飯和雞蛋混在一起炒勻。蓋澆飯呢,則是把米飯和蓋菜分別做好,你如果要一份紅燒肉蓋飯呢,就給你澆一份紅燒肉;如果要一份青椒土豆蓋澆飯,就給澆一份青椒土豆絲。
蛋炒飯的好處就是入味均勻,吃起來香。如果恰巧你不愛吃雞蛋,只愛吃青菜的話,那麼唯一的辦法就是全部倒掉,重新做一份青菜炒飯了。蓋澆飯就沒這麼多麻煩,你只需要把上面的蓋菜撥掉,更換一份蓋菜就可以了。蓋澆飯的缺點是入味不均,可能沒有蛋炒飯那麼香。
到底是蛋炒飯好還是蓋澆飯好呢?其實這類問題都很難回答,非要比個上下高低的話,就必須設定一個場景,否則只能說是各有所長。如果大家都不是美食家,沒那麼多講究,那麼從飯館角度來講的話,做蓋澆飯顯然比蛋炒飯更有優勢,他可以組合出來任意多的組合,而且不會浪費。
蓋澆飯的好處就是”菜”“飯”分離,從而提高了製作蓋澆飯的靈活性。飯不滿意就換飯,菜不滿意換菜。用軟體工程的專業術語就是”可維護性“比較好,”飯” 和”菜”的耦合度比較低。蛋炒飯將”蛋”“飯”攪和在一起,想換”蛋”“飯”中任何一種都很困難,耦合度很高,以至於”可維護性”比較差。軟體工程追求的目標之一就是可維護性,可維護性主要表現在3個方面:可理解性、可測試性和可修改性。面向物件的好處之一就是顯著的改善了軟體系統的可維護性。
看了這篇文章,簡單的總結一下!
面向過程
優點:效能比面向物件高,因為類呼叫時需要例項化,開銷比較大,比較消耗資源;比如微控制器、嵌入式開發、 Linux/Unix等一般採用面向過程開發,效能是最重要的因素。
缺點:沒有面向物件易維護、易複用、易擴充套件
面向物件
優點:易維護、易複用、易擴充套件,由於面向物件有封裝、繼承、多型性的特性,可以設計出低耦合的系統,使系統 更加靈活、更加易於維護
缺點:效能比面向過程低