一、物件導向的特性
三個基本的特性:封裝、繼承與多態。 1、封裝
物件導向編程核心思想這一就是就是將資料和對資料的操作封裝在一起.通過抽象,即從具體的執行個體中抽取共同的性質形成一般的概念,比如類的概念. 2、繼承
繼承體現了一種先進的編程模式.子類可以繼承父類的屬性和功能,即子類繼承了父類所具有的資料和資料上的操作,同時又可以增添子類專屬的資料和資料上的操作.例如,"人類"繼承了"哺乳類"的屬性和功能,同時又增添了人類專屬的屬性和功能. 3、多態
多態是物件導向編程的又一重要特徵.有兩種意義的多態(表現為方法的重寫(Overriding)和重載(Overloading))
一種是操作名稱的多態,即有多個操作具有相同的名字,但這些操作所接收的訊息類型必須不同.所謂操作名稱的多態是指可以向操作傳遞不同訊息,以便讓對象根據相應的訊息來產生一定的行為.
二、七大基本原則
7大基本原則:單一職責原則SRP(Single Responsibility Princ iple)、開放封閉原則OCP(Open-Close Principle) 、替換原則、依賴原則(the Dependency Inversion Principle DIP) (the Liskov Substitution Principle LSP) 、介面分離原則(the Interface Segregation Principle ISP)、“迪米特”法則 、組合 /彙總原則
1、單一職責原則SRP(Single Responsibility Principle)
即一個類只負責一項職責
可以降低類的複雜度,一個類只負責一項職責,其邏輯肯定要比負責多項職責簡單的多;
提高類的可讀性,提高系統的可維護性;
變更引起的風險降低,變更是必然的,如果單一職責原則遵守的好,當修改一個功能時,可以顯著降低對其他功能的影響。
需要說明的一點是單一職責原則不只是物件導向編程思想所特有的,只要是模組化的程式設計,都適用單一職責原則。
2、開放封閉原則OCP(Open-Close Principle)
一個模組在擴充性方面應該是開放的而在更改性方面應該是封閉的。比如:一個網路模組,原來只服務端功能,而現在要加入 用戶端功能,
那麼應當在不用修改服務端功能代碼的前提下,就能夠增加用戶端功能的實現代碼,這要求在設計之初,就應當將服務端和用戶端分開,公用部分抽象出來。
3、裡氏替換原則(the Liskov Substitution Principle LSP)
子類應當可以替換父類並出現在父類能夠出現的任何地方。
4、依賴倒轉原則(the Dependency Inversion Principle DIP)
具體依賴抽象,上層依賴下層。假設B是較A低的模組,但B需要使用到A的功能,
這個時候,B不應當直接使用A中的具體類: 而應當由B定義一抽象介面,並由A來實現這個抽象介面,B只使用這個抽象介面:這樣就達到
了 依賴倒置的目的,B也解除了對A的依賴,反過來是A依賴於B定義的抽象介面。通過上層模組難以避免依賴下層模組,假如B也直接依賴A的實現,那麼就可能造 成循環相依性。一個常見的問題就是編譯A模組時需要直接包含到B模組的cpp檔案,而編譯B時同樣要直接包含到A的cpp檔案。
5、介面分離原則(the Interface Segregation Principle ISP)
模組間要通過抽象介面隔離開,而不是通過具體的類強耦合起來。即面向介面編程
6、“迪米特”法則
又叫最少知識原則,就是說,一個對象應當對其他對象有儘可能少的瞭解
① 在類的劃分上,應該建立有弱耦合的類;
② 在類的結構設計上,每一個類都應當盡量降低成員的存取權限;
③ 在類的設計上,只要有可能,一個類應當設計成不變類;
④ 在對其他類的引用上,一個對象對其它對象的引用應當降到最低;
⑤ 盡量降低類的存取權限;
⑥ 謹慎使用序列化功能;
⑦ 不要暴露類成員,而應該提供相應的訪問器(屬性)。
7、.組合/彙總原則
又叫合成複用原則。原則就是在一個新的對象裡面通過關聯關係(包括組合關係和彙總關係)使用一些已有的對象,使之成為新對象的一部分,新對象通過委派調用已有對象的方法達到複用其已有功能的目的。也就是,要盡量使用類的合成複用,盡量不要使用繼承。
就是在一個新的對象裡面使用一些已有的對象,使之成為新對象的一部分,新的對象通過向這些對象的委派達到複用已有功能的目的。這個原則有一個簡短的描述:要盡量使用合成、彙總,盡量不要使用繼承。
1) 新對象存取成分對象的唯一方法是通過成分對象的介面
2) 這種複用是黑箱複用,因為成分對象的內部細節是新對象所看不到的
3) 這種複用可以在已耗用時間內動態進行,新對象可以動態引用與成分物件類型相同的對象
4) 合成、彙總可以應用到任何環境中去,而繼承只能應用到一些有限環境中去
5) 導致錯誤的使用合成、彙總與繼承的一個常見原因是錯誤的把“Has-a”關係當作“Is-a”關係。如果兩個類是“Has-a”關係那麼應使用合成、彙總,如果是“Is-a”關係那麼可使用繼承
在物件導向設計中,可以通過兩種基本方法在不同的環境中複用已有的設計和實現,即通過組合/彙總關係或通過繼承。
1) 繼承複用:實現簡單,易於擴充。破壞系統的封裝性,從基類繼承而來的實現是靜態,不可能在運行時發生改變,沒有足夠的靈活性;只能在有限的環境中使用。(“白箱”複用 )
2) 組合/彙總複用:耦合度相對較低,選擇性地調用成員對象的操作;可以在運行時動態進行。(“黑箱”複用 )
組合/彙總可以使系統更加靈活,類與類之間的耦合度降低,一個類的變化對其他類造成的影響相對較少,因此一般首選使用組合/彙總來實現複用; 其次才考慮繼承,在使用繼承時,需要嚴格遵循裡氏代換原則,有效使用繼承會有助於對問題的理解,降低複雜度,而濫用繼承反而會增加系統構建和維護的難度以及系統的複雜度,因此需要謹慎使用繼承複用。