前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >软件设计SOLID原则及示例

软件设计SOLID原则及示例

作者头像
用户7353950
发布于 2024-07-05 04:20:55
发布于 2024-07-05 04:20:55
1970
举报
文章被收录于专栏:IT技术订阅IT技术订阅

SOLID是面向对象编程和设计的五大基本原则的首字母缩写,由Robert C. Martin提出。遵循这些原则有助于开发人员设计出更易于理解、维护和扩展的软件系统。下面是对SOLID原则的详细解释:

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

- 定义:一个类应该只负责一个功能领域中的相关职责。也就是说,一个类的变化原因应当只有一个。

- 目的:通过将职责分离到不同的类中,可以减少类之间的耦合,使得类更易于理解、维护和重用。

2. 开放封闭原则(Open-Closed Principle, OCP)

- 定义:软件实体(类、模块、函数等)应该是可扩展的,但是不可修改。即对于扩展是开放的,对于修改是封闭的。

- 目的:当需要对软件进行改动时,应当通过增加新的代码来实现,而不是修改现有的代码,从而减少引入错误的风险。

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

- 定义:子类必须能够替换其基类并保持软件的正确性。即任何使用基类的地方都可以透明地使用其子类的对象,而不会影响程序的正确性。

- 目的:保证继承体系的健壮性,避免因子类对父类行为的不恰当修改而导致的系统错误。

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

- 定义:客户端不应该被迫依赖它不需要的接口。即设计多个小而专一的接口,而不要设计一个大而全的接口。

- 目的:通过将大接口拆分为小接口,可以减少系统的耦合度,提高模块的独立性,使得系统更加灵活。

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

- 定义:高层模块不应该依赖低层模块,二者都应该依赖抽象;抽象不应该依赖细节,细节应该依赖抽象。

- 目的:通过依赖抽象而非具体实现,可以降低模块间的耦合度,使得系统更易于修改和扩展,同时也促进了代码的可测试性。

