单一职责原则
软件设计模式(Design pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。
设计模式的六大原则:面向对象语言开发过程中,推荐的一些指导性原则;没有明确的招数,而且也会经常被忽视/违背;也是前辈总结,也是为了站在前辈的肩膀上。
单一职责原则(SRP):一个类只做一件事儿,一个方法也应该只做一件事儿.
如下代码就违背了单一职责原则
public class Animal { public string _Name = string.Empty; public Animal(string Name) { this._Name = Name; } public void Eat() { if (this._Name.Equals("熊猫")) Console.WriteLine("这个动物吃竹子"); else if(this._Name.Equals("猫头鹰")) Console.WriteLine("这个动物吃虫子"); } public void Action() { if (this._Name.Equals("熊猫")) Console.WriteLine("这个动物可以跑"); else if (this._Name.Equals("猫头鹰")) Console.WriteLine("这个动物可以飞"); } }
static void Main(string[] args) { { Animal animal = new Animal("熊猫"); animal.Eat(); animal.Action(); } { Animal animal = new Animal("猫头鹰"); animal.Eat(); animal.Action(); } Console.ReadKey(); }
几乎每加一个动物就要加一个分支... ...
将职责进行拆分,重构代码
public abstract class Animal { protected string _Name = string.Empty; public Animal(string Name) { this._Name = Name; } public abstract void Eat(); public abstract void Action(); }
/// <summary> /// 每个类做自己的事儿 /// </summary> public class AnimalOwl : Animal { public AnimalOwl(string Name) : base(Name) { } public override void Eat() { Console.WriteLine($"{this._Name}吃虫子"); } public override void Action() { Console.WriteLine($"{this._Name}可以飞"); } }
/// <summary> /// 每个类做自己的事儿 /// </summary> public class AnimalPanda : Animal { public AnimalPanda(string Name) : base(Name) { } public override void Eat() { Console.WriteLine($"{this._Name}吃竹子"); } public override void Action() { Console.WriteLine($"{this._Name}可以跑"); } }
static void Main(string[] args) { { Animal animal = new AnimalPanda("熊猫"); animal.Eat(); animal.Action(); } { Animal animal = new AnimalOwl("猫头鹰"); animal.Eat(); animal.Action(); } Console.ReadKey(); }
拆分之后,职责变的单一。阅读简单,易于维护。扩展升级,减少修改,直接增加类。简单--稳定--强大。
单一职责的成本:类变多了,上端需要了解更多的类。要衡量着使用:如果类相对稳定,扩展变化少而且逻辑简单,违背单一职责也没关系。
如果一个类承担的职责过多,这些职责在程序中就会过度耦合,不利于扩展。
总结:
方法层面:方法里有多个分支(if{} else{}),还可能扩展变化,最好拆成多个方法。 接口层面:将不同业务的接口进行独立。 类层面:一个类只做一件事儿。 类库层面:把项目拆分为多个类库。 项目:一个项目应该职责要清晰(客户端/管理后台/后台服务/定时任务/... ...) 系统:将各服务承担的不同功能拆分为独立系统(IP定位/日志/在线统计)