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

CC BY-NC-ND 2.0 版权声明

喜欢我的文章吗?
别忘了给点支持与赞赏,让我知道创作的路上有你陪伴。

加载中…
加载中…

发布评论