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

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.難定義職責