下面我将通过Java代码示例来说明SOLID原则中的每一项原则如何应用。请注意,这些例子是为了演示目的而简化的,实际项目可能会更复杂。 1. 单一职责原则 (SRP) 问题描述:一个类既负责处理用户登录逻辑,又负责记录日志。 class UserService { public void login(String username, String password) { // 用户登录逻辑... // 记录日志 log("User logged in: " + username); } private void log(String message) { // 日志记录实现... } } 改进后:将日志记录功能分离到另一个类中。

class UserService { public void login(String username, String password) { // 用户登录逻辑... LogService.log("User logged in: " + username); } } class LogService { public static void log(String message) { // 日志记录实现... } } 2. 开放封闭原则 (OCP) 问题描述:假设我们有一个形状绘制应用,最初只支持圆形和正方形的绘制。 class ShapeDrawer { public void drawShape(Shape shape) { if (shape instanceof Circle) { // 绘制圆形 } else if (shape instanceof Square) { // 绘制正方形 } // ...更多形状检查和绘制逻辑 } } 改进后:通过引入抽象和多态支持新形状的添加,无需修改现有代码。 abstract class Shape { abstract void draw(); } class Circle extends Shape { @Override void draw() { // 绘制圆形 } } class Square extends Shape { @Override void draw() { // 绘制正方形 } } class ShapeDrawer { public void drawShape(Shape shape) { shape.draw(); } } 3. 里氏替换原则 (LSP) 问题描述:假设有一个`Rectangle`类,其子类`Square`(正方形)改变了`setWidth`和`setHeight`的行为以保持边长相等。 不遵守LSP: class Rectangle { protected int width; protected int height; public void setWidth(int width) { this.width = width; } public void setHeight(int height) { this.height = height; } } class Square extends Rectangle { @Override public void setWidth(int width) { super.setWidth(width); super.setHeight(width); // 违反了矩形的定义 } @Override public void setHeight(int height) { super.setWidth(height); // 同样违反了矩形的定义 super.setHeight(height); } } 改进后:为`Square`提供独立的宽度和高度管理,或者确保`Rectangle`的行为在子类中不变。 4. 接口隔离原则 (ISP) 问题描述:一个接口包含了太多方法,客户端可能只需要其中的一部分。 问题代码: interface Animal { void eat(); void sleep(); void fly(); void swim(); } class Bird implements Animal { // 实现所有方法,即使Bird不需要'sleep'或'swim' } 改进后:拆分接口,让客户端仅依赖它需要的方法。 interface Flyable { void fly(); } interface Swimmable { void swim(); } class Bird implements Flyable { @Override public void fly() { // 飞行实现 } } 5. 依赖倒置原则 (DIP) 问题描述:高层次模块直接依赖低层次模块的实现细节。 class HighLevelModule { private LowLevelModule llm = new LowLevelModule(); public void process() { llm.someOperation(); } } class LowLevelModule { public void someOperation() { // 一些低层次操作 } } 改进后:通过抽象接口来反转依赖关系。 interface ILowLevelModule { void someOperation(); } class HighLevelModule { private ILowLevelModule module; public HighLevelModule(ILowLevelModule module) { this.module = module; } public void process() { module.someOperation(); } } class LowLevelModule implements ILowLevelModule { @Override public void someOperation() { // 一些低层次操作 } } 通过以上示例,我们可以看到SOLID原则是如何指导我们编写更高质量、更易维护的Java代码的。

遵循SOLID原则是提高软件质量、降低维护成本的有效途径。在实际应用中,需要根据项目的具体情况灵活运用这些原则,有时候可能需要在设计的清晰度、可维护性和性能之间做出权衡。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-06-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 IT技术订阅 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
软件工程设计原理里氏替换原则举例
里氏替换原则(Liskov Substitution Principle, LSP)是面向对象设计的基本原则之一,由Barbara Liskov提出。这个原则指出,如果类 S 是类 T 的子类型,则程序中使用 T 的对象的地方都可以不经修改地使用 S 的对象。换句话说,子类的对象应该能够替换掉它们的父类对象,而不影响程序的正确性。这个原则强调了继承关系中的行为兼容性,保证了基类和派生类之间的正确抽象和继承关系。
小马哥学JAVA
2024/03/27
1770
面向对象设计五大原则
面向对象设计(Object-Oriented Design, OOD)和面向领域设计(Domain-Driven Design, DDD)是两种不同的设计方法论:
二锅头一桶天下
2024/08/31
1540
简单聊聊契约式设计(上)
我在阅读Bob大叔的《敏捷软件开发:原则、模式与实践》第十章的时候第一次接触Design by Contract这个概念。Bob大叔在讲述面向对象设计SOLID原则中的LSP(Liskov Substitution Principle)时,就借助DbC的设计思想来支撑LSP[1]。关于DbC,我将用两篇文章来简单聊聊。
袁慎建@ThoughtWorks
2020/04/16
7170
Java开发人员的SOLID设计原则简介
当你是软件工程的新手时,S.O.L.I.D.原则和设计模式是不容易理解或习惯的。我们都有问题,很难掌握SOLID+DP的思想,更难以正确实施。事实上,如何实现设计模式需要时间和大量实践。
曾高飞
2022/08/15
2570
设计模式—–里氏替换原则
开放封闭原则(Open Closed Principle)是构建可维护性和可重用性代码的基础。它强调设计良好的代码可以不通过修改而扩展,新的功能通过添加新的代码来实现,而不需要更改已有的可工作的代码。抽象(Abstraction)和多态(Polymorphism)是实现这一原则的主要机制,而继承(Inheritance)则是实现抽象和多态的主要方法。
对弈
2019/11/09
9660
实践GoF的23种设计模式:SOLID原则
从1995年GoF提出23种设计模式到现在,25年过去了,设计模式依旧是软件领域的热门话题。设计模式通常被定义为:
元闰子
2022/02/27
1.1K0
实践GoF的23种设计模式:SOLID原则
JavaScript设计模式经典-面向对象中六大原则
主要学习JavaScript中的六大原则。那么六大原则还记得是什么了吗?六大原则指:单一职责原则(SRP),开放封闭原则(OCP),里氏替换原则(LSP),依赖倒置原则(DIP),接口分离原则(ISP),最少知识原则(LKP)。
达达前端
2019/11/21
8340
JavaScript设计模式经典-面向对象中六大原则
软件架构设计原则--里氏替换原则
  里氏替换原则(Liskov Substitution Principle,LSP)是指,如果对每一个类型为T1的对象t1,都替换为类型为T2的对象t2,使得以T1定义的所有程序P在所有的对象t1都替换成t2时,程序P的行为没有发生变化,那么T2就是T1的子类型。   这个定义看上去比较抽象,我们重新理解一下。可以理解为一个软件实体如果适用于一个父类,那么一定适用于其子类,所有引用父类的地方必须能透明地使用其子类的对象,子类的对象能替换父类的对象,而程序逻辑不变。   根据这个理解,隐身含义为:子类可以扩展父类的功能,但不能改变父类原有的功能。
向着百万年薪努力的小赵
2022/12/02
3620
软件架构设计原则--里氏替换原则
聊聊面向对象设计中的Is-A
面向对象编程范式得到了广大开发者的青睐,在做面向对象软件设计的同仁也或多或少曾经心存困惑过。比如,怎么样才是正确的封装?如何恰当的继承?何时应该抽象? 对于设计,我们很难说对与错,通常只有好与不好的区分,而所谓的最佳实践也只是 -- 在当前约束下,人们所能找到的最佳解决方案。
袁慎建@ThoughtWorks
2020/04/16
6210
写了这么多年代码,你真的了解SOLID吗?| 洞见
尽管大家都认为SOLID是非常重要的设计原则,并且对每一条原则都耳熟能详,但我发现大部分开发者并没有真正理解。要获得最大收益,就必须理解它们之间的关系,并综合应用所有这些原则。只有把SOLID作为一个整体,才可能构建出坚实(Solid)的软件。遗憾的是,我们看到的书籍和文章都在罗列每个原则,没有把它们作为一个整体来看,甚至提出SOLID原则的Bob大叔也没能讲透彻。因此我尝试介绍一下我的理解。
ThoughtWorks
2018/09/20
8770
写了这么多年代码,你真的了解SOLID吗?| 洞见
阿里大佬告诉我,想学习设计模式,得先学好这些硬核技能
可能你不是科班出生,甚至大学都没念,没背景没关系。我们只要每天进步一点点,一个月、两个月、半年、一年......。
田维常
2021/04/22
6280
阿里大佬告诉我,想学习设计模式,得先学好这些硬核技能
【愚公系列】2021年12月 面向对象设计原则(三)-里氏替换原则(Liskov Substitution Principle or LSP)
常用的面向对象设计原则有七个,这七大设计原则都是以可维护性和可复用性为基础的,这些原则并不是孤立存在的,它们相互依赖相互补充,遵循这些设计原则可以有效地提高系统的复用性,同时提高系统的可维护性。
愚公搬代码
2021/12/03
2350
设计模式:面向对象的设计原则上(SRP、OCP、LSP)
面向对象的设计原则,我们最熟悉的就是 SOLID 原则,SOLID 原则是五个常用原则的首字母缩写,当然除了 SOLID 原则,还有一些其他的原则,所以后面就分为 SOLID 原则和其他原则两大块来介绍。
oec2003
2021/12/08
5880
设计模式:面向对象的设计原则上(SRP、OCP、LSP)
SOLID原则(OOD&OOP)
SOLID原则是面向对象编程和面向对象设计的头五大原则。学习及应用这五大原则可以构建一个易于维护和扩展的应用程序,我们一起看看到底是那五大原则。
小世界的野孩子
2019/09/11
1K0
【愚公系列】2023年11月 面向对象设计原则(三)-里氏替换原则(Liskov Substitution Principle or LSP)
面向对象设计原则是一些通用的软件设计原则,用于指导软件设计人员开发高质量、可扩展、可维护的软件系统。这些原则的作用如下:
愚公搬代码
2023/11/24
2690
面向对象设计必须遵循的几条原则
我们应该采用何种方法去应对需求变化呢?首先,在方法论层面我们应该采用敏捷开发;其次,在代码层面,使用OOD(Object-Oriented Design,面向对象设计),它的根本原则:面向接口编程;多用组合,而不是继承;发现变化,封装变化。但如何让设计满足这个原则呢?我们的先辈们总结出了5条设计原则,俗称SOLID原则,这就是本期我们要介绍的详细内容。
木可大大
2018/07/25
4390
【译】浅谈SOLID原则
SOLID原则是一种编码的标准,为了避免不良设计,所有的软件开发人员都应该清楚这些原则。SOLID原则是由Robert C Martin推广并被广泛引用于面向对象编程中。正确使用这些规范将提升你的代码的可扩展性、逻辑性和可读性。
Jackeyzhe
2020/03/10
5410
软件架构设计原则之里氏替换原则
里氏替换原则(Liskov Substitution Principle,LSP)是指如果对每一个类型为T1的对象o1,都有类型为T2的对象O2,使得以T1定义的所有程序P在所有的对象O1都替换成O2时,程序P的行为没有发生变化,那么类型T2是类型T1的子类型。
Tom弹架构
2021/10/24
4730
如何写出优雅的 JS 代码?使用 SOLID 原则
把这六个原则的首字母联合起来(两个 L 算做一个)就是 SOLID (solid,稳定的),其代表的含义就是这六个原则结合使用的好处:建立稳定、灵活、健壮的设计。下面我们来分别看一下这六大设计原则。
前端小智@大迁世界
2020/05/18
2.1K0
一文搞懂SOLID原则(javascript)
SOLID 是面向对象编程重要的原则,javascript 作为面向对象开发的语言之一,掌握这些原则,可以写出更优雅的代码。
奋飛
2023/03/06
3390
推荐阅读
相关推荐
软件工程设计原理里氏替换原则举例
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档