返回顶部
首页 > 资讯 > 前端开发 > html >什么是SOLID原则
  • 461
分享到

什么是SOLID原则

2024-04-02 19:04:59 461人浏览 八月长安
摘要

这篇文章主要介绍“什么是SOLID原则”,在日常操作中,相信很多人在什么是SOLID原则问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”什么是SOLID原则”的疑惑有所帮助!接

这篇文章主要介绍“什么是SOLID原则”,在日常操作中,相信很多人在什么是SOLID原则问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”什么是SOLID原则”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

01 什么是 SOLID 原则

SOLID 原则其实是用来指导软件设计的,它一共分为五条设计原则,分别是:

  • 单一职责原则(SRP)

  • 开闭原则(OCP)

  • 里氏替换原则(LSP)

  • 接口隔离原则(ISP)

  • 依赖倒置原则(DIP)

单一职责原则(SRP)

单一职责原则(Single Responsibility  Principle),它的定义是:应该有且仅有一个原因引起类的变更。简单地说:接口职责应该单一,不要承担过多的职责。  用生活中肯德基的例子来举例:负责前台收银的服务员,就不要去餐厅收盘子。负责餐厅收盘子的就不要去做汉堡。

单一职责适用于接口、类,同时也适用于方法。例如我们需要修改用户密码,有两种方式可以实现,一种是用「修改用户信息接口」实现修改密码,一种是新起一个接口来实现修改密码功能。在单一职责原则的指导下,一个方法只承担一个职能,所以我们应该新起一个接口来实现修改密码的功能。

单一职责原则的重点在于职责的划分,很多时候并不是一成不变的,需要根据实际情况而定。单一职责能够使得类复杂性降低、类之间职责清晰、代码可读性提高、更加容易维护。但它的缺点也很明显,就是对技术人员要求高,有些时候职责难以区分。

我们在设计一个类的时候,可以先从粗粒度的类开始设计,等到业务发展到一定规模,我们发现这个粗粒度的类方法和属性太多,且经常修改的时候,我们就可以对这个类进行重构了,将这个类拆分成粒度更细的类,这就是所谓的持续重构。

开闭原则(OCP)

开闭原则(Open Closed  Principle),它的定义是:一个软件实体,如类、模块和函数应该对扩展开放,对修改关闭。简单地说:就是当别人要修改软件功能的时候,使得他不能修改我们原有代码,只能新增代码实现软件功能修改的目的。

这听着有点玄乎,我来举个例子吧。

这段代码模拟的是对于水果剥皮的处理程序。如果是苹果,那么是一种拨皮方法;如果是香蕉,则是另一种剥皮方法。如果以后还需要处理其他水果,那么就会在后面加上很多  if else 语句,最终会让整个方法变得又臭又长。如果恰好这个水果中的不同品种有不同的剥皮方法,那么这里面又会有很多层嵌套。

