六大設(shè)計(jì)原則之一:單一職責(zé)原則

定義

單一職責(zé)原則(Single Responsibility Principle,簡稱SRP),顧名思義就是只有一個(gè)職責(zé)的原則。這樣定義的話的確比較簡單直白,但是“職責(zé)”不是一個(gè)能夠明確界定的東西,容易引起爭議。比如說:“我的職責(zé)是開發(fā)軟件。”這沒有問題,但是粒度非常粗,要知道開發(fā)軟件可以細(xì)分為構(gòu)架搭建、功能實(shí)現(xiàn)、調(diào)試等等部分,而且這些部分還可以繼續(xù)細(xì)分呢。所以上面的定義是有問題的。我們來看看單一職責(zé)原則的原始定義:

There should never be more than one reason for a class to chage.(有且只有一個(gè)原因引起一個(gè)類的變化。)

它回答了兩個(gè)問題:

  1. 單一職責(zé)是什么?單一職責(zé)不是“只有一個(gè)職責(zé)”,而是“有且只有一個(gè)原因引起變化”;
  2. 誰需要單一職責(zé)?定義中只說了類需要單一職責(zé),但在實(shí)踐中,接口和方法也需要單一職責(zé)。

也就是說,我們在設(shè)計(jì)一個(gè)類、接口或者方法的時(shí)候,需要保證有且只有一個(gè)原因引起它的變化。

單一職責(zé)原則降低了類的復(fù)雜性,讓每個(gè)類分工明確,能有效提高代碼的可讀性和可維護(hù)性。更重要的是,單一職責(zé)原則能幫你理清思路:當(dāng)你面對一個(gè)復(fù)雜的問題無從下手時(shí),嘗試從一個(gè)一個(gè)負(fù)責(zé)具體和單一功能的類做起吧!

爭議性

單一職責(zé)原則是非常簡單的一個(gè)原則,如果你現(xiàn)在就開始在項(xiàng)目中嚴(yán)格遵守這個(gè)原則,保證每個(gè)類都是“有且只有一個(gè)原因引起變化”,那么你很快就會(huì)發(fā)現(xiàn)你的類的數(shù)量大增。這不難理解,因?yàn)橐郧澳憧赡軙?huì)寫一個(gè)像瑞士軍刀一樣的類,但是現(xiàn)在螺絲刀是一個(gè)類,剪刀是一個(gè)類,指甲鉗是一個(gè)類...而且你往往還要把它們組合起來使用,最終結(jié)果是增加了復(fù)雜性。

單一職責(zé)原則的本意非常好,它讓每個(gè)類都只做一件事,減低了類的復(fù)雜性。但是如果嚴(yán)格遵守單一職責(zé)原則,又會(huì)導(dǎo)致類的數(shù)目大增,反而增加了整體的復(fù)雜性。這就是單一職責(zé)原則的爭議性。所以在實(shí)踐中,你很少會(huì)看到嚴(yán)格遵守單一職責(zé)原則的代碼。

最佳實(shí)踐

對于類來說,如果實(shí)在沒必要做到“有且只有一個(gè)原因引起變化”,那你至少要保證它的職責(zé)只有一個(gè),盡管你這個(gè)職責(zé)的粒度可能有點(diǎn)大。對于接口和方法來說,必須要做到“有且只有一個(gè)原因引起變化”。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 單一職責(zé)原則 (SRP) 全稱 SRP , Single Responsibility Principle 單一職...
    米莉_L閱讀 1,856評論 2 5
  • 前言 關(guān)于設(shè)計(jì)模式六大設(shè)計(jì)原則的資料網(wǎng)上很多,但感覺很多地方解釋地都太過于籠統(tǒng)化,特此再總結(jié)一波。 優(yōu)化第一步-單...
    ghroost閱讀 1,250評論 0 5
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,506評論 19 139
  • 這是一個(gè)測試
    馬穆魯克閱讀 109評論 0 0
  • 感賞早上5:40叫想兒起床,孩子聽到就起身了,外面一片漆黑,孩子出門上學(xué)去了。 感賞想兒從學(xué)校打來電話告訴我中午不...
    清晨劉丹閱讀 128評論 0 3

友情鏈接更多精彩內(nèi)容