JAVA代碼設計六大原則之單一職責

What
  就一個類(接口涯竟、結構體赡鲜、方法等等)而言,應該僅有一個引起它變化的原因庐船。

Why

軟件設計真正要做的許多內容银酬,就是發(fā)現職責并把那些職責互相分離。單一職責原則可以使類的復雜度降低筐钟,實現什么職責都有清晰明確的定義捡硅;類的可讀性提高,復雜度降低(復雜度降低肯定可讀性提高)盗棵;可讀性提高了壮韭,代碼就更容易維護;變更(需求是肯定會變的纹因,程序員都知道)引起的風險(包括測試的難度喷屋,以及需要測試的范圍)降低。

How

需求:實現拍照和播放音樂瞭恰,那先定義兩個功能接口

    //具有照相的功能的接口
    interface IPhotograph
    {
        void Photograph();
    }
   //具有播放音樂功能的接口
    interface IPlayMusic
    {
        void PlayMusic();
    }

不遵循單一原則的設計屯曹,播放音樂及拍照功能的改變都會引起變化

  //實現照相、播放音樂的手機類
    public class MobilePhone : IPhotograph, IPlayMusic
    {
        //拍照
        public void Photograph()
        {
            Console.WriteLine("拍照片");
        }

        //播放音樂
        public void PlayMusic()
        {
            Console.WriteLine("播放音樂");
        }
    }
  class Program
    {
        static void Main(string[] args)
        {
            IPlayMusic musicPlayer;
            IPhotograph photographer;

            MobilePhone phone = new MobilePhone();
            musicPlayer = phone;
            photographer = phone;
         
            //播放音樂
            musicPlayer.PlayMusic();
            //拍照
            photographer.Photograph();
            Console.ReadLine();
        }
    }

遵循單一原則的設計,引發(fā)改變的只有播放音樂功能的變化

    //實現播放音樂功能的音樂播放器類
    class MusicPlayer : IPlayMusic
    {
        public void PlayMusic()
        {
            Console.WriteLine("播放音樂");
        }
    }

遵循單一原則的設計恶耽,引發(fā)改變的只有攝像功能的變化

    //實現照相功能的攝像機類
    class Carmera : IPhotograph
    {
        public void Photograph()
        {
            Console.WriteLine("拍照片");
        }
    }
class Program
    {
        static void Main(string[] args)
        {
            IPlayMusic musicPlayer;
            IPhotograph photographer;

            //MobilePhone phone = new MobilePhone();
            //musicPlayer = phone;
            //photographer = phone;

            musicPlayer = new MusicPlayer();
            photographer = new Carmera();

            //播放音樂
            musicPlayer.PlayMusic();
            //拍照
            photographer.Photograph();
            Console.ReadLine();
        }
    }

糟糕的設計會造成什么樣的后果呢密任?讓我們來設想一下,有一天我們的需求發(fā)生了變化(需求變化-程序員一生的敵人兼朋友)偷俭,現有擁有了一部手機浪讳,有拍照的功能以及播放音樂的功能,滿足了現有的需求涌萤,突然有一天覺得簡單的拍照功能已經不能滿足了淹遵,

現在需要能夠拍攝高清圖片的照相功能,那么怎么辦呢负溪?換手機唄透揣,恩找一個支持高清拍照功能的手機。那么好的川抡,需求又變了辐真,現在想要能播放高品質音樂的功能,但是新換的支持高清拍攝的手機的硬件不支持高品質音樂播放崖堤,好的侍咱,繼續(xù)換手機,前提是還要

支持拍攝高清照片倘感。相信現在已經能夠看出一些端倪了放坏,這兩個職責無論哪一個發(fā)生了變化,你都要去改變手機老玛,現在只有兩個職責淤年,夸張一點說,如果有十個職責呢蜡豹?那么豈不是要天天換手機麸粮,要么就不滿足需求變化。

既然我們看到了糟糕的設計镜廉,現在我們回到單一職責上弄诲,既然你的需求是拍照片和播放音樂,那么我給你一臺相機還有一臺音樂播放器娇唯,哪個功能需要改變你就換哪個齐遵,以后你要換的時候也不必去考慮其他功能,只需要關心引起你自己變化的原因塔插。如果拍照

功能發(fā)生改變梗摇,我們就去改變照相機,播放音樂功能需要改變我們就去改變音樂播放器想许。我們不需要去考慮播放高品質音樂是不是會對拍攝高清圖片的功能造成影響伶授。

我們一定要遵循單一職責原則嗎断序?在現有的需求上能做到當然可以去做,但是往往有的時候糜烹,需求不是在設計的時候發(fā)生改變违诗,而是一定程度之后,你已經有了一定的代碼量了疮蹦,可能修改的開銷很高诸迟,這個時候就仁者見仁智者見智。就如上述挚币,若是將手機類

拆分亮蒋,則影響了底層調用的實現扣典,也需要修改妆毕,弱是調用的地方太多,那么修改的地方也會很多贮尖,若是發(fā)布了笛粘,改起來也不是很方便,但是當然湿硝,也有一定的手法來做這件事情薪前,比如手機類保留,讓手機類擁有一個攝像機類對象和一個音樂播放器類對象关斜,然后播放

音樂方法則調用音樂播放器類實例的播放音樂功能示括,照相功能則調用攝像機類實例的照相功能,這樣可以在不影響原有的東西的基礎上又遵循原則痢畜。

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末垛膝,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子丁稀,更是在濱河造成了極大的恐慌吼拥,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件线衫,死亡現場離奇詭異凿可,居然都是意外死亡,警方通過查閱死者的電腦和手機授账,發(fā)現死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門枯跑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人白热,你說我怎么就攤上這事敛助。” “怎么了棘捣?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵辜腺,是天一觀的道長休建。 經常有香客問我,道長评疗,這世上最難降的妖魔是什么测砂? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮百匆,結果婚禮上砌些,老公的妹妹穿的比我還像新娘。我一直安慰自己加匈,他們只是感情好存璃,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著雕拼,像睡著了一般纵东。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上啥寇,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天偎球,我揣著相機與錄音,去河邊找鬼辑甜。 笑死衰絮,一個胖子當著我的面吹牛,可吹牛的內容都是我干的磷醋。 我是一名探鬼主播猫牡,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼邓线!你這毒婦竟也來了淌友?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤褂痰,失蹤者是張志新(化名)和其女友劉穎亩进,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體缩歪,經...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡归薛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了匪蝙。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片主籍。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖逛球,靈堂內的尸體忽然破棺而出千元,到底是詐尸還是另有隱情,我是刑警寧澤颤绕,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布幸海,位于F島的核電站祟身,受9級特大地震影響,放射性物質發(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

推薦閱讀更多精彩內容