天天看點

面向對象設計原則之概述

  對于面向對象軟體系統的設計而言,在支援可維護性的同時,提高軟體系統的可複用性是一個至關重要額問題,如何同時提高一份軟體系統的可維護性和可複用性是面向對象設計需要解決的核心問題之一。在面向對象設計中,可維護性的複用還是以設計原則為基礎的。每一個原則都蘊含一些面向對象設計的思想,可以從不同的角度提升一個軟體結構的設計水準。

  面向對象設計原則是學習設計模式的基礎,每一種模式都符合一種或多種面向對象設計的原則,使用這些原則達到可維護的複用,讓設計出的系統更加靈活、易于擴充。

  通常認為,一個易于維護的系統,就是複用率高的系統;而一個複用性較好的系統,就是一個易于維護的系統。

  知名軟體大師Robert C.Martin認為一個可維護性較低的軟體設計,通常由如下4個原因造成:

    1.過于僵硬(Rigidity):很難在一個軟體系統中添加一個新的功能,增加一個新的功能将涉及很多子產品,造成系統改動較大。

    2.過于脆弱(F人agility):與過于僵硬同時存在,修改已有的系統時代碼過于脆弱,對一個地方的修改會導緻看上去沒有關系的另一個地方發生故障。

    3.複用率低(Immobility):複用是指一個軟體的組成部分可以在同一個項目中的不同地方甚至是不同的項目中重複使用。而複用率低表示很難重用這些現有的軟體組成部分,如類、方法、子系統等,即使是重用也隻是停留在簡單的複制粘貼上,甚至根本沒辦法重用,程式員甯願不斷的重複編寫一些已有的程式代碼。

    4.黏度過高(Viscosity):對系統進行改動時,有時候 可以儲存系統的原始設計意圖和原始設計架構,有時候可以破壞原始設計意圖和原始設計架構,前者對系統的擴充更有利,應該盡量按照前者來進行改動。如果采用後者比前者更容易則稱為系統的黏度過高,黏度過高将導緻程式員采用錯誤的代碼維護方案。

  那麼這樣的系統才算一個好的設計,才是一個複用性較高的設計呢?軟體工程和模組化大師Peter Coad認為,一個好的系統設計應該具備如下三個性質:

    1.可擴充性(Extensibility):容易将新的功能添加到現有的系統中,與“過于僵硬“相對應。

    2.靈活性(Flexibility):代碼修改時不會波及很多其他子產品,與”過于脆弱“項對應。

    3.可插入性(Pluggability):可以很友善地将一個類抽取出去,同時将另一個有相同接口的類添加進來,與”黏度過高“相對應。

  軟體的複用或常用擁有衆多優點,如可以提高軟體的開發效率,提高軟體品質,節約成本,恰當的複用還可以改善系統的可維護性。

  面向對象設計複用的目标在于實作支援可維護性的複用,如在JAVA這樣的語言中,可以通過面向對象技術中的抽象、繼承、封裝和多态等特性來實作更高層次的可複用性。通過抽象和繼承使得類的定義可以複用,通過多态使得類的實作可以複用,通過抽象和封裝可以保持和促進系統的可維護性。在面向對象的設計裡面,可維護性複用都是以面向對象設計原則為基礎的,這些設計原則首先都是複用的原則,遵循這些原則可以有效的提高系統的複用性,同時提高系統的可維護性。

  常用的面向對象的設計原則包括如下7個:單一職責原則(Single Responsibility Principle,SRP)、開-閉原則(Open-Close Principle,OCP)、裡氏代換原則(Liskov Substituition Principle,LSP)、依賴倒換原則(Dependence Inversion Principle,DIP),接口隔離原則(Interface Segregation Principle,ISP)、合成複用原則(Composition Reuse Principle,CRP)、迪米特法則(Law of Demeter,LoD)。這些原則并不是孤立存在的,它們互相依賴,互相補充。

繼續閱讀