《K的技術學習筆記》——良好OOP的設計原則:<SOLID Principles>(二)
![](https://assets.matters.news/embed/f263cde6-5fdb-453e-80c1-b736d323e5a3.png)
SOLID Principles的S就是單一功能(Single Responsibility Principle)
單一功能(Single responsibility principle)
只因一個職責而去作改變。這是什麼意思呢?不論是class, 還是function, 他們都只做他們所負責的範圍, 範圍以外的事一概不做和不理。
舉一個例子提款的例子。
現在提款有三個不同的部份,他們是銀行(Bank),提款機(ATM)和你的賬户(Account)
銀行(Bank)
![](https://assets.matters.news/embed/8992df85-6001-4317-ae38-e0736c377dc0.png)
在這裡銀行的職責就只是存取賬户, 他不做別的事情。
你的賬户(Account)
![](https://assets.matters.news/embed/78312943-6f63-471f-96bb-9e67dbea0724.png)
賬户的職責只是記錄和計算自己的存款。
提款機(ATM)
![](https://assets.matters.news/embed/7f4fea8d-5cb2-4f9c-b90a-7323683460ec.png)
提款機的職責就是提取和存款。提款機不能直接拿賬户的資料, 他一定要經由銀行去讀取賬户。提款機也不能直接更動賬户的資料, 還是要經由賬户自己去改動。他能自己改動的只有提款機內的資金數目。
若果說以上的class要不遵守單一功能(Single responsibility principle), 就會變成賬户的class去改動提款機內的儲存資金。
你的賬户(Account)<不遵守單一功能>
![](https://assets.matters.news/embed/3f869f61-2712-46af-9dd8-e84b57e31239.png)
提款機(ATM)<不遵守單一功能>
![](https://assets.matters.news/embed/3ecee6d0-cbff-44bf-8796-4a478b2a3312.png)
這樣的話將來有其他的feature加入, 就可能要每一個class都要進去檢查一下, 看看需不需要改動。不檢查的話, 就可能出現難以預檢的bug。
例如, 現在銀行為了鼓勵賬户多存款, 只要存款有1000美金就會獎勵賬户10美元。
提款機(ATM)<不遵守單一功能>
![](https://assets.matters.news/embed/e033b349-609b-4966-b0fe-aab252e4a1d0.png)
有沒有看出問題?若果我們不檢查賬户的addBalance, 哪10美金不只進了我們的賬户, 還幫ATM增加了資金。這裡出現的問題是ATM在數據上是多了10美金, 但實際上ATM的現金是比數據的少10美元。當數據和現金不一致, ATM在沒有現金提款時, 客人拿不到現金, 客人的賬户還被扣錢了。
哪我們遵守單一功能的話, 就能避免以上問題。
提款機(ATM)<遵守單一功能>
![](https://assets.matters.news/embed/f0f9e9e1-65d4-4cd3-b9e5-753cfb33d8f9.png)
因為我們知道賬户的addBalance遵守單一功能, 我們做改動時, 就不用檢查。這是因為addBalance這個名字已告知我們, 他只改動賬户的balance不會做一些我們不知道的事。
總結一下
優點
1.高可讀性
2.高維護性
3.減少改動導致bug的數量
缺點
1.難定義職責
喜欢我的作品吗?别忘了给予支持与赞赏,让我知道在创作的路上有你陪伴,一起延续这份热忱!
![](https://imagedelivery.net/kDRCweMmqLnTPNlbum-pYA/prod/avatar/23dcaa94-ad45-47a3-8255-4d2f5bc93a3e.jpeg/public)
- 来自作者
- 相关推荐