1.前言
設計模式的原則是所有設計模式的基礎宴凉。所以裆针,在學習設計模式之前馒吴,我們還是要掌握這6大原則的。今天我們來介紹一下審計模式種的6大原則中的單一原則脖母。
2.正文
2.1.單一職責
定義:單一職責原則(SRP)士鸥,就一個類而言,應該僅有一個引起它變化的原因谆级。
遵循單一職責原的優(yōu)點有:
- 可以降低類的復雜度烤礁,一個類只負責一項職責,其邏輯肯定要比負責多項職責簡單的多肥照;
- 提高類的可讀性脚仔,提高系統(tǒng)的可維護性;
- 變更引起的風險降低舆绎,變更是必然的鲤脏,如果單一職責原則遵守的好,當修改一個功能時吕朵,可以顯著降低對其他功能的影響凑兰。
需要說明的一點是單一職責原則不只是面向?qū)ο缶幊趟枷胨赜械模灰悄K化的程序設計边锁,都適用單一職責原則姑食。
問題由來:類T負責兩個不同的職責:職責P1,職責P2茅坛。當由于職責P1需求發(fā)生改變而需要修改類T時音半,有可能會導致原本運行正常的職責P2功能發(fā)生故障。
解決方案:遵循單一職責原則贡蓖。分別建立兩個類T1曹鸠、T2,使T1完成職責P1功能斥铺,T2完成職責P2功能彻桃。這樣,當修改類T1時晾蜘,不會使職責P2發(fā)生故障風險邻眷;同理,當修改T2時剔交,也不會使職責P1發(fā)生故障風險肆饶。
雖然單一職責原則如此簡單,并且被認為是常識岖常,但是即便是經(jīng)驗豐富的程序員寫出的程序驯镊,也會有違背這一原則的代碼存在。為什么會出現(xiàn)這種現(xiàn)象呢?因為有職責擴散板惑。所謂職責擴散橄镜,就是因為某種原因,職責P被分化為粒度更細的職責P1和P2冯乘。
所以記住蛉鹿,在職責擴散到我們無法控制的程度之前,立刻對代碼進行重構(gòu)往湿。
簡單的看一個例子:
動物呼吸
程序上線后妖异,發(fā)現(xiàn)問題了,并不是所有的動物都呼吸空氣的领追,比如魚就是呼吸水的他膳。修改時如果遵循單一職責原則,需要將Animal類細分為陸生動物類Terrestrial绒窑,水生動物Aquatic棕孙,代碼如下:
我們會發(fā)現(xiàn)如果這樣修改花銷是很大的,除了將原來的類分解之外些膨,還需要修改客戶端蟀俊。而直接修改類Animal來達成目的雖然違背了單一職責原則,但花銷卻小的多订雾,代碼如下:
可以看到肢预,這種修改方式要簡單的多。但是卻存在著隱患:有一天需要將魚分為呼吸淡水的魚和呼吸海水的魚洼哎,則又需要修改Animal類的breathe方法烫映,而對原有代碼的修改會對調(diào)用“豬”“牛”“羊”等相關(guān)功能帶來風險噩峦,也許某一天你會發(fā)現(xiàn)程序運行的結(jié)果變?yōu)椤芭:粑绷硕Ч怠_@種修改方式直接在代碼級別上違背了單一職責原則,雖然修改起來最簡單识补,但隱患卻是最大的族淮。還有一種修改方式:
可以看到,這種修改方式?jīng)]有改動原來的方法凭涂,而是在類中新加了一個方法祝辣,這樣雖然也違背了單一職責原則,但在方法級別上卻是符合單一職責原則的导盅,因為它并沒有動原來方法的代碼较幌。這三種方式各有優(yōu)缺點揍瑟,那么在實際編程中白翻,采用哪一中呢?其實這真的比較難說,需要根據(jù)實際情況來確定滤馍。我的原則是:只有邏輯足夠簡單岛琼,才可以在代碼級別上違反單一職責原則;只有類中方法數(shù)量足夠少巢株,才可以在方法級別上違反單一職責原則槐瑞。
3.結(jié)語
當類中只有少數(shù)方法,所以阁苞,無論是在代碼級別上違反單一職責原則困檩,還是在方法級別上違反,都不會造成太大的影響那槽。而類特別復雜的時候悼沿,一旦發(fā)生職責擴散而需要修改類時,除非這個類本身非常簡單骚灸,否則還是遵循單一職責原則的好糟趾。
Demo:20161130_Demo_Principle_SRP/Principle_SRP
轉(zhuǎn)載請注明:http://www.vicentz.cn