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

in #cn4 years ago (edited)

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

單一功能(Single responsibility principle)

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

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

銀行(Bank)

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

你的賬户(Account)

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

提款機(ATM)

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

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

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

accountWithoutsrp.png

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

atmWithoutsrp.png

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

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

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

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

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

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

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

總結一下

優點

1.高可讀性
2.高維護性
3.減少改動導致bug的數量

缺點

1.難定義職責

Sort:  

Thank you for using @sleepagent bid bot serves.
This post has received a 66 % upvote from @sleepagent.