面向對象三大特徵及代碼優化七大原則

  面向對象(Object Oriented,OO)是軟件開發方法。面向對象的概念和應用已超越了程序設計和軟件開發,擴展到如數據庫系統、交互式界面、應用結構、應用平臺、分佈式系統、網絡管理結構、CAD技術、人工智能等領域。面向對象是一種對現實世界理解和抽象的方法,是計算機編程技術發展到一定階段後的產物。

  一.面向對象的三大基本特性

  1.封裝
  封裝,就是把客觀事物封裝成抽象的類,並且類可以使自己的數據和方法只讓可信的類或者對象操作,對不可信的則進行信息隱藏。一個類就是一個封裝了數據以及操作這些數據的代碼的邏輯實體。在一個對象內部,某些代碼或某些數據可以是私有的,不能被外界訪問。通過這種方式,對象對內部數據提供了不同級別的保護,以防止程序中無關的部分意外的改變或錯誤的使用了對象的私有部分。
  2.繼承
  繼承,指可以讓某個類型的對象獲得另一個類型的對象的屬性的方法。它支持按級分類的概念。繼承是指這樣一種能力:它可以使用現有類的所有功能,並在無需重新編寫原來的類的情況下對這些功能進行擴展。 通過繼承創建的新類稱爲“子類”或“派生類”,被繼承的類稱爲“基類”、“父類”或“超類”。繼承的過程,就是從一般到特殊的過程。要實現繼承,可以通過 “繼承”(Inheritance)和“組合”(Composition)來實現。繼承概念的實現方式有二類:實現繼承與接口繼承(又稱接口實現)。實現繼承是指直接使用 基類的屬性和方法而無需額外編碼的能力;接口繼承是指僅使用屬性和方法的名稱、但是子類必須提供實現的能力。

組合是has a的關係 
繼承是is a的關係
爲擴展而繼承,爲複用而組合

  3.多態
  多態,是指一個類實例的相同方法在不同情形有不同表現形式。多態機制使具有不同內部結構的對象可以共享相同的外部接口。這意味着,雖然針對不同對象的具體操作不同,但通過一個公共的類,它們(那些操作)可以通過相同的方式予以調用。

  二.OOP編程的七個基本原則

  1.單一職責原則SRP(Single Responsibility Principle)

  類的功能要單一,體積不要過於龐大。
     SRP是指一個類的功能要單一,不能包羅萬象。如同一個人一樣,分配的工作不能太多,否則一天到晚雖然忙忙碌碌的,但效率卻高不起來。
  2.開放封閉原則OCP(Open-Close Principle)

  對擴展開放,對修改關閉。
     一個模塊在擴展性方面應該是開放的,而在更改性方面應該是封閉的。比如:一個網絡模塊,原來只提供服務端功能,而現在要加入客戶端功能,那麼應當在不用修改服務端功能代碼的前提下,就能夠增加客戶端功能的實現代碼,這要求在設計之初,就應當將服務端和客戶端分開,公共部分抽象出來。
  3.裏式替換原則LSP(the Liskov Substitution Principle)

  父類出現的地方,子類都可以替換。
     子類應當可以替換父類並出現在父類能夠出現的任何地方。比如:公司搞年度晚會,所有員工可以參加抽獎,那麼不管是老員工還是新員工,也不管是總部員工還是外派員工,都應當可以參加抽獎,否則公司就不和諧了。
  4.依賴倒置原則DIP(the Dependency Inversion Principle)

  具體依賴抽象。面向對象、抽象編程,不要面向細節、過程編程。

High level modules should not depend upon low level modules.Both should depend upon abstractions.
Abstractions should not depend upon details.
Details should depend upon abstracts.

   可以翻譯爲:

  • 高層模塊不應該依賴低層模塊,兩者都應該依賴抽象
  • 抽象不應該依賴細節
  • 細節應該依賴抽象

  每一個邏輯的實現都是由顆粒原子邏輯組成的,顆粒原子邏輯就是低層模塊,而顆粒原子邏輯組成的模塊就是高層模塊。在java語言中,抽象就是接口或抽象類,兩都都是不能直接被實例化的,細節就是實現類,實現接口或繼承抽象類而產生的類就是細節,兩者都可以直接被實例化。

  依賴倒置原則在java語言中的表現是:

  • 模塊間的依賴通過抽象發生,實現類之間不發生直接的依賴關係,其依賴關係是通過接口或抽象類產生的。
  • 接口或抽象類不依賴實現類
  • 實現類依賴接口或抽象類

  依賴倒置原則可以引申出OOD(Object-Oriented Design,面向對象設計)和OOP(Object-Oriented Programing,面向對象編程)。

  採用依賴倒置原則可以減少類間的耦合性,提高系統的穩定,降低並行開發引起的風險,提高代碼的可讀性和可維護性。  

