核心思想:一个类应该只有一个发生变化的原因。所谓职责是指类变化的原因。如果一个类有多于一个的动机被改变,那么这个类就具有多于一个的职责。而单一职责原则就是指一个类或者模块应该有且只有一个改变的原因。
问题由来:T负责两个不同的职责:职责P1,职责P2。当由于职责P1需求发生改变而需要修改类T时,有可能会导致原本运行正常的职责P2功能发生故障。也就是说职责P1和P2被耦合在了一起。
补充说明:
高内聚:内聚是指类内部的属性和行为,高内聚就是指:一个类的属性和行为与这个类非常密切,称为高内聚。
低耦合:耦合是指类与类之间或者模块与模块之间的联系,低耦合就是指:耦合度低,易重用、使用灵活。
单一职责优点:
(1)降低类的复杂度;
(2)提高类的可读性,提高系统的可维护性;
(3)降低变更引起的风险(降低对其他功能的影响)。
单一职责实现:
1 public class Animal 2 { 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 else 8 { 9 Console.WriteLine(this._name + "呼吸空气"); 10 } 11 }
新建一个WaterAnimal类,在里面封装BreathWater的方法
1 public class WaterAnimal 2 { 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 }
总结:
单一职责虽然能够实现解耦,但是当业务比较复杂的时候,过多的单一职责类可能会导致改动成本最大,所以需要根据需求灵活应用。