if(type == apple){     //deal with apple  } else if (type == banana){     //deal with banana } else if (type == ......){     //...... }

可以看得出来,上面这样的代码并没有满足「对拓展开放,对修改封闭」的原则。每次需要新增一种水果,都可以直接在原来的代码上进行修改。久而久之,整个代码块就会变得又臭又长。

如果我们对剥水果皮这件事情做一个抽象,剥苹果皮是一个具体的实现,剥香蕉皮是一个具体的实现,那么写出的代码会是这样的:

public interface PeelOff {     void peelOff(); }  public class ApplePeelOff implement PeelOff{     void peelOff(){   //deal with apple     } }  public class BananaPeelOff implement PeelOff{     void peelOff(){   //deal with banan     } }  public class PeelOffFactory{     private Map<String, PeelOff> map = new HashMap();      private init(){         //init all the Class that implements PeelOff interface     } }  .....  public static void main(){     String type = "apple";     PeelOff peelOff = PeelOffFactory.getPeelOff(type);  //get ApplePeelOff Class Instance.     peelOff.pealOff(); }

上面这种实现方式使得别人无法修改我们的代码,为什么?

因为当需要对西瓜剥皮的时候,他会发现他只能新增一个类实现 PeelOff  接口,而无法在原来的代码上修改。这样就实现了「对拓展开放,对修改封闭」的原则。

里氏替换原则(LSP)

里氏替换原则(LSP)的定义是:所有引用基类的地方必须能透明地使用其子类的对象。简单地说:所有父类能出现的地方,子类就可以出现,并且替换了也不会出现任何错误。  例如下面 Parent 类出现的地方,可以替换成 Son 类,其中 Son 是 Parent 的子类。

Parent obj = new Son(); 等价于 Son son  = new Son();

这样的例子在 Java  语言中是非常常见的,但其核心要点是:替换了也不会出现任何的错误。这就要求子类的所有相同方法,都必须遵循父类的约定,否则当父类替换为子类时就会出错。  这样说可能还是有点抽象,我举个例子。

public class Parent{     // 定义只能扔出空指针异常     public void hello throw NullPointerException(){     } } public class Son extends Parent{     public void hello throw NullPointerException(){         // 子类实现时却扔出所有异常         throw Exception;     } }

上面的代码中,父类对于 hello  方法的定义是只能扔出空指针异常,但子类覆盖父类的方法时,却扔出了其他异常,违背了父类的约定。那么当父类出现的地方,换成了子类,那么必然会出错。

其实这个例子举得不是很好,因为这个在编译层面可能就有错误。但表达的意思应该是到位了。

而这里的父类的约定,不仅仅指的是语法层面上的约定,还包括实现上的约定。有时候父类会在类注释、方法注释里做了相关约定的说明,当你要覆写父类的方法时,需要弄懂这些约定,否则可能会出现问题。例如子类违背父类声明要实现的功能。比如父类某个排序方法是从小到大来排序,你子类的方法竟然写成了从大到小来排序。

里氏替换原则 LSP 重点强调:对使用者来说,能够使用父类的地方,一定可以使用其子类,并且预期结果是一致的。

接口隔离原则(ISP)

接口隔离原则(Interface Segregation  Principle)的定义是:类间的依赖关系应该建立在最小的接口上。简单地说:接口的内容一定要尽可能地小,能有多小就多小。

举个例子来说,我们经常会给别人提供服务,而服务调用方可能有很多个。很多时候我们会提供一个统一的接口给不同的调用方,但有些时候调用方 A 只使用 1、2、3  这三个方法,其他方法根本不用。调用方 B 只使用 4、5 两个方法,其他都不用。接口隔离原则的意思是,你应该把 1、2、3 抽离出来作为一个接口,4、5  抽离出来作为一个接口,这样接口之间就隔离开来了。

那么为什么要这么做呢?我想这是为了隔离变化吧! 想想看,如果我们把 1、2、3、4、5 放在一起,那么当我们修改了 A 调用方才用到 的 1  方法,此时虽然 B 调用方根本没用到 1 方法,但是调用方 B 也会有发生问题的风险。而如果我们把 1、2、3 和 4、5 隔离成两个接口了,我修改 1  方法,绝对不会影响到 4、5 方法。

除了改动导致的变化风险之外,其实还会有其他问题,例如:调用方 A 抱怨,为什么我只用 1、2、3 方法,你还要写上 4、5 方法,增加我的理解成本。调用方  B 同样会有这样的困惑。

在软件设计中,ISP 提倡不要将一个大而全的接口扔给使用者,而是将每个使用者关注的接口进行隔离。

依赖倒置原则(DIP)

依赖倒置原则(Dependence Inversion  Principle)的定义是:高层模块不应该依赖底层模块,两者都应该依赖其抽象。抽象不应该依赖细节,即接口或抽象类不依赖于实现类。细节应该依赖抽象,即实现类不应该依赖于接口或抽象类。简单地说,就是说我们应该面向接口编程。通过抽象成接口,使各个类的实现彼此独立,实现类之间的松耦合。

如果我们每个人都能通过接口编程,那么我们只需要约定好接口定义,我们就可以很好地合作了。软件设计的 DIP  提倡使用者依赖一个抽象的服务接口,而不是去依赖一个具体的服务执行者,从依赖具体实现转向到依赖抽象接口,倒置过来。

02 SOLID 原则的本质

我们总算把 SOLID 原则中的五个原则说完了。但说了这么一通,好像是懂了,但是好像什么都没记住。  那么我们就来盘一盘他们之间的关系。ThoughtWorks 上有一篇文章说得挺不错,文中说:

  • 单一职责是所有设计原则的基础,开闭原则是设计的终极目标。

  • 里氏替换原则强调的是子类替换父类后程序运行时的正确性,它用来帮助实现开闭原则。

  • 而接口隔离原则用来帮助实现里氏替换原则,同时它也体现了单一职责。

  • 依赖倒置原则是过程式编程与面向对象编程的分水岭,同时它也被用来指导接口隔离原则。

什么是SOLID原则

简单地说:依赖倒置原则告诉我们要面向接口编程。当我们面向接口编程之后,接口隔离原则和单一职责原则又告诉我们要注意职责的划分,不要什么东西都塞在一起。

当我们职责捋得差不多的时候,里氏替换原则告诉我们在使用继承的时候,要注意遵守父类的约定。而上面说的这四个原则,它们的最终目标都是为了实现开闭原则。

到此,关于“什么是SOLID原则”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: 什么是SOLID原则

本文链接: https://lsjlt.com/news/83654.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 什么是SOLID原则
    这篇文章主要介绍“什么是SOLID原则”,在日常操作中,相信很多人在什么是SOLID原则问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”什么是SOLID原则”的疑惑有所帮助!接...
    99+
    2024-04-02
  • Android设计模式SOLID六大原则是什么
    本篇内容主要讲解“Android设计模式SOLID六大原则是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Android设计模式SOLID六大原则是什么”吧!单一职责原则定义定义:确保单例类...
    99+
    2023-06-25
  • Python 中的 SOLID 原则
    💂 个人网站:【海拥】【摸鱼游戏】【神级源码资源网】🤟 前端学习课程:👉【28个案例趣学前端】【400个JS面试题】💅 想寻找共同学...
    99+
    2023-09-11
    python 开发语言
  • 如何应用SOLID原则
    本文小编为大家详细介绍“如何应用SOLID原则”,内容详细,步骤清晰,细节处理妥当,希望这篇“如何应用SOLID原则”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。什么是单一责任原则?单一责任原则告诉我们的是,每个...
    99+
    2023-07-02
  • react中怎么应用SOLID原则
    这篇文章主要介绍“react中怎么应用SOLID原则”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“react中怎么应用SOLID原则”文章能帮助大家解决问题。什么是开闭原则?Robert c. Ma...
    99+
    2023-07-02
  • PHP中SOLID原则有哪些
    小编给大家分享一下PHP中SOLID原则有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!SOLID 是Michael Feathers推荐的便于记忆的首字母简...
    99+
    2023-06-17
  • 在React中怎么应用SOLID原则
    本篇内容介绍了“在React中怎么应用SOLID原则”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、单一职责原则(SRP)单一职责原则的定...
    99+
    2023-07-02
  • Python中的SOLID原则实例详解
    目录前言单一职责原则开闭原则里氏替换原则接口隔离原则依赖倒置原则如何发现它?结论前言 SOLID 是一组面向对象的设计原则,旨在使代码更易于维护和灵活。它们是由 Robert &ld...
    99+
    2023-02-15
    python solid原则 面向对象的solid
  • 架构设计的五大原则-SOLID
    1.背景最近在读《架构整洁之道》这一本书,这本书的确写得不错,最近也没有更新文章,一方面再忙工作,另一方面也再啃一些书。当然文章还是得更新,《架构整洁之道》里面有些有意思的内容我会提取出来外加自己的思考。在这本书里面的第三章介绍了设计原则,...
    99+
    2023-06-05
  • 教你应用 SOLID 原则整理 React 代码之单一原则
    目录什么是单一责任原则?让我们从一个糟糕的例子开始1. 移动数据处理逻辑2. 可重用的数据获取钩子3. 分解 UI 组件让我们回顾一下我们刚刚做了什么总结SOLID 原则的主要是作为...
    99+
    2024-04-02
  • 在React中应用SOLID原则的方法
    目录1、单一职责原则(SRP)2、开放封闭原则(OCP)3、里氏替换原则(LSP)4、接口隔离原则(ISP)5、依赖倒置原则(DIP)6、小结在面向对象编程(OOP)中,SOLID ...
    99+
    2024-04-02
  • 如何应用 SOLID 原则在 React 中整理代码之开闭原则
    目录本系列其他文章什么是开闭原则?让我们从一个例子开始一个糟糕的解决方案解决方案是什么?让我们创建单独的用户组件注意总结 SOLID 是一套原则。它们主要是关心代码质量和可维护性的软...
    99+
    2024-04-02
  • 什么是Happens-before原则
    这篇文章主要介绍“什么是Happens-before原则”,在日常操作中,相信很多人在什么是Happens-before原则问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”什么是Happens-before原则...
    99+
    2023-06-15
  • css中的solid是什么意思
    solid 在 css 中表示实线边框,通过 "border: solid " 语法应用。其他边框样式包括 none(无边框)、dashed(虚线)、dotted(点状)、double...
    99+
    2024-04-28
    css
  • solid在css中是什么意思
    在css中,solid表示边框的绘制方式,绘制为实线,具有均匀的宽度和颜色,最常见于创建清晰可见的边框。 solid在CSS中是什么意思 在CSS(层叠样式表)中,solid是一个bo...
    99+
    2024-04-28
    css
  • DRY和TED原则是什么
    这篇“DRY和TED原则是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“DRY和TED原则是什么”文章吧。我们所写的代码...
    99+
    2023-06-17
  • mysql分片原则是什么
    这篇文章主要介绍了mysql分片原则是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。mysql分片原则1、可以不分就不分,参考单表优化。2、片数尽可能少,片数尽可能均匀地...
    99+
    2023-06-15
  • mongodb选举原则是什么
    MongoDB选举原则是基于副本集的架构,其中包括主节点和多个副本节点。选举原则是确保主节点的高可用性和可靠性。MongoDB的选举...
    99+
    2023-09-01
    mongodb
  • Flutter核心原则是什么
    这篇文章主要介绍“Flutter核心原则是什么”,在日常操作中,相信很多人在Flutter核心原则是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Flutter核心原则是什么”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-04
  • Java中什么是开闭原则
    这篇文章将为大家详细讲解有关Java中什么是开闭原则,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1.什么是开闭原则?开闭原则(Open Closed Principle)是编程中最基础、最重要的设计原则...
    99+
    2023-06-29
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作