對象的依賴關係有三種方式來傳遞:
    ①構造函數傳遞依賴對象
    在類中通過構造函數聲明依賴對象,按照依賴注入的說法,這種方式叫做構造函數注入。
    ②Setter方法傳遞依賴對象
    在類中通過Setter方法聲明依賴關係,依照依賴注入的說法,這是Setter依賴注入。
    ③接口聲明依賴
    在接口的方法中聲明依賴對象,該方法也叫做接口注入。

   5.接口分離原則ISP(the Interface Segregation Principle)
  接口定義的標準儘可能單一,致力於對接口的多實現。接口規模不要臃腫。

  6.迪米特法則---最少知識原則。類與類之間儘量減少不必要的訪問。降低耦合。

  7.合成複用原則。多用組合/聚合,少用繼承,降低耦合度。

  最後,我們再談下內聚與耦合。

  內聚標誌一個模塊內各個元素彼此結合的緊密程度,它是信息隱蔽和局部化概念的自然擴展。內聚是從功能角度來度量模塊內的聯繫,一個好的內聚模塊應當恰好做一件事。它描述的是模塊內的功能聯繫。
  耦合是軟件結構中各模塊之間相互連接的一種度量,耦合強弱取決於模塊間接口的複雜程度、進入或訪問一個模塊的點以及通過接口的數據。 程序講究的是低耦合,高內聚。就是同一個模塊內的各個元素之間要高度緊密,但是各個模塊之間的相互依存度卻要不那麼緊密。
  內聚和耦合是密切相關的,同其他模塊存在高耦合的模塊意味着低內聚,而高內聚的模塊意味着該模塊同其他模塊之間是低耦合。在進行軟件設計時,應力爭做到高內聚,低耦合。

  

  簡單地說,軟件工程中對象之間的耦合度就是對象之間的依賴性。指導使用和維護對象的主要問題是對象之間的多重依賴性。對象之間的耦合越高,維護成本越高。因此對象的設計應使類和構件之間的耦合最小。有軟硬件之間的耦合,還有軟件各模塊之間的耦合。  

  耦合可以分爲以下幾種,它們之間的耦合度由高到低排列如下:

    內容耦合。當一個模塊直接修改或操作另一個模塊的數據時,或一個模塊不通過正常入口而轉入另一個模塊時,這樣的耦合被稱爲內容耦合。內容耦合是最高程度的耦合,應該避免使用之。
    公共耦合。兩個或兩個以上的模塊共同引用一個全局數據項,這種耦合被稱爲公共耦合。在具有大量公共耦合的結構中,確定究竟是哪個模塊給全局變量賦了一個特定的值是十分困難的。
    外部耦合。一組模塊都訪問同一全局簡單變量而不是同一全局數據結構,而且不是通過參數表傳遞該全局變量的信息,則稱之爲外部耦合。
    控制耦合。一個模塊通過接口向另一個模塊傳遞一個控制信號,接受信號的模塊根據信號值而進行適當的動作,這種耦合被稱爲控制耦合。
    標記耦合。若一個模塊A通過接口向兩個模塊B和C傳遞一個公共參數,那麼稱模塊B和C之間存在一個標記耦合。
    數據耦合。模塊之間通過參數來傳遞數據,那麼被稱爲數據耦合。數據耦合是最低的一種耦合形式,系統中一般都存在這種類型的耦合,因爲爲了完成一些有意義的功能,往往需要將某些模塊的輸出數據作爲另一些模塊的輸入數據。
    非直接耦合。兩個模塊之間沒有直接關係,它們之間的聯繫完全是通過主模塊的控制和調用來實現的。 

  總的來說,耦合是影響軟件複雜程度和設計質量的一個重要因素,在設計上我們應採用以下原則:

  如果模塊間必須存在耦合,就儘量使用數據耦合,少用控制耦合,限制公共耦合的範圍,儘量避免使用內容耦合。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章