开闭原则
说到面向对象设计,大部分人脑海中闪过的恐怕都是“23种设计模式”。设计模式代表的是业务场景中总结出的最佳实现方式,属于实践的范畴,在其之上是更为重要的“SOLID”五大原则:
- Single Responsibility Principle 单一责任原则
- The Open Closed Principle 开放封闭原则
- The Liskov Substitution Principle 里氏替换原则
- The Dependency Inversion Principle 依赖倒置原则
- The Interface Segregation Principle 接口分离原则
SOLID 五大原则的出发点也是软件工程的终极目标:“高内聚、低耦合”。在后端开发中运用最多的是“依赖倒置原则”,与其相关的设计模式大约有5-6个。如下图所示:
上图也可以理解为从抽象概念到具体实践的逐步演进。
在前端技术框架中,运用最多的是“开放封闭原则”,我们先来看一下这条原则是怎么定义的:
A software artifact should be open for extension but closed for modification.
翻译过来就是:软件系统应当对扩展开放,对修改封闭(感觉像没说)。这里举一个简单的例子来说明开闭原则,先帮助大家理解概念:
public abstract class Shape
{
public abstract double Area();
}
public class Rectangle: Shape
{
public double Width
{
get;
set;
}
public double Height
{
get;
set;
}
public override double Area()
{
return Width * Height
}
}
public class Circle: Shape
{
public double Radius
{
get;
set
}
public override double Area()
{
return Radius * Radius * PI;
}
}
public double Area(Shape [] shapes)
{
doubel area = 0;
foreach (var shape in shapes)
{
area += shape.Area();
}
return area;
}
上例中无论场景如何扩展,Area 函数都无需修改,每个 Shape 类通过继承接口和多态特性,各自实现面积计算。
总结一下开闭原则就是:软件系统的核心逻辑都不应该轻易改变,否则会破坏系统的稳定性和增加测试成本。我们应当建立合适的抽象并统一接口,当业务需要扩展时,我们可以通过增加实体类来完成。