如何給對象解釋什麼是「面向對象」?
01-27
對象大學學的是統計,無編程基礎。
假設你家裡有10萬塊錢:面向過程:錢放在桌子上,你想花錢自己拿錢去商店就行。面向過程:
錢寄存在你老婆那裡,你想花錢時向老婆提出申請,老婆控制花錢的全過程,你連錢的影子都看不到,只知道錢花出去了東西買回來了(更有可能被拒),然後根據反饋你該幹嘛幹嘛。
嗯就是這樣。你是我的對象,所以通過介面我可以和你一起做愛做的事情。但是其他人不是我的對象,她們的介面不開放,所以和其他人什麼都不可以做。
(逃「你是 Object 嗎?」
「不是。」
「那就不是面向你的。」面向過程就是分析出解決問題所需要的步驟,然後用函數把這些步驟一步一步實現,使用的時候一個一個依次調用就可以了。
面向對象是把構成問題事務分解成各個對象,建立對象的目的不是為了完成一個步驟,而是為了描敘某個事物在整個解決問題的步驟中的行為。
例如五子棋,面向過程的設計思路就是首先分析問題的步驟:1、開始遊戲2、黑子先走3、繪製畫面4、判斷輸贏5、輪到白子6、繪製畫面7、判斷輸贏8、返回步驟29、輸出最後結果
把上面每個步驟用分別的函數來實現,問題就解決了。而面向對象的設計則是從另外的思路來解決問題。整個五子棋可以分為 1、黑白雙方,這兩方的行為是一模一樣的2、棋盤系統,負責繪製畫面3、規則系統,負責判定諸如犯規、輸贏等。第一類對象(玩家對象)負責接受用戶輸入,並告知第二類對象(棋盤對象)棋子布局的變化,棋盤對象接收到了棋子的i變化就要負責在屏幕上面顯示出這種變化,同時利用第三類對象(規則系統)來對棋局進行判定。可以明顯地看出,面向對象是以功能來劃分問題,而不是步驟。同樣是繪製棋局,這樣的行為在面向過程的設計中分散在了總多步驟中,很可能出現不同的繪製版本,因為通常設計人員會考慮到實際情況進行各種各樣的簡化。而面向對象的設計中,繪圖只可能在棋盤對象中出現,從而保證了繪圖的統一。功能上的統一保證了面向對象設計的可擴展性。
比如我要加入悔棋的功能,如果要改動面向過程的設計,那麼從輸入到判斷到顯示這一連串的步驟都要改動,甚至步驟之間的循序都要進行大規模調整。如果是面向對象的話,只用改動棋盤對象就行了,棋盤系統保存了黑白雙方的棋譜,簡單回溯就可以了,而顯示和規則判斷則不用顧及,同時整個對對象功能的調用順序都沒有變化,改動只是局部的。再比如我要把這個五子棋遊戲改為圍棋遊戲,如果你是面向過程設計,那麼五子棋的規則就分布在了你的程序的每一個角落,要改動還不如重寫。但是如果你當初就是面向對象的設計,那麼你只用改動規則對象就可以了,五子棋和圍棋的區別不就是規則嗎?(當然棋盤大小好像也不一樣,但是你會覺得這是一個難題嗎?直接在棋盤對象中進行一番小改動就可以了。)而下棋的大致步驟從面向對象的角度來看沒有任何變化。當然,要達到改動只是局部的需要設計的人有足夠的經驗,使用對象不能保證你的程序就是面向對象,初學者或者很蹩腳的程序員很可能以面向對象之虛而行面向過程之實,這樣設計出來的所謂面向對象的程序很難有良好的可移植性和可擴展性。
來自百度知道,我認為寫的很清楚了
曾經,有一個偉大的編程之神創造了一個世界:他創造了人類(Class or type,人類),他們有頭髮,皮膚和各種器官(Properties or Attributes)。他最先造的兩個人叫亞當(Object Adam,人類的實例1)和夏娃(Object Eve, 人類的實例2)。他們的後代男的有小JJ(Inheritance 繼承),女的有nei nei(Inheritance 繼承)。為了繁殖後代,他們需要xoxo(Method or Function)。有一天,夏娃說「亞當,來xoxo了~」,說完就導致了一陣雲雨(Message Passing)。xoxo過程中,雖然他們都是人類,男的xoxo他會==&>,女的xoxo的時候她會O(Polymorphism,多態性) 。男的知道xoxo很舒服但是不知道女的被xoxo怎麼舒服法,反之亦然(Encapsulation 封裝性)。觀戰時,你可以說亞當和夏娃在xoxo,也可以說兩個人類在xoxo(Abstractions)。
面向對象關心誰做了什麼,面向過程關心怎麼做了這件事。
面相過程是指你的演算法通過函數和函數調用實現。
面相對象是指你的演算法通過類裡面定義的方法實現。
如果你對象是男的,不需要解釋。他不會一直糾結這個問題的。如果你對象是女的,不要解釋。解釋不明白。
你可以這麼理解,一個項目下來從頭至尾都是一個人做那叫面向過程,一個領導分給下屬做那叫面向對象!
推薦閱讀:
※筆記本換固態硬碟能否保留原有系統?
※Reaktor —— 正弦波變異
※安卓手機哪些軟體經常後台偷跑流量?
※給視頻加特效的三種優美姿勢
※求推薦電腦桌面分類管理軟體?!