標籤:
物件導向(Object Oriented,OO)是軟體開發方法。物件導向的概念和應用已超越了程式設計和軟體開發,擴充到如資料庫系統、互動式介面、應用結構、應用平台,分布式系統,網路管理結構、CAD技術、人工智慧領域。物件導向是一種對現實世界理解和抽象的方法,是電腦編程技術發展到一定階段後的產物。
--百度百科
起初物件導向是專指在程式設計中採用封裝,繼承,多態等設計方法。
在C#學習的基礎階段,我們只需要知道就是指通過對象來調用方法就可以了,過於執著於概念反而念頭不通達。想要深入的理解,生活上多思考,開發中多敲代碼來體會,很難通過別人的幾句話來理解清晰。
——以下是我接觸過並對我比較有觸動的解釋和建議:
1>想要深入瞭解物件導向,可以讀一下《Java編程思想》,雖然例子用的是Java語言,但是物件導向的思想和C#是相通的,再者說,學習C#或多或少都要接觸Java。
2>這個就比較豪放了,物件導向就是個XX(略過,貶義詞),你只需要知道代碼怎麼敲就可以了。我的理解就是,這麼多年都沒有能統一出一個精準易懂的描述,我們不必一開始就去做那個第一個把它描述出來的人,多用,多做,多體會,如是而已。
3>這條是剛剛參加工作時,總監做的簡單培訓,對於開發來說,實用:
簡單介紹物件導向的設計原則(這是我聽過最簡單粗暴的設計原則講解):
1,開閉原則-->對擴充開發,對修改關閉-->寫代碼時候要注意
2,裡氏替換原則-->適用於基類的一定適用於其子類-->繼承
3,依賴倒轉原則-->盡量依賴於抽象不要依賴於具體-->介面
4,介面隔離-->使用多個專門的介面比使用單一的總介面要好
5,合成彙總複用原則-->盡量少用繼承--防止層次過深,難以控制,不要有三級以上的繼承 合成彙總實現繼承兩個類,這樣來完成
多繼承。——在多繼承或繼承層次比較深的情況下適用這個法則
6,迪米特法則--為什麼它是法則而不是原則
-->一個對象因對其他的對象儘可能的少瞭解——內部實現的方法不對外部公開,通過參數的形式交給外部調用,但是
實際上,參數一多就難以控制,盡量少用函數的參數(3個以內最佳),謹慎的公開一些屬性。類內高內聚,類外低耦合。
當然這些話不依託於代碼都比較枯燥,但是配上特定代碼又容易誤導,還是在自己開發的時候多帶著這些問題思考比較好。
然後要瞭解一個事物,除了從它本身來瞭解,對比也是個不錯的切入方式。
-->這裡引用百度知道的一組問答:
物件導向和面向過程的區別?
面向過程就是分析出解決問題所需要的步驟,然後用函數把這些步驟一步一步實現,使用的時候一個一個依次調用就可以了。
物件導向是把構成問題事務分解成各個對象,建立對象的目的不是為了完成一個步驟,而是為了描敘某個事物在整個解決問題的步驟中的行為。
例如:
五子棋,
面向過程的設計思路就是首先分析問題的步驟:
1、開始遊戲,2、黑子先走,3、繪製畫面,4、判斷輸贏,5、輪到白子,6、繪製畫面,7、判斷輸贏,8、返回步驟2,9、輸出最後結果。
把上面每個步驟用分別的函數來實現,問題就解決了。
而物件導向的設計則是從另外的思路來解決問題。
整個五子棋可以分為 1、黑白雙方,這兩方的行為是一模一樣的,2、棋盤系統,負責繪製畫面,3、規則系統,負責判定諸如犯規、輸贏等。第一類對象(玩家對象)負責接受使用者輸入,並告知第二類對象(棋盤對象)棋子布局的變化,棋盤對象接收到了棋子的i變化就要負責在螢幕上面顯示出這種變化,同時利用第三類對象(規則系統)來對棋局進行判定。
可以明顯地看出,物件導向是以功能來劃分問題,而不是步驟。同樣是繪製棋局,這樣的行為在面向過程的設計中分散在了總多步驟中,很可能出現不同的繪製版本,因為通常設計人員會考慮到實際情況進行各種各樣的簡化。而物件導向的設計中,繪圖只可能在棋盤對象中出現,從而保證了繪圖的統一。
功能上的統一保證了物件導向設計的可擴充性。
比如我要加入悔棋的功能,如果要改動面向過程的設計,那麼從輸入到判斷到顯示這一連串的步驟都要改動,甚至步驟之間的循序都要進行大規模調整。如果是物件導向的話,只用改動棋盤對象就行了,棋盤系統儲存了黑白雙方的棋譜,簡單回溯就可以了,而顯示和規則判斷則不用顧及,同時整個對對象功能的調用順序都沒有變化,改動只是局部的。
再比如我要把這個五子棋遊戲改為圍棋遊戲,如果你是面向過程設計,那麼五子棋的規則就分布在了你的程式的每一個角落,要改動還不如重寫。但是如果你當初就是物件導向的設計,那麼你只用改動規則對象就可以了,五子棋和圍棋的區別不就是規則嗎?(當然棋盤大小好像也不一樣,但是你會覺得這是一個難題嗎?直接在棋盤對象中進行一番小改動就可以了。)而下棋的大致步驟從物件導向的角度來看沒有任何變化。
當然,要達到改動只是局部的需要設計的人有足夠的經驗,使用對象不能保證你的程式就是物件導向,初學者或者很蹩腳的程式員很可能以物件導向之虛而行面向過程之實,這樣設計出來的所謂物件導向的程式很難有良好的可移植性和可擴充性。
C#基礎一:物件導向基礎