物件導向SOLID-Single Responsibility Principle

  • 144
  • 0

就一個類別而言,應該僅有一個引起它變化的原因

先來說一個例子

這個開關違反了單一職則原則

他是電燈的開關,同時又會影響到電梯!?

我只是想省電關燈,結果有5個人被我順手關在電梯裡了

他同時擔任了電燈的職責與電梯的職責

就一般人的想法就會覺得不合理,但是在寫程式上就可能會寫出這種程式

喔~反正都是開關麻~幹嘛計較這麼多

這樣的偷懶就會影響到未來程式維護困難

像是這個實體開關,他線都已經接好了才亡羊補牢,貼一張警告的紙

要是一開始把燈和電梯的開關分開就可以免除後續的種種困擾(也不會有人被困在電梯內)

程式 : 

把這個開關變成程式,這是一個超級開關,可以同時控制燈和電梯

    public class SuperSwitch
    {
        public void TurnOn()
        {
            Console.WriteLine("開燈嚕");
            Console.WriteLine("電梯運轉");
        }

        public void TurnOff()
        {
            Console.WriteLine("關燈嚕");
            Console.WriteLine("電梯停止");
        }
    }

內心小劇場Part1

        static void Main(string[] args)
        {
            SuperSwitch superSwitch = new SuperSwitch();
            superSwitch.TurnOn();
            Console.WriteLine("5人進電梯準備下樓");
            Console.WriteLine("路人甲 : 電燈好浪費電,關一個");
            superSwitch.TurnOff();
            Console.WriteLine("電梯內五人 : !@#$^@#$!");
            Console.WriteLine("路人甲 : 關燈錯了嗎?");
            Console.ReadLine();
        }

結果 : 

 

這樣是不是很困擾!?

 

小小修改一下

將個開關分開

    public class LightSwitch
    {
        public void TurnOn()
        {
            Console.WriteLine("開燈嚕");
        }
        public void TurnOff()
        {
            Console.WriteLine("關燈嚕");
        }
    }

    public class ElevatorSwitch
    {
        public void TurnOn()
        {
            Console.WriteLine("電梯運轉");
        }
        public void TurnOff()
        {
            Console.WriteLine("電梯停止");
        }
    }

 

內心小劇場Part2

        static void Main(string[] args)
        {
            LightSwitch lightSwitch = new LightSwitch();
            ElevatorSwitch elevatorSwitch = new ElevatorSwitch();
            lightSwitch.TurnOn();
            elevatorSwitch.TurnOn();
            Console.WriteLine("5人進電梯準備下樓");
            Console.WriteLine("路人甲 : 電燈好浪費電,關一個");
            lightSwitch.TurnOff();
            Console.WriteLine("路人甲 : 省電救地球");
            Console.WriteLine("電梯 : 一樓到了,億勞告阿,蟻樓兜勒");

            Console.ReadLine();
        }

結果 : 

又能省電救地球,又能讓大家順利下樓,這樣不是很棒嘛!?!?

不過代價呢?

現實生活上要改變必須要重新接線阿,配電阿~

程式呢? 分開就好了

 

把功能寫再一起的人不是沒經過思考就寫的人就是懶惰的人

 

新手發文,如有錯誤請不吝嗇指教,謝謝。