实现一个功能有很多种方式,但是不管是用什么方式,逻辑是不会变的。
"万变不离其宗,以不变应万变。"
在开发过程中,养成良好的代码规范是很有必要的。遵循代码规范就好像给了一个标准,只要按照这个标准来实现功能,不仅代码的可读性强,代码维护起来也是很容易,甚至还可以提高开发团队协作减少潜在的错误。
C# 是面向对象设计编程,面向对象编程有五个基本原则简称(SOLID原则)。规范SOLID原则就是为了提高软件设计的可维护性、灵活性达到代码复用的效果。
什么是SOLID原则?
SOLID是每个原则的英文首字母缩写。
原则一:单一职责原则(Sigle Responsibility Principle)简称S。
定义:一个类应该仅有一个引起它逻辑修改的原因。
这就规范了一个类只有一个职责功能,如果一个类承担了太多的职责,当需求发生改变时,这个类就要频繁进行修改。
原则二:开闭原则(Open Close Principle)简称O。
定义:对类、模板、函数等应该对扩展开发,对修改关闭。
这样要求当需求发生变化时,可以通过添加新的代码来进行扩展新的变化,而不是修改现有的代码。
原则三:里氏替换原则(Liskov Substitution Principle)简称L。
定义:子类型必须做到能够替换其父类型。
要求任何基类出现的地方,子类都可以出现,而且使用者不需要知道这个子类就能使用。
原则四:接口隔离原则(Interface Segregation Principle)简称I。
定义:客户端不应该依赖它不使用的接口。
因为C# 可以继承多个接口,这个原则要求一个类不应该滥用继承不需要的接口,应该需要什么就继承什么,只需达到功能,只实现需要的接口。
原则五:依赖倒置原则(Dependency Inversion Principle)简称D。
定义:高层模块不应该依赖低层模块,两者都应该依赖抽象;抽象不应该依赖细节,细节应该依赖抽象。只要通过接口或者抽象类来实现功能就可以遵循依赖倒置原则。
值得注意的是,这五个原则应该协同作用,在开发中应该尽可能满足这几个原则,以构建出高质量的程序。
看看这个例子:
写一个汽车种类的程序。
分析:
汽车有本田、丰田、奔驰、宝马、奥迪...
每种汽车有不同的引擎、颜色....
每种汽车都有启动和停止两个动作。
using System;namespace A_CarJob{internal class Program{static void Main(string[] args){Benz benz = new Benz("Red");benz.Drive();Console.ReadKey();}}class Benz{public string color { get; set; }BenzEngine benzEngine = new BenzEngine();BenzColor benzColor = new BenzColor();public Benz(string color){this.color = color;}public void Drive(){benzColor.ShowColor(color);benzEngine.Run();benzEngine.Stop();}}class BenzEngine{public void Run(){Console.WriteLine("Benz Running...");}public void Stop(){Console.WriteLine("Benz Stoped.");}}class BenzColor{public void ShowColor(string color){Console.WriteLine($"{color} Benz");}}class Honda{public string color { get; set; }HondaEngine hondaEngine = new HondaEngine();HondaColor hondaColor = new HondaColor();public Honda(string color){this.color = color;}public void Drive(){hondaColor.ShowColor(color);hondaEngine.Run();hondaEngine.Stop();}}class HondaEngine{public void Run(){Console.WriteLine("Honda Running...");}public void Stop(){Console.WriteLine("Honda Stoped.");}}class HondaColor{public void ShowColor(string color){Console.WriteLine($"{color} Honda");}}}
输出:
Red Benz
Benz Running...
Benz Stoped.
如果这样设计代码,确实是实现了单一职责,但是代码就显得非常臃肿,每添加一个种汽车类实现相同的逻辑都要添加好几个类(发动机,颜色...)
最后的结果就是"类爆炸"。
如何避免类爆炸?
找规律,找出相同的东西,封装起来(实现抽象)这就是依赖倒置原则。
抽象不应该依赖细节,细节应该依赖抽象。
汽车发动机、汽车颜色等等这种所有汽车都拥有的东西就是规律性的,只要相同的(行为,属性)都是可以抽象出来。
实现抽象:
using System;namespace A_CarJob{internal class Program{static void Main(string[] args){Benz benz = new Benz("Red", "Benz");benz.Drive();Console.ReadKey();}}class Benz: CarColor{public string color { get; set; }public string name { get; set; }public Benz(string color, string name){this.color = color;this.name = name;}public override void Run(){Console.WriteLine($"{name} Running...");}public override void Stop(){Console.WriteLine($"{name} Stop.");}public override void ShowColor(string color){Console.WriteLine($"{color},{name}");}public void Drive(){ShowColor(color);Run();Stop();}}public abstract class CarEngine{public abstract void Run();public abstract void Stop();}public abstract class CarColor: CarEngine{public abstract void ShowColor(string color);}class Honda : CarColor{public override void Run(){throw new NotImplementedException();}public override void ShowColor(string color){throw new NotImplementedException();}public override void Stop(){throw new NotImplementedException();}}}
你体会到代码的优雅性了吗?如需添加不同的汽车类只要继承抽象类(CarEngine和CarColor)就可以实现相同的逻辑。CarEngine和CarColor只需要写一次其他类都可以继承它们的属性和行为,做到了代码复用。
注意封装抽象的必备两个条件:
1、相同的,每个实体共有的属性或行为。
2、具有稳定性的,不会随意更改的属性和行为。
这个五个原则规范不需要要死记硬背,在代码编写时多尝试动手实践。在这五个原则的基础还可以深入了解23种软件设计模式。理解其实现的逻辑原理,相信可以助你构建更加清晰和灵活的代码。
有阅读原文:https://mp.weixin.qq.com/s/j8eQMJ88ImbkS2qIHhiNAA
该文章在 2026/1/26 18:41:28 编辑过