一 . 起因
**的復用是我們追求的境界,因為復用我們可以減輕我們工作量,這就是我們追求設計最初的目的.
在物件導向的設計中,**的復用最常見的方式有兩種:
[1]繼承的方式: 由於繼承,子類就擁有了父類的方法,那麼我們就沒必要重新複製一遍父類的實現方式,這是一種復用方式.
但是,繼承會帶來一些列的問題.因為一旦繼承,我們可能就擁有了父類中的一些其它方法,往往這些方法可能子類不該擁有,這個時候可以說 明是繼承使用不當.
[2]組合的方式: 簡單說,就是乙個物件擁有一些方法,我們想使用這些方法,只需要在我們的類中持有乙個該物件的引用,那麼我們自然就擁有了使用這個方法的權利,那麼**自然就可以服用了.
組合的方式應該優先於繼承的方式.
**如何復用?
前提是封裝.
封裝我們一般認為是一些列功能的組合,構成乙個更強大的功能的形式.[另外資料和資料的方式也是封裝].
封裝的粒度問題?
那麼我們封裝到什麼程度是好的呢?---權衡的條件就是責任明確[單一責任原則].
單一責任就是說我們封裝好的類,一定是功能關聯的方法,也就是說乙個類只應該明確完成一定量的事情.
越小的類以後被復用的可能就越大.
繼承的出現:
現在我們擁有了一系列小的類,我們出現了基本的繼承復用需求.
如繼承是建立新類的一種快捷的方式,我們只要繼承就可以獲得父類的功能.另外我們還可以定義一些額外的方法.
那麼繼承是否合理的判斷條件是什麼?
我們總不能因為需要乙個類的某些方法就繼承吧?
原則就是黎克特制替換原則.
子型別必須能夠替換父型別.
比如: public void 射擊(槍);
我們實現了槍的繼承結構:
我們的方法中,使用父類槍做為引數,那麼我們傳遞子型別也應該是合理的.
如果不合理,那麼就是繼承有問題.
多型的出現: 上面我們用到了多型,子類在執行時可以明確呼叫自己的方法.
那麼現在我們建立了乙個新類,雷射槍,那麼雷射槍也應該適合上面的射擊方法.
多型給我們了乙個良好的擴充套件性,這裡的擴充套件性是說,我們可以增加新類,但是對於舊類我們不應該再次修改.
[舊類被其它地方使用著,你修改舊類也就意味著你在挑戰自己,畢竟你無法知道你的修改到底是否正確.在沒出問題之前,你不能說你的修改沒錯,但出現問題,就說明你修改錯誤了.]
這就是開閉原則----對擴充套件開放,對修改關閉.
[這也是在保護自己的一種方式].---呵呵.
怎麼能實現開閉原則-----我們就需要使用介面隔離原則,也就是說我們應該面向介面程式設計.
比如上面的方法,我們的引數是乙個父類槍型別,如果我們定義的時候定義的是乙個ak47型別,那麼這個方法需要雷射槍的時候就需要重寫乙個方法了 .
這也就是面向抽象程式設計.
其實還有很多原則,但是從根本上講都是一樣的,怎麼做能更好的復用**,我們就怎麼去做.
總結一下:
[1]首先我們應該封裝**,[不封裝就不能夠復用]
[2]復用的方式: (1)繼承 (2)組合 優先組合
[3]面向介面程式設計
那麼你一定會使用多型 ,那麼你的程式的擴充套件性一定會更好.
重構:**是修改出來的,沒人能一次性寫好**的.
重構就是實現這些原則和設計思想的過程,也是你理解**的過程.
重構的結果和過程,就是一系列的設計模式的雛形.
設計模式: 一些良好**設計的範本,和解決思路.
也就是說:
(1)問題出現
(2)大神解決問題
(3)大神總結了這種問題應該怎麼解決
---於是出現了設計模式.[符合設計原則的]
我們怎麼做?
其實對於我自己來講,能真正使用模式的機會不多,但是
寫良好**的機會卻很多.這也就是說,我們可以參照這些設計模式的思想寫出一些更能復用的**.
這也就是學習設計模式最根本的原因.
[1]你發現自己的**很爛
[2]找到一些好的**實現[很多的模式,良好的復用,非常容易讓人理解]
[3]自己模仿寫寫就好了
程式設計師潔癖和純潔審美養成的過程:
所有的**都很爛,我能讓它變的更美好.
架構設計原則
電腦科學領域的任何問題都可以通過增加乙個間接的中間層來解決。實現功能性需求是當前的明確地,非功能性需求是應對未來未知需求 架構是系統非功能性需求的解決辦法的集合 架構設計的目的基礎是滿足功能需求,主要是滿足一下特性 高效能 可用性 可靠性 可擴充套件性 穩定性 安全性 易用性 可維護性 靈活性 實現...
架構設計原則
知乎 馮慶 常見架構設計方案質量屬性點有 效能 可用性 硬體成本 專案投入 複雜度 安全性 可擴充套件性等。在評估這些質量屬性時,需要遵循架構設計原則 1.合適原則,2簡單原則,避免貪大求全,基本上某個質量屬性能夠滿足以 一定時期業務發展就可以了。屬性 集群方案 拆分方案 備註 效能 中,繼續擴充套...
機房重構 設計模式那點兒事兒
這次做機房重構的總結,我主要說說設計模式。這是策略模式的uml圖,這個就是個思想,策略模式就是針對乙個問題的多種選擇或是多種解決方法,及比如超市結賬,會員卡有一種結賬模式,無會員卡是一種結賬模式,超市哪種商品打折要怎麼就結賬,有會員卡,然後還有打折,這需要怎麼結賬,所以,我們用策略模式來解決。這樣看...