什么是SOLID

SOLID 是面向对象设计原则的首字母缩写,这些原则有助于创建可维护、可扩展和易于理解的软件系统。以下是 SOLID 原则的详细阐述:

1. 单一职责原则 (Single Responsibility Principle, SRP)

单一职责原则指出,一个类应该只有一个引起变化的原因,即一个类应该只负责一个功能。

优点:
  • 增强可维护性:每个类只承担一个职责,使得代码更容易理解和维护。
  • 提高代码复用性:职责单一的类可以在不同的场景中复用。
  • 降低代码耦合:减少了类之间的依赖关系,使系统更具灵活性。
示例:

假设有一个 Employee 类,它既负责员工数据的管理,也负责员工数据的保存:

class Employee {constructor(private name: string, private age: number) {}getDetails() {return `${this.name} is ${this.age} years old.`;}saveToFile() {// 保存到文件的逻辑}
}

根据 SRP 原则,应将保存数据的逻辑提取到一个单独的类中:

class Employee {constructor(private name: string, private age: number) {}getDetails() {return `${this.name} is ${this.age} years old.`;}
}class EmployeeRepository {saveToFile(employee: Employee) {// 保存到文件的逻辑}
}

2. 开闭原则 (Open/Closed Principle, OCP)

开闭原则指出,软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。即应通过扩展的方式来实现新的功能,而不是通过修改已有代码。

优点:
  • 提高系统的可扩展性:可以在不修改现有代码的情况下添加新功能。
  • 减少回归风险:避免对已有代码的修改,降低引入新缺陷的风险。
示例:

假设有一个用于计算形状面积的类:

class AreaCalculator {calculateRectangleArea(width: number, height: number) {return width * height;}
}

如果需要扩展以支持圆形面积的计算,可以通过继承和多态来实现:

interface Shape {calculateArea(): number;
}class Rectangle implements Shape {constructor(private width: number, private height: number) {}calculateArea(): number {return this.width * this.height;}
}class Circle implements Shape {constructor(private radius: number) {}calculateArea(): number {return Math.PI * this.radius * this.radius;}
}class AreaCalculator {calculate(shape: Shape): number {return shape.calculateArea();}
}

3. 里氏替换原则 (Liskov Substitution Principle, LSP)

里氏替换原则指出,基类的对象可以被其子类的对象替换而不影响程序的正确性。

优点:
  • 增强代码的健壮性:确保子类可以正确地替代基类。
  • 提高代码的灵活性:允许在不改变客户端代码的情况下使用不同的子类。
示例:

假设有一个基类和其子类:

class Bird {fly() {console.log('I can fly');}
}class Penguin extends Bird {fly() {throw new Error('I cannot fly');}
}

由于企鹅不能飞,子类 Penguin 违反了 LSP 原则。可以通过重构来解决这个问题:

class Bird {// 鸟的通用行为
}class FlyingBird extends Bird {fly() {console.log('I can fly');}
}class Penguin extends Bird {// 企鹅的特有行为
}

4. 接口隔离原则 (Interface Segregation Principle, ISP)

接口隔离原则指出,客户端不应该被迫依赖它不使用的方法。应将接口细化成更小、更专用的接口。

优点:
  • 减少类之间的耦合:每个类只依赖它真正需要的接口。
  • 提高系统的灵活性:便于接口的扩展和修改。
示例:

假设有一个庞大的接口:

interface Worker {work(): void;eat(): void;
}

如果有的实现类不需要 eat 方法,可以将接口分离:

interface Workable {work(): void;
}interface Eatable {eat(): void;
}class Robot implements Workable {work() {console.log('Robot is working');}
}class Human implements Workable, Eatable {work() {console.log('Human is working');}eat() {console.log('Human is eating');}
}

5. 依赖倒置原则 (Dependency Inversion Principle, DIP)

依赖倒置原则指出,高层模块不应该依赖低层模块,二者都应该依赖抽象。抽象不应该依赖细节,细节应该依赖抽象。

优点:
  • 提高系统的可扩展性:便于替换具体的实现。
  • 增强代码的灵活性:通过依赖抽象,使得高层模块和低层模块之间的耦合度降低。
示例:

假设有一个高层模块依赖于低层模块:

class Light {turnOn() {console.log('Light is on');}turnOff() {console.log('Light is off');}
}class Switch {private light: Light;constructor(light: Light) {this.light = light;}operate() {this.light.turnOn();}
}

可以通过依赖抽象来重构代码:

interface Switchable {turnOn(): void;turnOff(): void;
}class Light implements Switchable {turnOn() {console.log('Light is on');}turnOff() {console.log('Light is off');}
}class Switch {private device: Switchable;constructor(device: Switchable) {this.device = device;}operate() {this.device.turnOn();}
}

通过以上重构,高层模块 Switch 依赖于抽象接口 Switchable,使得它可以与任何实现该接口的设备一起工作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/35831.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《昇思25天学习打卡营第2天 | 昇思MindSpore张量 Tensor》

第二天学习 1.今天学习了张量 Tensor,了解到Tensor是一个可用来表示在一些矢量、标量和其他张量之间的线性关系的多线性函数,也是一个特殊的数据结构,与数组和矩阵非常相似。是MindSpore网络运算中的基本数据结构。学些了张量和稀疏张量的属性…

Linux|如何查找和删除重复文件

引言 整理您的个人文件夹甚至整个操作系统可能会相当棘手,特别是当您习惯于使用下载管理器从网上下载各种资料时。 在很多情况下,您可能会发现自己不小心下载了重复的mp3、pdf和epub文件(以及其他类型的文件),并将它们…

正版软件 | WIFbox:智能化文件管理工具,让效率与隐私并行

在数字化办公日益普及的今天,文件管理成为了提升工作效率的关键。WIFbox 一款智能文件管理工具,利用强大的人工智能技术,帮助您快速对文件进行分类,完成复杂的智能文件分类任务。 智能分类,效率倍增 WIFbox 通过精细化…

2024年Nano编辑器最新使用教程

Nano在大多数Linux发行版中找到,易于使用,其最常用的命令显示在其屏幕底部。 作为编辑配置和其他文件是Linux中的一种普遍的任务,知道如何使用该程序是否可以非常有用。Nano编辑器以及如何使用Nano编辑器在服务器上编辑文件是我们将在本指南中…

linux 下neo4j的安装

一、neo4j简介 Neo4j 是一个高性能的 NoSQL 图形数据库,它将结构化数据存储在网络(从数学角度叫做图)上而不是表中。Neo4j 也可以被看作是一个高性能的图引擎,该引擎具有成熟数据库的所有特性。 neo4j与jdk版本对应 neo4j的版本需要与jdk版本相适配,否则容易出现安装失…

MBSE之简单介绍

MBSE之简单介绍 文章目录 MBSE之简单介绍1. What is MBSE?2. MBSE 最佳实践 1. What is MBSE? Model-Based Systems Engineering (MBSE), a.k.a. Model-Based Systems Development (MBSD), is a Systems Engineering process paradigm that emphasizes t…

Centos+Jenkins+Maven+Git 将生成的JAR部署到Jenkins服务器上

背景:前一篇写的是Jenkins和项目应用服务器不在同一个服务器上。但是有的公司可能不会给Jenkins单独弄一个服务器。可能就会出现Jenkins就搭建在某一个应用服务器上。这种情况的参考如下的操作。 1、登录 没有安装的参考下面的安装步骤先安装: Jenkins安装手册 输入账号、…

电脑怎么去除视频水印?电脑视频水印怎么去掉?

电脑怎么去除视频水印?有是我们见到喜欢的视频会保存下来,但是有时候保存的视频上面会带有水印,那么视频水印该如何去除呢?今天小编给大家推荐一个好用的视频去水印软件,操作简单,去水印效果好。 使用&…

2024高考录取分数线一览表(含一本线、二本线、专科线)

2024年全国各地的高考录取分数线已经全部公布,查大学网(www.chadaxue.com)为大家整理全国31个省市高考录取分数线汇总,包括本科批(一本分数线线和二本分数线)、专科批和特殊类招生控制分数线汇总&#xff0…

【AI落地应用实战】如何让扫描工具更会思考——智能高清滤镜2.0实战测评

一、引言 在这个信息爆炸的数字化时代,扫描工具已经成为我们日常工作和学习中不可或缺的助手。最近,扫描全能王推出了革命性的“智能高清滤镜2.0”,本次更新后,智能高清滤镜能够智能识别并优化扫描过程中的各种问题。无论是光线不…

vscode遭遇Unanle to connect to VS Code server

解决方案:把tmp下面的文件全删除掉 Unable to connect to VS Code server: Error in request. Error: connect ENOENT /tmp/vscode-ipc-0c11d8b2-a42e-4b1b-972b-470465ba844a.sock at PipeConnectWrap.afterConnect [as oncomplete] (node:net:1555:16) { errno: …

Redis优化之持久化

目录 1.Redis高可用 2.Redis持久化 2.1 RDB持久化 2.1.1 触发条件 2.1.2 执行流程 2.1.3 启动时加载 2.2 AOF持久化 2.2.1 开启AOF 2.2.2 执行流程 2.2.3 文件重写触发方式 2.2.4 文件重写的流程 2.2.5 启动时加载 2.3 RDB和AOF的优缺点 3.Redis性能管理 3.1 查看…

SSL证书在网站访问中的核心作用及快速申请指南

在当今的互联网时代,数据安全与用户隐私保护成为了网站运营不可或缺的一部分。SSL证书作为一种重要的网络安全协议,它在网站访问中扮演着至关重要的角色,主要体现在以下几个方面: 一、加密通信内容:SSL证书通过建立安…

2023年第十四届蓝桥杯JavaB组省赛真题及全部解析(上)

目录 前言: 一、试题 A:阶乘求和(填空) 二、试题 B:幸运数字(填空) 三、试题 C:数组分割 四、试题 D:矩阵总面积 五、试题 E:蜗牛 六、试题 F&#xff…

SpringMVC处理器映射器HandlerMapping详解

目录 一、前言 二、initHandlerMappings 三、处理器映射器架构 策略接口 请求链 模版类 四、RequestMappingHandlerMapping的初始化 HandlerMethod映射器模版类的初始化 AbstractHandlerMethodMapping.MappingRegistry:内部类注册中心 五、Reques…

电子名片小程序源码系统 前后端分离 带完整的安装代码包以及搭建教程

系统概述 电子名片小程序源码系统是一款基于前后端分离架构的综合性平台,旨在为用户提供一个集销售名片和企业商城于一体的解决方案。该系统采用先进的技术手段,实现了个性化名片设计、便捷的销售功能、企业商城模块等一系列实用功能。同时,…

软件架构中CoreData的作用(C#和IOS)

如果我们把CoreData理解为核心数据,也可以任务系统的主要内存数据。在C#中的应用可以为在Core的那层Dll项目中实现以下数据的实时读取,以加快界面和网络功能的实现。 1. 系统基础参数部分 2. 系统的List业务数据集部分 3. 部分获取动态业务功能数据代…

72V转12V非隔离DC/DC电源原理图+PCB源文件

资料下载地址:72V转12V非隔离DCDC电源原理图PCB源文件 电动车所用的非隔离DC/DC电源,采用BUCK电路,运行稳定,为已经在产品中使用的电路 1、原理图 2、PCB

java登陆页面

当设计一个Java Web应用的登录页面时,逻辑思路通常包括以下几个步骤,这些步骤并不直接涉及代码,而是描述了整个流程的概念设计: 页面设计: 设计登录页面的用户界面,包括用户名和密码输入框、登录按钮、可能…

Python爬取中国天气网天气数据.

一、主题式网络爬虫设计方案 1.主题式网络爬虫名称 名称:Python爬取中国天气网天气数据 2.主题式网络爬虫爬取的内容与数据特征分析 本次爬虫主要爬取中国天气网天气数据 3.主题式网络爬虫设计方案概述(包括实现思路与技术难点) reques…