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

在做代碼練習(xí)或者開發(fā)的過程中揩悄,我們會(huì)發(fā)現(xiàn)自己寫的類越來越大慷嗜,該類的功能也越來越多穷缤。有一些開發(fā)者包括之前的我看到自己寫的類夠大,功能夠多是往往會(huì)充滿自豪感三椿。但是當(dāng)某個(gè)功能需要做一個(gè)小改動(dòng)時(shí)缺菌,就會(huì)發(fā)現(xiàn)整個(gè)程序出現(xiàn)了各種大大小小的問題。

為什么知識(shí)對(duì)這個(gè)類的一個(gè)功能做了小小的修改就會(huì)引起這么大的問題赋续?因?yàn)槲覀冞`反了單一職責(zé)原則男翰。將多種功能集成在一個(gè)類中,就等于把這些功能耦合了起來纽乱,一個(gè)功能的變化可能會(huì)削弱或者抑制這個(gè)類完成其他職責(zé)的能力蛾绎。而如果想要避免這種現(xiàn)象的發(fā)生,就要盡可能的遵守單一職責(zé)原則鸦列。此原則的核心就是解耦和增強(qiáng)內(nèi)聚性租冠。

1. 解說定義

定義:不要存在多于一個(gè)導(dǎo)致類變更的原因。通俗的說薯嗤,即一個(gè)類只負(fù)責(zé)一項(xiàng)職責(zé)顽爹。

在一個(gè)類中,可以導(dǎo)致類變更的因素最多只能有一個(gè)骆姐。何為類變更呢镜粤?當(dāng)你要改變?cè)擃愔心承┐a時(shí),該類的某些用途或特性會(huì)隨著改變玻褪。
但是無(wú)論你怎么改肉渴,這個(gè)類只有最多一個(gè)用途或特性改變了,而不會(huì)再有其他的改變带射。只有這樣一個(gè)類的改變對(duì)其他使用到該類的模塊影響才會(huì)達(dá)到最低同规。也只有一個(gè)類只實(shí)現(xiàn)一個(gè)功能時(shí)才能做到到這種最小的改變。

2. 問題由來

類T負(fù)責(zé)兩個(gè)不同的職責(zé):職責(zé)P1窟社,職責(zé)P2券勺。當(dāng)由于職責(zé)P1需求發(fā)生改變而需要修改類T時(shí),有可能會(huì)導(dǎo)致原本運(yùn)行正常的職責(zé)P2功能發(fā)生故障灿里。

3. 解決辦法

遵循單一職責(zé)原則关炼。分別建立兩個(gè)類T1、T2钠四,使T1完成職責(zé)P1功能盗扒,T2完成職責(zé)P2功能跪楞。這樣缀去,當(dāng)修改類T1時(shí)侣灶,不會(huì)使職責(zé)P2發(fā)生故障風(fēng)險(xiǎn);同理缕碎,當(dāng)修改T2時(shí)褥影,也不會(huì)使職責(zé)P1發(fā)生故障風(fēng)險(xiǎn)。

4.職責(zé)擴(kuò)散

很多程序員都清楚自己編程時(shí)要遵循單一職責(zé)原則咏雌,但總是在不經(jīng)意間違反了這個(gè)原則凡怎。因?yàn)槟撤N原因,某一職責(zé)需要分化為粒度更細(xì)的多個(gè)職責(zé)了赊抖,這就是職責(zé)擴(kuò)散统倒。

5.例子

public interface ICar { 
    //品牌
    void setPinPai(String pinpai);
    void getPinPai();
    //顏色
    void setColor(String color);
    void getColor();
    //啟動(dòng)
    boolean Start(boolean start);
    //停車
    boolean Stop(boolean stop);
}
}

從上面例子中,我們不知道這個(gè)接口的具體職責(zé)是什么氛雪,有點(diǎn)模糊不清房匆。車子的品牌和顏色是車子的屬性,而啟動(dòng)和停車是車子的行為报亩,將車子的屬性和行為耦合到一個(gè)接口中浴鸿,給人一種結(jié)構(gòu)職責(zé)不清的感覺,對(duì)后期的維護(hù)帶來一定的麻煩弦追。

為了解決這個(gè)問題岳链,應(yīng)當(dāng)使用單一職責(zé)原則,將車子接口中的業(yè)務(wù)對(duì)象(屬性)和業(yè)務(wù)邏輯(行為)解耦劲件,分成兩個(gè)接口掸哑,如下:

/**
 * BO:Bussiness Object,業(yè)務(wù)對(duì)象  
 * 負(fù)責(zé)車子的屬性  
 * @author 葉漢偉
 */
public interface ICarBO {
    //品牌
        void setPinPai(String pinpai);
        void getPinPai();
        //顏色
        void setColor(String color);
        void getColor();
}
/**  
 * BL:Business Logic,業(yè)務(wù)邏輯  
 * 負(fù)責(zé)車子的行為  
 * @author 葉漢偉
 */ 
public interface ICarBL {
    //啟動(dòng)
    boolean Start(boolean start);
    //停車
    boolean Stop(boolean stop);
}

這樣就實(shí)現(xiàn)了接口的單一職責(zé)原則零远。他們各自有一個(gè)實(shí)現(xiàn)類CarBO苗分、CarBL。當(dāng)需要修改車子屬性的時(shí)候只需要對(duì)CarBO這個(gè)接口來修改遍烦,只會(huì)影響到CarBO這個(gè)類俭嘁,不會(huì)影響其他類。

6. 優(yōu)點(diǎn)

  1. 可以使得類的邏輯變得簡(jiǎn)單服猪,功能清晰供填。每個(gè)類只負(fù)責(zé)一個(gè)職責(zé),那么這個(gè)類的功能是非常清晰的罢猪,相比于有多個(gè)職責(zé)的類近她,單一職責(zé)的類的邏輯會(huì)更簡(jiǎn)單。
  2. 程序的可讀性和可維護(hù)性相對(duì)較強(qiáng)膳帕。
  3. 降低變更引起的風(fēng)險(xiǎn)粘捎,對(duì)系統(tǒng)擴(kuò)展性和維護(hù)性很有幫助薇缅。

但是,單一職責(zé)原則有時(shí)候會(huì)給我們帶來一些麻煩攒磨。如果職責(zé)太多的話泳桦,每個(gè)職責(zé)一個(gè)類,會(huì)造成類的數(shù)量過多娩缰,反而降低了代碼的可讀性和程序的可維護(hù)性灸撰。所以使用這個(gè)職責(zé)的時(shí)候還要具體情況具體分析。建議就是接口一定要采用單一職責(zé)原則拼坎,實(shí)現(xiàn)類的設(shè)計(jì)上盡可能做到單一職責(zé)原則浮毯,最好是一個(gè)原因引起一個(gè)類的變化。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末泰鸡,一起剝皮案震驚了整個(gè)濱河市债蓝,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌盛龄,老刑警劉巖饰迹,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異讯嫂,居然都是意外死亡蹦锋,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門欧芽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來莉掂,“玉大人,你說我怎么就攤上這事千扔≡髅睿” “怎么了?”我有些...
    開封第一講書人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵曲楚,是天一觀的道長(zhǎng)厘唾。 經(jīng)常有香客問我,道長(zhǎng)龙誊,這世上最難降的妖魔是什么抚垃? 我笑而不...
    開封第一講書人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮趟大,結(jié)果婚禮上鹤树,老公的妹妹穿的比我還像新娘。我一直安慰自己逊朽,他們只是感情好罕伯,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著叽讳,像睡著了一般追他。 火紅的嫁衣襯著肌膚如雪坟募。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,457評(píng)論 1 311
  • 那天邑狸,我揣著相機(jī)與錄音懈糯,去河邊找鬼。 笑死推溃,一個(gè)胖子當(dāng)著我的面吹牛昂利,可吹牛的內(nèi)容都是我干的届腐。 我是一名探鬼主播铁坎,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼犁苏!你這毒婦竟也來了硬萍?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤围详,失蹤者是張志新(化名)和其女友劉穎朴乖,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體助赞,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡买羞,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了雹食。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片畜普。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖群叶,靈堂內(nèi)的尸體忽然破棺而出吃挑,到底是詐尸還是另有隱情,我是刑警寧澤街立,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布舶衬,位于F島的核電站,受9級(jí)特大地震影響赎离,放射性物質(zhì)發(fā)生泄漏逛犹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一梁剔、第九天 我趴在偏房一處隱蔽的房頂上張望虽画。 院中可真熱鬧,春花似錦憾朴、人聲如沸狸捕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)灸拍。三九已至做祝,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鸡岗,已是汗流浹背混槐。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留轩性,地道東北人声登。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像揣苏,于是被迫代替她去往敵國(guó)和親悯嗓。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

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

  • 要走卸察, 就沒有停留的理由脯厨。 忘記家鄉(xiāng)的山川與河流, 跟朋友們醉生夢(mèng)死的酒坑质。 心里眼里卻長(zhǎng)滿了所謂的愁合武, 在離開的路...
    大狗少一閱讀 381評(píng)論 0 2
  • 人可以不認(rèn)字,但不可以不識(shí)人。樹高萬(wàn)丈不忘根巷波,人若輝煌莫忘恩萎津!這輩子,永遠(yuǎn)要記得感謝三種人:一抹镊,能跟你同甘共苦的人...
    李明信閱讀 883評(píng)論 0 1