03-設計模式6原則大原則之單一原則

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

參考:http://blog.csdn.net/zhengzhb/article/details/7278174

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市甚牲,隨后出現(xiàn)的幾起案子义郑,更是在濱河造成了極大的恐慌,老刑警劉巖丈钙,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件非驮,死亡現(xiàn)場離奇詭異,居然都是意外死亡雏赦,警方通過查閱死者的電腦和手機院尔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來喉誊,“玉大人邀摆,你說我怎么就攤上這事∥榍眩” “怎么了栋盹?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長敷矫。 經(jīng)常有香客問我例获,道長,這世上最難降的妖魔是什么曹仗? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任榨汤,我火速辦了婚禮,結(jié)果婚禮上怎茫,老公的妹妹穿的比我還像新娘收壕。我一直安慰自己妓灌,他們只是感情好,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布蜜宪。 她就那樣靜靜地躺著虫埂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪圃验。 梳的紋絲不亂的頭發(fā)上掉伏,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天,我揣著相機與錄音澳窑,去河邊找鬼斧散。 笑死,一個胖子當著我的面吹牛摊聋,可吹牛的內(nèi)容都是我干的颅湘。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼栗精,長吁一口氣:“原來是場噩夢啊……” “哼闯参!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起悲立,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤鹿寨,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后薪夕,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體脚草,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年原献,在試婚紗的時候發(fā)現(xiàn)自己被綠了馏慨。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡姑隅,死狀恐怖写隶,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情讲仰,我是刑警寧澤慕趴,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站鄙陡,受9級特大地震影響冕房,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜趁矾,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一耙册、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧毫捣,春花似錦详拙、人聲如沸帝际。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽胡本。三九已至牌柄,卻和暖如春畸悬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背珊佣。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工蹋宦, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人咒锻。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓冷冗,卻偏偏與公主長得像,于是被迫代替她去往敵國和親惑艇。 傳聞我的和親對象是個殘疾皇子蒿辙,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 程序設計的6大原則: 單一職責原則里氏替換原則依賴倒置原則接口隔離原則迪米特法則開閉原則 從根本學好,理解為什么要...
    silencefun閱讀 2,408評論 1 4
  • 設計模式六大原則 設計模式六大原則(1):單一職責原則 定義:不要存在多于一個導致類變更的原因滨巴。通俗的說思灌,即一個類...
    viva158閱讀 768評論 0 1
  • 設計模式六大原則(1):單一職責原則 定義:不要存在多于一個導致類變更的原因。通俗的說恭取,即一個類只負責一項職責泰偿。 ...
    Jabir_Zhang閱讀 646評論 0 3
  • 轉(zhuǎn)載標注聲明:http://www.uml.org.cn/sjms/201211023.asp 目錄:[設計模式六...
    Bloo_m閱讀 717評論 0 7
  • 單一職責原則 (SRP) 全稱 SRP , Single Responsibility Principle 單一職...
    米莉_L閱讀 1,766評論 2 5