单一职责原则(SRP:Single Responsibility Principle)数据库
定义:应该有且仅有一个缘由引发类的变动。
优势:编程
- 类的复杂性下降;
- 可读性提升;
- 可维护性提升;
- 变动引发的风险下降。
建议:接口必定要作到单一职责,类的设计尽可能作到只有一个缘由引发变化。设计模式
里氏替换原则(LSP:Liskov Substitution Principle)
定义:全部引用基类的地方必须能透明地使用其子类对象。函数
四层含义:spa
- 子类必须彻底实现父类的方法
- 子类能够有本身的个性
- 覆盖或实现父类的方法时输入参数能够被放大(子类参数是父类参数的基类)注:使用此规则重载父类函数,避免替换后调用子类方法,而不符合用户预期
- 覆盖或实现父类的方法时输出参数能够被缩小(子类返回值是父类返回值的派生类)注:参数列表相同时使用此规则构成重写,符合预期;不一样时构成重载,同上
建议:设计
类中调用其余类时,务必使用父类或接口;不然说明违背了此原则。对象
若子类不能完整地实现父类的方法,则建议断开父子继承关系,采用依赖、汇集、组合等关系替代继承。继承
依赖倒置原则(DIP:Dependence Inversion Principle)
三层含义:接口
- 模块间的依赖经过抽象产生,实现类之间不发生依赖关系,其依赖是经过接口或抽象类产生的;
- 接口或抽象类不依赖于实现类;
- 实现类依赖接口或抽象类。
简而言之:面向接口编程事务
抽象是对实现的约束,对依赖者而言,也是一种契约,目的是保证全部细节不脱离契约的范畴。
依赖的三种写法:
- 构造函数传递依赖对象(构造函数注入)
- Setter方法传递依赖对象(Setter依赖注入)
- 接口声明依赖对象(接口注入)
建议:
- 每一个类尽可能有接口或抽象类
- 变量的表面类型尽可能是接口或抽象类
- 任何类都不该该从具体类派生
- 尽可能不要覆写基类的方法
- 结合里氏替换原则使用
关于【倒置】:
“正置”:面向实现编程,开车依赖车,使用电脑依赖电脑。
根据系统设计的须要产生了抽象间的依赖,替代了人们传统思惟中事务间的依赖,“倒置”就是从这里产生的。
接口隔离原则(Interface Segregation Principle, ISP)
定义:客户端不该该依赖它不须要的接口。一个类对另外一个类的依赖应该创建在最小的接口上。(接口尽可能细化,同时接口中的方法尽可能少。)
四层含义:
- 接口要尽可能小:根据接口隔离原则拆分接口时,首先必须知足单一职责原则。
- 接口要高内聚:减小对外的交互,尽可能少公布public方法。
- 定制服务:只提供访问者须要的方法
- 接口设计是有限度的:接口设计注意适度,控制粒度与复杂度的平衡
迪米特法则(Law of Demeter,LoD/Least Knowledge Principle,LKP)
定义:一个对象应该对其余对象有最少的了解。
四层含义:
- 只和朋友交流:耦合的关系-组合、聚合、依赖等(方法实现时尽可能不引入一个类中不存在的对象)
- 朋友间也是有距离的:合理运用封装性,封装过分细化的接口做为public方法暴露给朋友
- 是本身的就是本身的:若是一个方法能够放在本类中,既不增长类间关系,也不对本类产生负面影响,那就放在本类中。
- 谨慎使用Serializable(序列化)
核心:
类间解耦,弱耦合。但过分使用会产生大量中转或跳转类,需反复权衡找到平衡点,跳转次数尽可能控制在两次之内。
开闭原则(Open Closed Principle, OCP)
定义:软件中的对象(类,模块,函数等等)应该对于扩展是开放的,可是对于修改是封闭的。
优势:
如何使用
- 抽象约束:不容许出现抽象类中不存在的public方法;参数类型、引用对象尽可能使用抽象类,而不是实现类;抽象层尽可能保持稳定。
- 元数据控制模块行为:从文件或数据库中获取元数据
- 制定项目章程
- 封装变化:将相同的变化封装到一个抽象类中;将不一样的变化封装到不一样的抽象类中。
总结
SRP:单一职责原则
OCP:开闭原则
LSP:里氏替换原则
LoD:迪米特法则
ISP:接口隔离原则
DIP:依赖倒置原则
将六大原则首字母连接,就是SOLID(稳定的),创建稳定、灵活、健壮的设计,开闭原则是其余5大原则的精神领袖。
开闭原则是一个终极目标,任何人都没法百分百作到,咱们只是尽可能去朝这个目标去作,实际工做时也要结合具体状况。
参考文献:《设计模式之禅》--秦小波