淺談OOP

瞭解Java或C#等面向對象編程語言的的程序員比較熟悉類和對象以及OOP。

一談起OOP,就會想起教科書式的OOP概念:封裝、繼承、多態。粗淺的解釋封裝就是對數據進行隱藏;繼承就是子類繼承父類(class)或接口(interface)的方法和屬性,並實現代碼複用;多態就是重載和重寫。這樣的解釋仍僅僅只是面向對象的基本特徵,很淺顯,根本無法讓人知道如何去思考和設計面向對象編程。

面向對象理解
在做面向對象編程時,我們首先應該理解面向對象。
下面是我個人對面向對象的淺薄理解,由於自己做編程也沒多久,對OOP理解有限,對設計模式更是一竅不通。

抽象的理解 :抽象是從衆多物質中抽取共同的、本質的特徵,抽象是一種概念(比如public interface或抽象基類),抽象的過程是一個比較的過程,有比較才能抽象出共有特徵和本質;抽象的過程也是一個裁剪的過程,剪掉非本質的特徵。從不同的角度去對事物進行抽象,能夠衍生出不同的接口,這些看待或比較事物的角度也可以稱作接口。
一切事物都是對象,把事物的外觀抽象爲對象屬性,事物的隱私看作爲對象字段,事物的外部行爲抽象爲對象的公共方法,事物的內部行爲看作爲對象的私有方法。屬性和公共方法稱爲類對外的接口,字段和私有方法稱爲本源。
一切private成員或者接口和基類對象作爲方法參數都實現了數據的隱藏,把接口和基類作方法參數同樣實現了多態性,private成員是對象的內部行爲和形態,private成員是對象的本源,private成員無法被繼承。
一切public成員都是接口,這裏的接口就不僅僅是interface,它是一種標準和規則(比如定義的public屬性),是對象表現的外部行爲和形態,是對象和對象之間的通信和交互的紐帶。
類繼承的意義不僅僅是代碼複用,更大的意義是類擴展,類擴展表現爲方法的重載以及子類中有的方法和屬性而父類中沒有的方法和屬性。在一定程度上,類擴展也可以看做是一種多態,這不僅僅表現在子類重寫父類的方法,還表現在子類比父類具有更多的特性,子類是父類的變體,表現出和父類相似但比父類更豐富的形態。
方法的重載表現在“殊途同歸” ,對象做同樣的事情,事情的結果相同(返回值類型),但是實現的途徑不同(參數列表或方法體不同)。方法的重寫表現在“青出於藍而勝於藍” ,子類覆蓋父類的方法並進行擴展,如果不是這樣,重寫就沒有太大的意義。
面向對象(OO)和麪向過程(OP):面向過程是基於流程的設計和分析 ,一個問題的解決或功能的實現需要按照先後順序很步驟,每個步驟可以是一個函數;而面向對象是基於抽象的設計和分析 ,從問題和功能中抽象出類和接口,把方法原子化,類單一化。面嚮對象語言中一切事物都是對象,在面向過程中,方法稱之爲函數或過程,面向對象中方法是對象的表現行爲,面向對象是對面向過程的封裝。
面向對象的原則
頭五項原則是關於類設計的,它們是:

SRP,單一職責原則 ,一個類應該有且只有一個改變的理由。
OCP,開放封閉原則 ,你應該能夠不用修改原有類就能擴展一個類的行爲。
LSP,Liskov替換原則 ,派生類要與其基類自相容。
DIP,依賴倒置原則 ,依賴於抽象而不是實現。
ISP,接口隔離原則 ,客戶只要關注它們所需的接口。
另外的六項是關於包的設計原則。在本文中,包是指一個二進制的可發佈文件,比如.jar文件、或dll文件,而不是Java包或是C++的命名空間(譯註3)。

頭三項包原則是關於包內聚性的,它們會告訴我們該把什麼劃分到包中:

REP,重用發佈等價原則 ,重用的粒度就是發佈的粒度。
CCP,共同封閉原則 ,包中的所有類對於同一類性質的變化應該是共同封閉的。 
CRP,共同重用原則 ,一個包中的所有類應該是共同重用的。
最後的三項原則是關於包之間的耦合性原則的,並且論述了評價系統中包結構優良與否的評判標準。

ADP,無環依賴原則 ,在包的依賴關係圖中不允許存在環。
SDP,穩定依賴原則 ,朝着穩定的方向進行依賴。
SAP,穩定抽象原則 ,包的抽象程度應該和其穩定程度一致。
雖然一些大師們總結了這些原則,但是原則只是一種標準,我們應該效仿標準,而不是依賴標準,在實際的軟件設計中,如何能方便快捷的實現需求和客戶目標纔是關鍵,過度遵循原則會使簡單的問題複雜化,給自己和團隊帶來不少麻煩。


本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/pjw100/archive/2010/02/02/5282173.aspx

發佈了3 篇原創文章 · 獲贊 0 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章