小瘋談python:淺談面向過程和麵向對象

上一篇文章我簡單的介紹來一下計算機語言,在計算機語言發展的第三個階段誕生了高級語言,而在高級語言發展的過程中出現了兩中不同的編程思想——面向過程和麵向對象,這也是小白在學習一門高級語言的時候很難理解的地方,老實說,如果僅僅只學一門語言,那麼是很難深刻理解這兩種思想的,不過今天既然是淺談,所以斗膽來說一說我個人對著兩種思想的理解。


小瘋談python:淺談面向過程和麵向對象

首先我從專業的角度來解釋一下面向過程和麵向過程(其實就是我從資料上抄的)

面向過程:是分析解決問題的步驟,然後用函數把這些步驟一步一步的實現,然後在使用的時候一一調用則可。

面向對象:是把構成問題的事務分解成各個對象,而建立對象的目的也不是為了完成一個個步驟,而是為了描述某個事物在解決整個問題的過程中所發生的行為。

上面的解釋是什麼意思呢?老實說我也不是特別的能解釋的清楚,而且就算解釋清楚了,對於沒有編程基礎的小夥伴來說多半也聽不懂,所以接下來我將一個例子來向大家闡述我對著兩種思想的理解。

宋丹丹在春晚《鐘點工》中問趙本山把大象裝進冰箱分幾步,這個故事我想大家還記得吧,把大象裝進冰箱一共分三步,第一步把冰箱門打開;第二步把大象裝進冰箱;第三部把冰箱門關上。以上就是一種面向過程的思維方式,我們在解決一個問題的時候首先把這個問題的解決步驟分析出來,然後按照這個步驟寫出對應的代碼,然後調用這些代碼,最終實現問題的解決。

這種思想在現實生活中很常見,例如洗衣服,我們一般都是先放水,然後放洗衣液,然後放衣服,然後洗衣服,然後曬衣服。通常我們在描述解決一件問題的方法的時候,經常用到“然後”,“再”,“第一,第二.....”等表示先後順序的詞的時候,我們往往都是利用面向過程的思想。

這時候有的小夥伴會說,“對啊對啊,我基本上都是用這種方法解決問題的啊?有什麼問題嗎?”這種方法之所以能夠解決我們在日常生活中的絕大多數問題,是因為對於我們個人來說遇到的絕大多數問題是簡單的,單一的。但是一旦我們遇到複雜,多樣的問題的時候這樣的方法就顯得低效率了。

還是之前的裝大象的問題,如果現在我不是把一頭大象裝進一臺冰箱,而是把一百頭大象裝進一百臺冰箱,該怎麼裝?如果我們還是按照面向過程的思想,那麼應該是:先把第一臺冰箱的門打開,把第一頭大象裝進冰箱,最後把第一臺冰箱的門關上,然後把第二臺冰箱的門打開·········這樣的一個過程。

但是有小夥伴會說,“不對,應該是把冰箱門打開,把大象裝進去,把冰箱門關上,然後對後面的大象進行重複操作,直到所有大象裝進冰箱。”如果你是這麼想的,那麼恭喜你,你已經有了面向對象的思想了,因為你之所以認為後面的大象可以用第一個大象的步驟,是因為你默認了把所有的大象和冰箱都歸為一類,既然第一個大象可以用把門打開,把大象裝進去,把門關上,那麼之後的大象都可以這麼做。但是對於面向過程編程卻不行,因為在它們眼中,第一個大象和後面的大象是完全不同的東西,第一臺冰箱也和後面的冰箱不同,所以利用面向過程編程寫的話只能按照第一個的方法,一個一個的把大象裝進冰箱。很顯然,對於我們來說這種方很繁瑣也很不適用。

這時候,如果我們採用面向對象變回顯得簡單很多。首先這我們可以定義一個名為的類,在這個類中我們描述一下大象的特徵,有四條腿,長鼻子,大耳朵的動物。然後再定義個名為的類,同樣我們描述一下特徵,可以製冷的電器。最後我們定義一個名為裝大象方法:把門打開,把放進中,把門關上。這時候我們只要把這一百頭大象歸為的類,把一百臺冰箱歸為的類,然後調用裝大象的方法。這樣我們就解決了把一百頭大象裝進一百臺冰箱的問題了,這裡的象其實就是對大象這種事物的高度抽象,而把大象歸為這個類在編程的過程中叫做實例化。

