標籤:
一、最佳化代碼的第一步:單一職責原則
英文名:Single Responsibility Principle (SRP)
定義:就一個類而言,應該僅有一個引起它變化的原因。
簡單來說,一個類中應該是一組相關性很高的函數、資料的封裝。
範例程式碼:
二、讓程式更穩當、更靈活:開閉原則
英文名:Open Close Principle (OCP)
定義:軟體中的對象(類、模組、函數等)應該對於擴充是開放的,當時,對於修改是封閉的。
在軟體的生命週期中,因為變化、升級和維護等原因需要對軟體原有代碼進行修改時,可能會將錯誤引入原本已近經過測試的舊代碼中,破壞原有系統。
因此,當軟體需求變化時,我們應該盡量通過擴充的方式來實現變化,而不是通過修改已有代碼來實現。當然,在現實開發過程中,只通過繼承的方式來升級、
維護原有系統只是一個理想化的願景,因此,在實際開發中,修改原有代碼、擴充代碼往往是同時存在的。
程式碼範例:
三、構建擴充性更好的系統:裡氏替換原則
英文名:Liskov Substitution Principle (LSP)
第一種定義:如果對每一個類型為S的對象O1,都有類型為T的對象O2,使得以T定義的所有程式P在所有的對象O1都代換成O2時,程式P的行為沒有發生變化,
那麼類型S是類型T的子類型。
第二種定義:所有引用基類的地方必須能透明地使用其子類的對象。
核心原理是抽象,抽象又依賴於繼承;
繼承優點有:
①代碼重用,減少建立類的成本,每個子類都擁有父類的方法和屬性
②子類與父類相似,但又與父類有所區別
③提高代碼的可擴充性
缺點:
①繼承是侵入性的,只要繼承就必須擁有父類的所有屬性和方法
②可能造成子類代碼冗餘、靈活性降低,因為子類必須擁有父類的屬性和方法
程式碼範例:
四、讓項目擁有變化的能力:依賴倒置原則
英文名:Dependence Inversion Principle (DIP)
定義:指代了一種特定的解耦形式,使得高層次的模組不依賴於低層次的模組的實現細節的目的
關鍵點:
①高層模組不應該依賴低層模組,兩者都應該依賴其抽象
②抽象不應該依賴細節
③細節應該依賴抽象
Java中,抽象 就是指介面或者抽象類別,兩者都是不能直接被執行個體化的;
細節 就是實作類別,實現介面或者繼承抽象類別而產生的類就是細節,特點是,可以直接被執行個體化,即可以通過關鍵字 new 產生一個對象。
高層模組就是調用端;
低層模組 就是具體實作類別。
使用:
模組間的依賴通過抽象發生,實作類別之間不發生直接的依賴關係,其依賴關係是通過介面或抽象類別產生。
簡單點說就是: 面向介面(介面或者抽象類別)編程,或者面向抽象編程。
範例程式碼:
五、系統有更高的靈活性:介面隔離原則
英文名:InterfaceSegregation Principle (ISP)
第一種定義: 用戶端不應該依賴它不需要的介面
第二種定義:類間的依賴關係應該建立在最小的介面上
目的是系統解開耦合,從而容易重構、更改和重新部署; 將龐大、臃腫的介面拆分成更小的更具體的介面。
樣本代碼:
六、更好地可擴充性:迪米特原則
英文名:Law Of Demeter (LOD)
定義:一個對象應該對其他對象有最少的瞭解、
通俗地講,一個類應該對自己需要耦合或調用的類知道的最少,類的內部如何?與調用者或者依賴者沒關係,調用者或者依賴者只需要知道它需要的
方法即可,其他的可一概不用管。
走向靈活軟體之路——物件導向的六大原則