我看面向對象與面向過程

    有人說,沒有大型軟件項目的經驗,就很難理解面向對象。我不知道,但是我認爲凡事都有一個過程,這個過程就是悟吧。這這個循序漸進的每一個階段,對同一事物的理解會不一樣。因此,我想記錄下自己對於面向對象與面向過程的思考。

    對於面向對象與面向過程的基本概念百度百科與維基裏的解釋無非是這樣:面向是一種編程範式啦,將對象作爲程序的基本單元,將數據和程序封閉其中,以提高重用性。

面向過程呢,爲達到預定的狀態而執行指定的步驟。這些解釋在我看來,至少說明了一個問題,無論是面向對象還是面向過程,它都是指編程的思想,一種方式,至少是抽象的,跟語言沒有太大關係。

    有一位大牛說面向對象與面向過程就好比蓋飯(大家應該都吃過吧)與蛋炒飯的關係,一個呢,菜與飯是分開的的,如果不喜歡菜或飯的話,可以很方便地更換,一個呢,蛋與飯是混一塊兒的,不喜歡吃蛋或是蛋疼的人,可能會把蛋一點一點地擇出來。我覺得這個比喻蠻有意思的。

    我覺得面向過程的編程方式跟我們做事的方式挺相似的,有順序,一步一步來,有條不紊地。什麼事先做,什麼事後做怎麼事先都要考慮清楚,親力親爲。不然,一着不慎,那可就滿盤皆輸啊。比如說C語言中的宏定義,我認爲是一種面向對象的思想。我記得書上是舉的是這麼個例子#define PI 3.14,試想如果沒有這個宏定義,程序中又有很多地方用到了3.14,那改起來豈不是很麻煩(當然,可以用查找替換,但這不是以程序的方式考慮問題)。所以這小小的宏定義,是不是把程序中的相同的3.14抽象出來用PI來代替,抽象不就是這麼定義的嗎(抽象:從共同的事物中抽象共同的,本質的特徵,而捨棄其非本質的東西)。

    面向對象裏最重要的應該是抽象,這東西太神奇,最近我在學習django(用python語言寫的開源的web框架)的過程中體會了它的神奇與偉大。大家看這個例子。

urlpatterns = patterns('',
    ('^time/$', current_datetime),
    ('^time/plus/1/$', one_hour_ahead),
    ('^time/plus/2/$', two_hours_ahead),
    ('^time/plus/3/$', three_hours_ahead),
    ('^time/plus/4/$', four_hours_ahead),
)


我想在一個頁面中顯示時間當前時間,當前時間+1/2/3/4/個小時的話,就得寫成這樣,得其實它們有一個共同點,就是與當前時間有關,我想很多人已經想到了解決了方法,那就是用正則表達式,可以寫成這樣

 (r'^time/plus/\d+/$', hours_ahead),

問題解決了,而且省時省力,大笑,通用性也好。

    還有一個挺傻的例子。比如說想求一百個整數之和(當然不是用1加到一百,至少不是用這個數學公式能解決的),以面向過程的思想,那就寫個整數求和的函數唄,用一個for或while就能解決。那如果我下次求和的對象是浮點數、複數呢,又得重寫了?大家都知道我們應該用面向思想來解決這個問題,寫一個類,或者用模板。對這種小問題似乎不是很必要,但如果是大型程序呢?難怪,只有寫過大型程序的人才能深刻理解面向對象的思想,像我這種一次寫程序不會超過300行的來說,還有好長一段路,呵呵。

    跟師兄討論過面向對象與面向過程的問題,他提到因爲指針的緣故,面向才能如此高效。我其實不太明白,或許有關係吧。下一階段再好好考慮這個點吧。

    以上是我對面向對象與面向過程的一點拙見,是以我當前的知識水平爲基礎的,肯定有很多理解的不對不夠深刻的地方,我想以後會慢慢悟到吧。繼續努力。奮鬥




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章