有細心的小夥伴可能已經發現了,為什麼我定義的名稱是象,而不是大象呢?這是因為我要區別一下,當然你也可以定義類的名稱是大象,或者其他的任何名字。為什麼要區別,因為對於小白來說如果直接定義類的名稱為大象,他們會很容易默認的這個大象就是我們要裝的一百頭大象,這其實是一種錯誤的認知。對於編程語言來說,一旦我們確定了一個類並定義了相應的特徵,方法等,那麼計算機就會把所有歸為這個類的東西都當作同一種事物,例如如果我們在一個名為大象的類的下面寫老虎的特徵,計算機就會把這一百頭大象認為是老虎,而不是大象,這就會導致我們產生錯誤的結果,因此這個類的名稱只是一種代稱罷了,沒有任何的實際意義。

好的,如果你明白了上面的話,那麼我們便繼續。上面我們說到了實例化,這裡簡單的和大家解釋一下,所謂實例化就是把類這個抽象的概念具體到某一特定的事物中來,如果不對類進行實例化,那麼類中的方法是不能運行的。具體來說,只有我們把一號大象和一號冰箱歸為象和箱這兩個類中的時候,裝大象這個方法才會運行,並將裡面的方法具體化為:把一號冰箱門打開,把一號大象放進箱中,把一號冰箱箱門關上。後面所有的大象都是按照這個流程,唯一的卻別就在於大象和冰箱的編號不同。所以類和他的實例就相當於函數的形參和實參。

小瘋談python:淺談面向過程和麵向對象

最後,便是這兩種思想的優缺點了,一談到面向對象和麵向過程編程的優缺點的時候,我們常常會說面向對象的開發效率高,運行效率低等;面向過程開發效率低,運行效率高等;但是我個人認為這應當有個前提,就是在開發一個比較複雜的程序的時候。為什麼這麼說,我們可以回到最初的原點,當我們只將一頭大象裝進一個冰箱的時候,無疑我們採用面向過程的方式是最為簡單的,開發效率也是最高的,如果採用面向對象的方式無疑顯得雞肋了。同樣的在運行的效率來說,兩者其實也沒有太大的差別,雖然面向對象在實例化的過程中需要佔用大量的資源,但是如果我們只是實例化一個或者幾個對象的話,這其中的時間是很短的,與面向過程運行的時間幾乎沒有差別。(PS:雖然這裡說沒有差別,但實際上還是有的,因為對於計算機來說0.01秒和0.1秒之間其實時間已近相差很久,但是對於人來說卻很難捕捉到這微不足道的時間差。)

不過,如果是開發一個複雜的程序,則差別就開始體現了。首先是開發效率上,在之前我們已近很清晰的看到,當我們裝的大象的數量越來越多的時候,用面向過程的模式需要寫大量重複的代碼,而面向過程只要把類和方法定義好,然後把大象放進類中,就可以了,所以後者無疑要比前者所用時間要少。同時在維護和可移植性上,面向過程無疑要比面向對象差很多。還是剛才把一百頭大象裝進一百個冰箱的例子,如果我要把大象變成老虎,在面向對象中,我只需要打象這個類從新定義一下就可以了,但是對於面向過程來說,這需要把所有的大象改成老虎,也就是說我要改一千個代碼,這對於開發者來說無疑是不能接受的。

同樣的,在運行效率上來說,由於複雜的程序所需要的實例化的對象很多,因此在實例化的過程中佔用的資源會很多,因此在運行效率上要往往比面向過程所寫的程序要差,不過在很多情況下,犧牲一定運行效率換取一定的開發效率是開發者所能接受。(因為開發效率越快往往能使程序或軟件更快搶佔市場份額,而且還能減輕開發者的工作量,至於運行效率嘛,市場份額佔多了,沒有競爭者了,自然就有時間慢慢改進了唄。)

所以目前絕大多數的軟件開發都是以面向對象的思維開發的,面向過程主要應用於底層的開發。但是不能說面向過程不好,說道底,我認為這只是兩種思維模式,在面向對象的編程中我們仍然可以寫面向過程的代碼,例如我們在定義裝大象的方法的時候其實就用到了面向過程的思維方式。而在面向過程的編程中我們仍然可以使用面向對象的思維方式。而且從某種意義上來說,面向過程的思想仍然是初學者優先掌握的思想,只有當你的水平達到一定境界了,才需要掌握面向對象的方法,因為如果你以後的只能寫出一些解決簡單問題的程序,那麼面向過程的思維方式就已經足夠了。

以上便是我對面向過程和麵向對象的一些個人簡介,下一篇文章我將正是開始我的python學習的一些知識的分享。希望大家多多支持與分享。


小瘋談python:淺談面向過程和麵向對象


分享到:


相關文章: