知行

总结之后必有收获 开始使用

程序设计之 SOLID

SOLID 是单一职责原则(SRP),开闭原则(OCP),里氏替换原则(LSP),接口隔离原则(ISP)和依赖倒置原则(DIP)的缩写,指代了面向对象编程和面向对象设计的五个基本原则。原则是要比设计模式更基础更重要的指导准则,是面向对象设计的 Bible。深入理解后,会极大的提升我们的程序设计能力切实提高代码质量。

单一职责 (S)

对象应该仅具有一种功能, 单一职责可以看作是低耦合、高内聚在面向对象原则上的引申。功能变多将导致内聚性差,代码很难被复用,不能复用,只能复制,代码冗余,项目变乱。

开闭原则 (O)

设计应该是对于扩展开放的,但是对于修改封闭的。如 Elasticsearch 的 mapping 设计。
对扩展开放,意味着有新的需求时,可以对现有代码进行扩展,以适应新的情况。
对修改封闭,意味着类开发完成,就可以独立完成其工作,而不要对类进行任何修改。
一般使用接口继承实现方式来实现“开放”应对变化,在很多开源项目中我们可以看到除了接口外还有大量 abstract 修饰的抽象类。这也是开闭原则的一种体现。

里氏替换原则 (L)

LSP 是继承复用的基石,只有当子类可以替换掉基类,软件的功能不受到影响时,基类才能真正被复用,而子类也能够在基类的基础上增加新的行为。另外,不应该出现 if/else 之类对子类类型进行判断的条件。
里氏替换原则 LSP 是使代码符合开闭原则的一个重要保证,正是由于派生类型的可替换性才使得父类型的模块在无需修改的情况下就可以扩展。在很多情况下,在设计初期我们类之间的关系不是很明确,LSP 则给了我们一个判断和设计类之间关系的基准:需不需 要继承,以及怎样设计继承关系。
当一个子类的实例应该能够替换任何其超类的实例时,它们之间才具有 is-A 关系。继承对于 OCP,就相当于多态性对于里氏替换原则。子类可以代替基类,客户使用基类,他们不需要知道派生类所做的事情。这是一个针对行为职责可替代的原则,如果“绵羊”是“羊”的子类型,那么“绵羊”对象就应该在不改变任何抽象属性情况下替换所有“羊”对象。(is-A / has-A)

接口隔离原则 (I)

ISP 的一个定义是“使用多个专门的接口比使用单一的总接口要好”,通俗的讲就是“多个特定客户端接口要好于一个宽泛用途的接口”。一个接口代表一个角色,不应当将不同的角色都交给一个接口。没有关系的接口合并在一起,形成一个臃肿的大接口,这是对角色和接口的污染。(调用者只能访问它自己的方法,不能访问到不应该访问的方法。)

依赖倒置原则 (D)

DIP 是程序要依赖于抽象接口,不要依赖于具体实现。简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合。Spring 框架的“依赖注入”是该原则的一种实现方式。比如在 Java 应用中使用 logger 框架有很多选择:log4j,log4j2,logback 等,每个 logger 的 API 和用法都稍有不同,如果我们直接依赖了 logger 框架,应用和框架的耦合性很高。遵循下依赖倒置原则就可以很好的解决这个问题,一般情况下抽象的变化概率很小,让用户程序依赖于抽象,实现的细节也依赖于抽象(面向接口的编程)。即使实现细节不断变动,只要抽象不变,客户程序就不需要变化。这样应用和框架之间就解耦了,依赖和被依赖方都可以自由改动了。

组合优于继承

评论
留下你的脚步