kirato

弱弱IT狗一名, 由於太弱只好睇更多技術相關資料, 主要用自己理解後寫筆記。 希望以後可以自由編寫屬於自己既系統。 有5少喜好,但冇咩時間, 所以都希望可以自由玩自己中意既事~

《K的技術學習筆記》——良好OOP的設計原則:<SOLID Principles>(二)

發布於
Single Responsibility Principle

SOLID Principles的S就是單一功能(Single Responsibility Principle)

單一功能(Single responsibility principle)

只因一個職責而去作改變。這是什麼意思呢?不論是class, 還是function, 他們都只做他們所負責的範圍, 範圍以外的事一概不做和不理。

舉一個例子提款的例子。

現在提款有三個不同的部份,他們是銀行(Bank),提款機(ATM)和你的賬户(Account)

銀行(Bank)

在這裡銀行的職責就只是存取賬户, 他不做別的事情。

你的賬户(Account)

賬户的職責只是記錄和計算自己的存款。

提款機(ATM)

提款機的職責就是提取和存款。提款機不能直接拿賬户的資料, 他一定要經由銀行去讀取賬户。提款機也不能直接更動賬户的資料, 還是要經由賬户自己去改動。他能自己改動的只有提款機內的資金數目。

若果說以上的class要不遵守單一功能(Single responsibility principle), 就會變成賬户的class去改動提款機內的儲存資金。

你的賬户(Account)<不遵守單一功能>

提款機(ATM)<不遵守單一功能>

這樣的話將來有其他的feature加入, 就可能要每一個class都要進去檢查一下, 看看需不需要改動。不檢查的話, 就可能出現難以預檢的bug。

例如, 現在銀行為了鼓勵賬户多存款, 只要存款有1000美金就會獎勵賬户10美元。

提款機(ATM)<不遵守單一功能>

有沒有看出問題?若果我們不檢查賬户的addBalance, 哪10美金不只進了我們的賬户, 還幫ATM增加了資金。這裡出現的問題是ATM在數據上是多了10美金, 但實際上ATM的現金是比數據的少10美元。當數據和現金不一致, ATM在沒有現金提款時, 客人拿不到現金, 客人的賬户還被扣錢了。

哪我們遵守單一功能的話, 就能避免以上問題。

提款機(ATM)<遵守單一功能>

因為我們知道賬户的addBalance遵守單一功能, 我們做改動時, 就不用檢查。這是因為addBalance這個名字已告知我們, 他只改動賬户的balance不會做一些我們不知道的事。

總結一下

優點

1.高可讀性

2.高維護性

3.減少改動導致bug的數量

缺點

1.難定義職責

《K的技術學習筆記》——良好OOP的設計原則:<SOLID Principles>(一)

《K的技術學習筆記》——良好OOP的設計原則:<SOLID Principles>(三)

《K的技術學習筆記》——良好OOP的設計原則:<SOLID Principles>(四)

9

看不過癮?

一鍵登入,即可加入全球最優質中文創作社區