面向对象设计的SOLID原则

来源:互联网 发布:奥普和欧普哪个好 知乎 编辑:程序博客网 时间:2024/06/06 12:43

背景

面向对象编程强调的是可扩展性,那么我们要怎么设计才具有更好的扩展性呢?
SOLID原则是类级别的,面向对象的设计理念,它们与测试工具一起帮你改进腐坏的代码。SOLID由程序员们最喜欢的大叔 Robert C. Martin(Bob大叔)提出,它其实是五个其他缩略词的组合——SRP, OCP, LSP, ISP, DIP。

单一职责原则(SRP)

从面向对象角度解释这个原则为:”引起类变化的因素永远不要多于一个。” 或者说 “一个类有且仅有一个职责”。从代码开发的角度就是“高内聚”,即一个类只完成它应该完成的职责。

开闭原则(OCP)

面向修改封闭,面向扩展开放。“对扩展开放”指的是设计类时要考虑到新需求提出时类可以增加新的功能。“对修改关闭”指的是一旦一个类开发完成,除了改正bug就不再修改它。
开闭原则的最佳实践是采用接口实现,如果提出了新功能,如有必要,定义在新的接口中,并让当前的类实现该接口,这样旧的功能和代码都不需要修改。但是在需求的迭代开发中往往发现需要基于原有功能去添加新功能,这个时候就需要根据affected areas来保证“对修改封闭”,即保持原有的功能逻辑不变。

里氏替换原则(LSP)

所有使用子类的地方都可以用父类替换。适用于继承层次结构。
常见的违反LSP原则的类设计就是Rectangle和Square


public class Rectangle {

private double width;
private double height;

public void setWidth(double width) {
this.width = width;
}

public void setHeight(double height) {
this.height = height;
}

public double getHeight() {
return this.height;
}

public double getWidth() {
return this.width;
}

public double getPerimeter() {
return 2*width + 2*height;
}

public double getArea() {
return width * height;
}

}
public class Square extends Rectangle {

public void setWidth(double width) {
this.width = width;
this.height = width;
}

public void setHeight(double height) {
this.height = height;
this.width = height;
}

}


Square继承Rectangle是不合理的。

接口隔离原则(ISP)

接口隔离原则(Interface Segregation Principle)指出客户不应该被强迫依赖于他们不使用的接口。当我们使用非内聚的接口时,ISP指导我们创建多个较小的内聚度高的接口。
当你应用ISP时,类和他们的依赖使用紧密集中的接口通信,最大限度地减少了对未使用成员的依赖,并相应地降低耦合度。小接口更容易实现,提升了灵活性和重用的可能性。由于很少的类共享这些接口,为响应接口的变化而需要变化的类数量降低,增加了鲁棒性。

依赖反转原则(DIP)

高层模块不应该依赖底层模块,二是依赖低层模块的抽象(接口)
这里写图片描述

面向接口编程,不要面向实现编程。

参考:
面向对象设计原则和创建SOLID应用的5个方法
怎样设计Rectangle和Square类才能使之满足OOP的Liskov substitution原则

原创粉丝点击