1. 程式人生 > >面向物件的三個基本特徵和五個設計原則

面向物件的三個基本特徵和五個設計原則

面向物件的精神:可維護、可擴充套件、可複用、靈活性好。

三個基本特徵【封裝、繼承、多型】

封裝:每個物件都包含它能進行操作所需要的所有資訊,這個特性稱為封裝。

因為物件不必依賴其他物件來完成自己的操作,這樣方法和屬性包裝在類中,通過類的例項來實現。

封裝的好處:1、良好的封裝可以減少耦合;2、類內部的實現可以自由的修改;3、類具有清晰的對外介面。

繼承:物件的繼承代表了一種“is-a”的關係,B繼承A,表示B is A(貓是哺乳動物)。繼承者是被繼承者的特殊化,除了具備被繼承者的特性之外,還具備自己獨立的特性。繼承定義了類如何相互關聯,共享特性。

繼承的工作方式是,定義父類(基類)和子類(派生類),其中子類繼承父類的所有特性(父類所有非private屬性和功能),子類還可以定義新的特性(擴充套件父類沒有的屬性和功能 or 重寫父類方法)。 protect就是子類可以對基類有訪問權的修飾符。

子類從父類繼承的成員有方法、屬性、事件、索引指示器,但是不能繼承父類的構造器。構造器不能被繼承,只能被呼叫。呼叫父類的成員,用base關鍵字。

優點:使用繼承使得所有子類公共的部分都放在父類,使得程式碼得到共享,避免了重複。繼承使得修改或擴充套件繼承而來的實現都比較容易。

缺點:父類改變,子類不得不變。 繼承破壞了包裝,父類實現細節暴露給了子類,增大兩個類的耦合性。【繼承是一種父子類間的強耦合關係】

多型:多型表示不同的物件可以執行相同的動作,但是要通過它們自己的實現程式碼來執行。

多型原理:當方法被呼叫時,無論物件是否被轉換為其父類,都只有位於物件繼承鏈最末端的方法實現會被呼叫,也就是說,虛方法是按照其執行時的型別(而非編譯時型別)進行動態繫結呼叫的。

多型特點:

1、子類以父類的身份出現。

2、子類在工作時以自己的方式來實現。

3、子類以父類身份出現時,子類特有的屬性和方法不可以使用。

4、為了使子類的例項完全接替來自父類的類成員,父類必須將該成員宣告為虛的。這是通過在該成員的返回值型別之前加上vittual關鍵字實現的。

5、子類可以選擇使用override(重寫)將父類實現替換為自己的實現。

五個設計原則:

【單一職責、開放封閉、依賴倒轉、里氏代換、合成聚合複用、迪米特法則】

單一職責原理(Single-ResposibilityPrinciple):對於一個類而言,應該僅有一個引起它變化的原因。

開放-封閉原則(Open-Closedprinciple)

:軟體實體(類、模組、函式等等)應該可以擴充套件,但是不可修改。

開放-封閉原則:對於擴充套件是開放的,對於更改是封閉的。設計人員必須預測最可能發生變化的種類,然後構造抽象來隔離變化。【但是拒絕不成熟的抽象】

開放-封閉原則精神:面對需求,對程式的改動是通過增加新程式碼進行的,而不是更改現有的程式碼。

開放-封閉原則是面向物件設計的核心所在,遵守這個原則可以帶來的好處是:可維護、可擴充套件、可複用、靈活性好。

依賴倒轉原則(Dependecy-Inversion Principle)高層模組不應該依賴底層模組,兩個都應該依賴抽象。抽象不應該依賴細節,細節應該依賴抽象。

裡式代換原則LSP(Liskov-SubstituionPrinciple)子型別必須能夠替換掉它們的父型別。

只有當子類可以替換父類,父類才能真正被複用,而子類才能在父類的基礎上增加新的行為。

迪米特法則LoD(Law ofDemeter)也叫最少知識原則。如果兩個類不必彼此直接通訊,那麼這兩個類就不應當發生直接的相互作用,如果其中一個類需要呼叫另一個類的某一個方法的話,可以通過第三者轉發這個呼叫。

迪米特法則的根本思想是強調了類之間的鬆耦合。類之間的耦合越弱,越有利於複用,一個處在弱耦合的類被修改,不會對有關係的類造成波及。促進了軟體的複用。

合成/聚合複用原則CARP (Composite Reuse Principle):儘量使用合成/聚合,不要使用類繼承:

合成(composition)和聚合(aggregation)都是關聯的特殊種類。聚合表示一種弱的“擁有”關係,體現的是A物件可以包含B物件,但B物件不是A物件的一部分;合成則是一種強“擁有”關係,體現了嚴格的部分和整體的關係,部分和整體的生命週期一樣。【人群是一種聚合關係,但是人的身體和四肢是一種合成關係】

合成/聚合複用原則的好處是,優先使用物件的合成/聚合將有助於你保持每個類被封裝,並被集中在單個任務上。這樣類和類繼承層次會保持較小的規模,並且不太可能增長為不可控制的龐然大物

(網上還有一個介面隔離原則,書上沒寫,這裡也記錄下來)

介面隔離原則ISP (InterfaceSegregation Principle):使用多個專門的介面,而不使用單一的總介面。

敏捷開發原則:不要為程式碼新增基於猜測的、實際不需要的功能。如果不清楚一個系統是否需要命令模式,一般不著急去實現塔,事實上,在需要的時候通過重構實現這個模式並不困難,只有在真正需要撤銷/恢復操作的時候,把原來程式碼重構為命令模式才有意義。