初窥SOLID设计原则
为什么要使用设计原则
在软件开发中,为了提高软件系统的可维护性和可复用性,增加软件的可拓展性和灵活性,我们要尽量根据设计原则来开发程序,从而提高软件开发效率,节约软件开发成本和维护成本。
单一职责原则(SRP)
简单的来说就是一个类/接口/方法只负责一项职责
开闭原则(OCP)
软件实体应当对扩展开放,对修改关闭。简单来说就是尽量实现在新增功能的时候不修改已经写好的代码,实现一个热插拔的效果,类似于USB一样
个人理解:在根据业务设计模型对象时,可以不设计的那么完美,只按照需求设计对应的属性或方法即可,如新增需求的话,只需要继承原有对象,并实现需求,从而实现一个更细致化的模型
里式替换原则(LSP)
任何基类可以出现的地方,子类一定可以出现,通俗来讲:子类可以拓展父类的功能,但不能改变父类原有的功能,也就是说子类继承父类时,除添加新的方法完成新增功能时,尽量不要重写父类的方法
接口隔离原则(ISP)
客户端不应该被迫依赖于它不使用的方法,一个类对另一个类的依赖应该建立在最小的接口上,也就是说要为各个类建立他们需要的专用接口,而不要试图去建立一个很庞大的接口供所有依赖它的类去调用
单一职责原则主要是约束类,它针对的是程序中的实现和细节。接口隔离原则主要约束接口,主要针对抽象和程序整体框架的构建
依赖倒置原则(DIP)
高层模块不应该依赖低层模块,两者都应该依赖其抽象,抽象不应该依赖细节,细节应该依赖抽象。总而言之就是要面向接口编程,不要面向实现编程
迪米特法则
如果两个软件实体无须直接通信,那么就不应当发生直接的相互调用,可以通过第三方转发该调用。目的是为了降低类之间的耦合度,提高模块的相对独立性。
合成复用原则
在代码复用时,要尽量先试用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现
通常类的复用分为继承复用和合成复用两种
继承复用虽然有简单和易实现的优点,但它也存在以下缺点:
- 继承复用破坏了类的封装性,因为继承会将父类的实现细节暴露给子类,父类对子类是透明的,所以这种复用又称为白箱复用
- 子类与父类的耦合度高,父类的实现有任何改变都会导致子类的实现发生变化,这不利于类的扩展与维护
- 它限制了复用的灵活性,从父类继承过来的实现是静态的,在编译时就已经定义,所以在运行时不可能发生变化
采用组合或聚合复用时,可以将已有对象纳入新对象中,使之成为新对象的一部分,新对象可以调用已有对象的功能,它有以下优点
- 它维持了类的封装性,因为成分对象的内部细节是新对象看不见的,所以这种复用又称为黑箱复用
- 对象间的耦合度低,可以在类的成员位置声明抽象
- 复用的灵活度高,这种复用可以在运动时动态进行,新对象可以动态的引入与成分对象相同的对象