天天看點

《C++ 開發從入門到精通》——2.6 技術解惑

面向對象指的是把屬性和方法封裝成類,執行個體化對象後,要完成某個操作時,直接調用類裡面相應的方法。面向過程則不進行封裝,要完成什麼功能需要詳細地把算法寫出來。舉個例子來說,我要完成買東西這個任務,面向對象的實作方法就是,先對手下的人進行指導,教他們怎麼去買(相當于定義類的屬性和方法),以後要讓他們買東西,隻要喊“張三(或者李四,相當于執行個體化對象),你用上次我教你的方法去買個東西”,這樣就可以了。而面向過程的方法則不進行指導,每次要去買東西,都找張三過來,再教他怎麼去買,但是下次再喊他去買,又要重新教一次。

c語言是一門面向過程的語言,c++是一門面向對象的語言。究竟面向對象和面向過程有什麼差別呢?面向過程就是分析出解決問題所需要的步驟,然後用函數把這些步驟一步一步實作,使用的時候一個一個依次調用就可以了。 面向對象是把構成問題的事務分解成各個對象,建立對象的目的不是為了完成一個步驟,而是為了描叙某個事物在整個解決問題的步驟中的行為。

例如開發一個五子棋遊戲,使用面向過程的設計思路的步驟如下。

① 開始遊戲。

② 黑子先走。

③ 繪制畫面。

④ 判斷輸赢。

⑤ 輪到白子。

⑥ 繪制畫面。

⑦ 判斷輸赢。

⑧ 傳回步驟②。

⑨ 輸出最後結果。

把上面每個步驟用各自的函數來實作,問題就解決了。而面向對象的設計則是從另外的思路來解決問題的,開發整個五子棋遊戲的基本過程如下。

① 設計黑白雙方,這兩方的行為是一模一樣的。

② 設計棋盤系統,負責繪制畫面。

③ 開發規則系統,負責判定諸如犯規、輸赢等。

上述3個過程分别代表3個對象,其中第一類對象(玩家對象)負責接受使用者輸入,并告知第二類對象(棋盤對象)棋子布局的變化,棋盤對象接收到了棋子的變化就要負責在螢幕上面顯示出這種變化,同時利用第三類對象(規則系統)來對棋局進行判定。

由此可以明顯地看出,面向對象是以功能來劃分問題,而不是步驟。同樣是繪制棋局,這樣的行為在面向過程的設計中分散在了諸多步驟中,很可能出現不同的繪制版本,因為通常設計人員會考慮到實際情況進行各種各樣的簡化。而面向對象的設計中,繪圖隻可能在棋盤對象中出現,進而保證了繪圖的統一。

功能上的統一保證了面向對象設計的可擴充性,比如要加入“悔棋”這一功能,如果要改動面向過程的設計,那麼從輸入到判斷到顯示這一連串的步驟都要改動,甚至步驟之間的順序都要進行大規模調整。如果是面向對象的話,隻改動棋盤對象就行了,棋盤系統儲存了黑白雙方的棋譜,簡單回溯就可以了,而顯示和規則判斷則不用顧及,同時整個對對象功能的調用順序都沒有變化,改動隻是局部的。

再比如,要把這個五子棋遊戲改為圍棋遊戲,如果使用的是面向過程設計,那麼五子棋的規則就分布在了程式的每一個角落,要改動還不如重寫。但是如果一開始就使用了面向對象的設計,那麼隻改動規則對象就可以了,五子棋和圍棋的差別不就是規則嗎?而下棋的大緻步驟從面向對象的角度來看沒有任何變化。

當然,要達到“改動隻是局部的”,需要設計者有足夠的經驗,使用對象不能保證你的程式就是面向對象,初學者或者很蹩腳的程式員很可能以面向對象之虛而行面向過程之實,這樣設計出來的所謂面向對象的程式很難有良好的可移植性和可擴充性。

(1)學得要深入,基礎要紮實

基礎的作用不必多說,在大學課堂上老師曾經講過很多次了,在此重點說明“深入”。職場不是學校,企業要求你能高效完成項目功能,但是現實中的項目種類繁多,我們需要掌握c++技術的精髓。走馬觀花式的學習已經被社會所淘汰,入門水準不會被開發公司所接受,他們需要的是高手。

(2)恒心,演練,舉一反三

學習程式設計的過程是枯燥的過程,我們需要将學習c++當成是自己的樂趣,隻有做到持之以恒才能有機會學好。另外,程式設計最注重實踐,最害怕閉門造車。每一個文法,每一個知識點,都要反複用執行個體來演練,這樣才能加深對知識的了解。并且要做到舉一反三,隻有這樣才能對知識深入了解。

本文僅用于學習和交流目的,不代表異步社群觀點。非商業轉載請注明作譯者、出處,并保留本文的原始連結

繼續閱讀