一、开闭原则(是面向对象开发中最基础的原则,它指导建立更加稳定灵活的系统)
开闭原则是对扩展和修改行为的一个原则,指的是软件中的函数、类、模块应该对扩展开放,对修改关闭。强调的是用抽象构建框架,用实现扩展细节。常用于解决的问题如:更新版本时,尽量在不修改源代码,但增加新功能。
二、依赖倒置
依赖倒置是指设计系统代码结构时,高层模块不依赖底层模块,它们都应依赖于其抽象。细节应该依赖抽象。通过依赖倒置,可减少系统之间模块的耦合性,提高系统的稳定性,提高系统的可读性与可维护性,降低修改程序带来的风险。
ps:以抽象为基准设计的架构要比以细节为基准设计的架构稳定很多。所以在拿到需求时,要面向接口编程,先顶层再细节来设计代码结构。
依赖有依赖注入(最常用)、构造方法注入(单例不可用)、setter注入(单例多用)。
三、单一职责原则
是指一个类只负责一个功能,不要存在多余一个导致类变更的原因。假设一个类负责两个职责,修改一个可能会影响另一个功能发生故障。只负责一个类可降低类的复杂度,提高类的可读性,提高系统的可维护性,降低变更引起的风险。
四、接口隔离原则
是指用多个专门的接口,而不是使用单一的总接口,客户端不应该依赖他不需要的接口。这个原则指导我们在设计接口时应注意以下几点:
1.一个类对一个类的依赖应该建立在最小的基础上
2.建立单一接口,不应建立臃肿的接口。
3.细化接口功能,每个接口内方法要尽量少(不是越少越好,要适度)
接口隔离原则符合我们所说的“高内聚,低耦合”的思想,从而使类具有很好的可维护性、可读性、可扩展性。我们在设计接口时,要多花时间去思考业务模型,包括以后可能要修改的还要去做一些预判。所以,对于抽象,对业务模型的理解是最重要的。
五、迪米特法则
是指一个对象应该保持对其他对象最少的了解,也叫最少了解法则,尽量降低类与类之间的耦合。它强调之和朋友交流,不和陌生人说话。如类中的成员变量、函数参数、函数返回值都是朋友,函数内部的对象是陌生人。
六、里氏替换原则
里氏替换原则可以理解为一个软件实体如果能适用父类的话,一定也能适用子类。所有能引用父类的地方都能透明的使用子类对象。子类可替换父类对象而使程序逻辑不变。引申为:子类可扩展父类的方法,但不能覆盖父类原有的功能。
总结为:1.子类可以实现父类的抽象方法,但不能父类的非抽象方法。
2.子类可增加自己特有的方法。
3.当子类的方法重载父类的方法时,子类的前置参数(入参)相比父类更宽松。
4.当子类的方法重载父类的方法时,子类的后置参数(函数返回值)相比父类更严格或相等。
七、合成复用原则
指尽量使用对象组合、聚合,而不是继承来实现软件复用的目的。这样可以使类更加灵活、降低类与类之间的耦合度。
继承叫白箱复用,会将父类的实现细节全部暴露给子类。合成复用叫黑箱复用,对类以外是无法获取到实现细节的。
总结:
我们在写代码时,要根据实际情况(人力、时间、成本)综合考虑,不需刻意追求完美,要在适当的场景考虑设计原则,体现的是一种平衡取舍,来帮助我们设计出更优雅的代码结构。