乐趣区

关于编程:5-幅插图-让你轻松看懂面向对象编程的SOLID原则

如果你相熟面向对象的编程,那么可能曾经据说过 SOLID 原理。
SOLID 是针对面向对象编程和设计的五大依赖关系治理,每个字母代表另外一个三个字母的首字母缩写,用来形容一个准则。这五项软件开发准则是构建软件时要遵循的准则,以便于零碎扩大和保护。这项准则失去软件工程师 Robert C. Martin 的同意。
在其余网站上有太多对于 SOLID 的精彩文章,但我很少看到带有图片的示例,这使得像我这样青睐用图片记忆的人在学习上变得有些艰难。
因而,本文的次要目标是通过插图强调每种原理的指标,帮忙大家更好地了解这些原理。
你可能会看到,其中一些准则看起来很类似,但它们的指标并不相同。留神!你大能够违反一个准则来满足另一个准则。
为了使此操作更简单明了,我将应用“Class”一词,但请留神,本文中它也能够作为主体利用于函数、办法或模块。
当初,让咱们开始吧!
S —Single Responsibility(繁多责任)
Class 应负繁多责任。

图释:

  • 谬误示范——我是一名厨师、园丁、画家和司机;
  • 正确做法——四个 Class 别离负责厨师、园丁、画家和司机。

如果一个 Class 承当许多职责,便会减少产生谬误的可能性,因为对其中一个 Class 进行更改可能会在您不知情的状况下影响其余角色。
指标:该准则旨在辨别变量,以防因为更改而产生谬误,这样当前批改就不会影响其余无关的行为啦。
O —Open-Closed (开闭)
Class 该当在凋谢的时候进行编程扩大,关闭的时候进行批改。

图释:

  • 谬误示范——我能做”Cut”这个动作 -> 关闭后 -> 批改成能做”Paint”;
  • 正确做法——我能做”Cut”这个动作 -> 关闭后 -> 扩大成能做”Cut”和”Paint”两个动作。

更改 Class 的以后行为将影响应用该类的所有零碎。
如果要让 Class 执行更多功能,现实的办法是将性能增加到曾经存在的性能中,而不是间接更改 Class。
指标:该准则旨在扩大 Class 的性能,而不扭转特定 Calss 的现有性能。这是为了防止在应用 Class 的任何中央引起谬误。

L — Liskov Substitution(替换)
如果 S 是 T 的子类型,则能够将程序中类型 T 的 Class 替换为类型 S 的 Class,这样就无需更改总程序内的任何所需属性。

图释:
有一对父子 Sam 和 Eden,有人心愿 Sam 做一杯咖啡

  • 谬误示范——父亲 Sam 不在场时,工作便生效;
  • 正确做法——继承工作给儿子 Eden。

当子类无奈执行与其父类雷同的操作时,可能会导致谬误。
如果您有一个类并从中创立另一个类,则该类将成为父类,而新的类将成为子类。子类应该可能执行父类能够做的所有事件。此过程称为继承。
子类应该可能解决与父类雷同的申请并提供雷同的后果,或者它能够传递雷同类型的后果。
图中父类提供咖啡(能够是任何类型的咖啡)。子类交付 Cappucino 是能够承受的,因为它是一种非凡的咖啡,然而交付水是不可承受的。
如果子类别不合乎这些要求,则意味着子类别已齐全更改,并违反了这一准则。
指标:该准则旨在增强一致性,以便能够以雷同的形式应用父类或其子类,而不会呈现任何谬误。

I —Interface Segregation(接口隔离)
不应强制客户依赖他们不应用的办法

图释:

  • 谬误示范——用凌乱的办法去作排列 -> 无奈应用;
  • 正确做法——用简洁的办法去作排列 -> Awesome!

当要求一个 Class 执行无用的操作时,这是节约的,并且如果该 Class 没有能力执行那些操作,则可能会产生意外的谬误。
Class 应仅执行其职责所需的操作。如果未来其余 Class 可能会负责到其余任何动作,则应将其彻底删除或移至其余地位。
指标:该准则旨在将一组动作分成较小的一组,以便 Class 仅执行其所需的一组动作。

D —Dependency Inversion(依赖倒置)

  • 高级模块不应依赖于低级模块,两者都应取决于 abstraction;
  • abstraction 不应依赖细节,细节应取决于 abstraction。

图释:

  • 谬误示范——我用特定工具来工作;
  • 正确做法——我用任何给我的工具来工作。

首先,让咱们更简略地定义此处应用的术语:

  • _高级模块(或 Class)_:应用工具执行动作的 Class;
  • _低级模块(或 Class)_:执行操作所需的工具;
  • _形象 abstraction:_示意连贯两个 Class 的接口;
  • _详细信息_:该工具如何工作。

该准则表明,不应将 Class 与用于执行动作的工具交融在一起。而是应将其与容许工具连贯到 Class 的接口交融。
它还阐明,Class 和接口都不应该晓得工具的工作形式。然而,该工具须要满足接口标准。
指标:该原理旨在通过引入接口来缩小高级模块对低级模块的依赖性。
总结
到目前为止,咱们曾经探讨了这五个准则并突出了它们的指标。它们将帮忙你使代码易于调整、扩大和测试,达到完满的境界。
最初,非常感谢你的浏览。我心愿你能对这个主题造成一个更好的概念,并且浏览时和我编写代码时一样开心。
???? 原文链接:https://medium.com/backticks-tildes/the-s-o-l-i-d-principles-in-pictures-b34ce2f1e898
以上信息来源于网络,由“京东智联云开发者”公众号编辑整理,不代表京东智联云立场

[浏览原文]

退出移动版