定義
單一職責(zé)原則(Single Responsibility Principle熙卡,簡稱SRP),顧名思義就是只有一個職責(zé)的原則文捶。這樣定義的話的確比較簡單直白篇恒,但是“職責(zé)”不是一個能夠明確界定的東西,容易引起爭議葫松。比如說:“我的職責(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.(有且只有一個原因引起一個類的變化圣贸。)
它回答了兩個問題:
- 單一職責(zé)是什么?單一職責(zé)不是“只有一個職責(zé)”扛稽,而是“有且只有一個原因引起變化”吁峻;
- 誰需要單一職責(zé)?定義中只說了類需要單一職責(zé)庇绽,但在實(shí)踐中锡搜,接口和方法也需要單一職責(zé)。
也就是說瞧掺,我們在設(shè)計(jì)一個類耕餐、接口或者方法的時候,需要保證有且只有一個原因引起它的變化辟狈。
單一職責(zé)原則降低了類的復(fù)雜性肠缔,讓每個類分工明確,能有效提高代碼的可讀性和可維護(hù)性哼转。更重要的是明未,單一職責(zé)原則能幫你理清思路:當(dāng)你面對一個復(fù)雜的問題無從下手時,嘗試從一個一個負(fù)責(zé)具體和單一功能的類做起吧壹蔓!
爭議性
單一職責(zé)原則是非常簡單的一個原則趟妥,如果你現(xiàn)在就開始在項(xiàng)目中嚴(yán)格遵守這個原則,保證每個類都是“有且只有一個原因引起變化”佣蓉,那么你很快就會發(fā)現(xiàn)你的類的數(shù)量大增披摄。這不難理解亲雪,因?yàn)橐郧澳憧赡軙懸粋€像瑞士軍刀一樣的類,但是現(xiàn)在螺絲刀是一個類疚膊,剪刀是一個類义辕,指甲鉗是一個類...而且你往往還要把它們組合起來使用,最終結(jié)果是增加了復(fù)雜性寓盗。
單一職責(zé)原則的本意非常好灌砖,它讓每個類都只做一件事,減低了類的復(fù)雜性傀蚌。但是如果嚴(yán)格遵守單一職責(zé)原則基显,又會導(dǎo)致類的數(shù)目大增偎血,反而增加了整體的復(fù)雜性答朋。這就是單一職責(zé)原則的爭議性。所以在實(shí)踐中陵究,你很少會看到嚴(yán)格遵守單一職責(zé)原則的代碼销部。
最佳實(shí)踐
對于類來說摸航,如果實(shí)在沒必要做到“有且只有一個原因引起變化”,那你至少要保證它的職責(zé)只有一個舅桩,盡管你這個職責(zé)的粒度可能有點(diǎn)大酱虎。對于接口和方法來說,必須要做到“有且只有一個原因引起變化”擂涛。