面向對象大家都很熟悉,可是基于對象就不一定了。兩個聽起來好象是同一回事,而事實上它們卻千差萬別。基于對象是指:我們采用對象封裝技術,將數據和操作捆綁在一起,但是并沒有合理地使用多態、繼承等面向對象技術進行軟件設計。其中的“沒有合理使用”這一修飾非常重要,它道出了面向對象和基于對象的本質區別。
雖然,聽起來面向對象我們很是熟悉,但就我的觀察,很多以前從事C程序開發的人,當他采用面向對象的編程語言(如C++)進行開發時,寫出來的程序卻是基于對象的。或者說他們是采用面向對象的語言編寫面向過程的程序!
要掌握面向對象技術不是一件容易的事,這要求我們對于所有的編程事務從“對象”的角度來考慮,是一種全新的思考問題的方法。我想錯用最近面試過的一位工程師的話來說明什么是面向對象開發,他說“現實世界是什么,那么程序當中就應當是什么”。
從我的學習經驗來看,一開始其實并不明白為什么要用對象來封裝。記得1999年剛從C轉向C++時,只覺得C++是另一種形式的“C”,那時并沒有深刻地領悟到C++語言中所蘊涵的面向對象的強大表達能力。后來,因為工作的需要,需對來自Microsoft MSDN中的Drawcli例程進行擴展,這一工作使得自己對面向對象編程這一技術的知識有了很好的掌握,但仍沒有達到隨心所欲地運用的境界。這好比我們學會了一套軍體拳,但卻不用會用其中的各個招式去格斗。
學習面向對象編程需要一段時間通過模仿好的設計(比如前面提到的Drawcli例程),并隨著模仿的深入而逐漸掌握。對面向對象編程的真正掌握,是從我們體會到其好處開始的。在我的成長經歷中,曾在某一項目上對一個復雜管理問題編程很是苦惱,當時突然想到了從其中抽象出一個類來做管理,那一刻所有的復雜度似乎都消失了。之前之所以復雜是因為采用面向過程的思考方式去解決問題,而當換成面向對象的方式時無形中簡化了問題。從這一經歷開始,我真正領悟到了面向對象設計的好處,這也是我從模糊的理解到真正掌握的一個根本轉折點。