01-单一职责原则(SPR)
1. 背景
? ??類T負責兩個不同的職責:職責P1,職責P2。當由于職責P1需求發生改變而需要修改類T時,有可能會導致原本運行正常的職責P2功能發生故障。
2. 定義
? ??不要存在多于一個導致類變更的原因。通俗的說,即一個類只負責一項職責。
3. 宏觀上
? ?類層次上存在單一職責原則,同樣方法層次上也存在單一職責原則。
4. 補充兩個概念
? ?高內聚:內聚是指類內部的屬性和行為,高內聚就是指:一個類的屬性和行為與這個類非常密切,稱為高內聚。
? ?低耦合:耦合是指類與類之間或者模塊與模塊之間的聯系,低耦合就是指:耦合度低,易重用、使用靈活。
5. 案例
需求一:有牛和羊兩種動物,它們都需要呼吸空氣。
? ? 解決思路:構造動物類,封裝呼氣空氣的方法。
1 public class Animal2 {3 public string myName { get; set; }4 5 private string _name = null;6 public Animal()7 {8 9 } 10 public Animal(string name) 11 { 12 this._name = name; 13 } 14 15 //封裝呼吸空氣的方法 16 public void BreathAir() 17 { 19 Console.WriteLine(this._name + "呼吸空氣"); 21 } 22 }需求變更:又多了魚這個物種,它們需要呼吸空氣。
? ?解決方案一:直接在BreathAir上加判斷,但是這樣違背了方法意義上的單一職責原則。
1 public void BreathAir()2 {3 if (this._name.Equals("魚"))4 {5 Console.WriteLine(this._name + "呼吸水"); //違背了方法級別的單一職責6 }7 else8 {9 Console.WriteLine(this._name + "呼吸空氣"); 10 } 11 }?解決方案二:在Animal類中添加一個BreathWater的方法,但是這樣違背了類意義上的單一職責原則。
1 //封裝呼吸水的方法 2 public void BreathWater() 3 { 4 Console.WriteLine(this._name + "呼吸水"); 5 }? ? ?解決方案三:新建一個WaterAnimal類,在里面封裝BreathWater的方法,無論是類級別還是方法級別,都滿足了單一職責原則,但是改動成本太大,耗時太長。
1 public class WaterAnimal2 {3 private string _name = null;4 public WaterAnimal(string name)5 {6 this._name = name;7 } 8 //封裝呼吸水的方法9 public void BreathWater() 10 { 11 Console.WriteLine(this._name + "呼吸水"); 12 } 13 }?綜合調用:
1 public static void show()2 {3 //下面模擬單一職責面對需求變更的情況。4 //需求1:有牛和羊兩種動物,它們需要呼吸空氣5 //解決思路:構造動物類→封裝呼吸空氣的方法6 Animal animal1 = new Animal("牛");7 Animal animal2 = new Animal("羊");8 animal1.BreathAir();9 animal2.BreathAir(); 10 11 //需求2:又多了魚這個物種,它們需要呼吸水 12 //解決方案一:在Breath里加判斷,但是違背了方法級別的單一職責原則 13 Animal animal3 = new Animal("魚"); 14 animal3.BreathAir(); 15 16 //解決方案二:在Animal類中添加一個BreathWater的方法,但是違背了類級別的單一職責原則 17 Animal animal4 = new Animal("魚"); 18 animal4.BreathWater(); 19 20 //解決方案三:新建一個WaterAnimal類,在里面封裝BreathWater的方法,無論是類級別還是方法級別,都滿足了單一職責原則,但是改動成本太大,耗時太長 21 WaterAnimal animal5 = new WaterAnimal("魚"); 22 animal5.BreathWater(); 23 24 }解決方案四:利用委托來解決。
1 /// <summary>2 /// 利用委托的插件式編程3 /// </summary>4 public static void show2()5 {6 Console.WriteLine("------------------下面是利用委托來解決--------------------");7 Animal animal1 = new Animal() { myName = "牛" };8 Animal animal2 = new Animal() { myName = "羊" };9 Animal animal3 = new Animal() { myName = "魚" }; 10 Action<Animal> act1 = Utils.BreathWater; 11 Action<Animal> act2 = Utils.BreathAir; 12 act1.Invoke(animal1); 13 act1.Invoke(animal2); 14 act2.Invoke(animal3); 15 }6. 單一職責原則的好處
(1). 降低類復雜性,一個類只負責一項職責要比負責多項職責簡單的多。
? ?(2).?提高類的可讀性,便于維護。
? ?(3).?變更引起的風險低,修改一個類的功能,顯著降低對其他類的影響。
7. 我的總結
? ??如果完全遵循單一職責原則,當業務復雜的時候,改動成本是最大的。所以我的原則是:根據實際業務場景,來決定是否違背方法或類層次上的單一職責原則。
總結
以上是生活随笔為你收集整理的01-单一职责原则(SPR)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【转】学习Entity Framewor
- 下一篇: 国债与地方债的区别,表现在这几个地方!