面向对象设计的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原则
- 面向对象的设计的SOLID原则
- 面向对象设计的SOLID原则
- 面向对象设计的SOLID原则
- 面向对象设计的SOLID原则
- 面向对象设计的SOLID原则
- 面向对象设计的SOLID原则
- 【整理】面向对象设计的SOLID原则
- 面向对象设计的SOLID原则
- 面向对象设计的SOLID原则
- 【搬运】面向对象设计的SOLID原则
- 面向对象设计的SOLID原则
- c++面向对象设计的SOLID原则
- 面向对象设计的SOLID原则
- 面向对象设计的SOLID原则
- 面向对象设计的SOLID原则
- 面向对象设计的SOLID原则
- 面向对象设计的SOLID原则
- 面向对象设计的SOLID原则
- Elastic Search系统学习之一: 入门
- 深入理解line-height与vertical-align
- Java的重写
- Hibernate查询总结
- java线程池
- 面向对象设计的SOLID原则
- python3之输入输出格式
- continue语句
- 给深度学习入门者的Python快速教程
- 背包入门--多重背包 hd 2079
- mysql两表间select/update/delect
- 指针
- 2014年good fellow提出GANs论文译本
- 讲解.NET 集合中使用Count属性和扩展方法Count<T>()区别