【软件工程】简单讲讲设计模式七大原则,以及代码简单举例

给自己一个目标,然后坚持一段时间,总会有收获和感悟!
学软件或计算机专业的同学应该都会接触到一门课程《软件工程》,七大设计原则属于软件工程中的重要知识点。

目录

  • 一、软件工程
    • 1.1、提供指导和规范
    • 1.2、确保软件质量
    • 1.3、提高开发效率和生产力
    • 1.4、降低软件开发风险
    • 1.5、支持可维护和可扩展性
  • 二、七大原则
    • 2.1、单一职责原则
    • 2.2、开放封闭原则
    • 2.3、里式替换原则
    • 2.4、依赖倒转原则
    • 2.5、接口隔离原则
    • 2.6、迪米特法则
    • 2.7、合成复用原则
  • 三、代码例子
    • 3.1、单一职责原则例子
    • 3.2、开放封闭原则例子
    • 3.3、里式替换原则例子

在这里插入图片描述

一、软件工程

软件工程是一门关注构建高质量软件的学科,它涉及了软件开发的全过程,从需求分析、设计、编码、测试到部署和维护。软件工程的目标是通过系统性的方法和工具来开发和维护可靠、高效、可维护和安全的软件。

  • 软件工程的作用包括以下几个方面

1.1、提供指导和规范

软件工程提供了一系列的准则、方法和最佳实践,以指导开发团队如何有效地组织和管理软件项目。它帮助开发者遵循一套规范和标准,以确保软件开发过程的质量和可控性。

1.2、确保软件质量

通过使用软件工程方法和技术,开发团队可以在整个软件开发生命周期中进行严格的质量控制。这包括对需求的准确定义、系统设计的完整性和正确性、代码的可读性和可维护性,以及全面的软件测试和验证。

1.3、提高开发效率和生产力

软件工程通过引入工程化的方法和工具,提供了一系列的自动化和协作机制,可以大大提高开发效率和生产力。例如,使用版本控制系统可以更好地管理代码的变更,使用集成开发环境可以提供更好的编码和调试工具。

1.4、降低软件开发风险

软件工程注重风险管理和控制,帮助开发团队在项目早期识别和处理潜在的问题和风险,从而降低项目失败的风险。通过合理的项目计划、风险评估和迭代开发等方法,可以更好地管理和减少开发过程中的不确定性。

1.5、支持可维护和可扩展性

软件工程关注软件的长期维护和演化,帮助开发团队构建易于维护和灵活扩展的软件系统。通过合理的架构设计、模块化和抽象化,软件工程可以提高软件系统的可维护性和可扩展性。

总之,软件工程在软件开发过程中起到指导、规范、管理和控制的作用,以确保开发高质量的软件系统。
它帮助开发者和团队更好地组织、规划和执行软件项目,从而提高开发效率、减少风险,并满足用户需求。

二、七大原则

在软件设计中,有七个常用的设计原则,也被称为SOLID原则

2.1、单一职责原则

单一职责原则(Single Responsibility Principle,SRP),一个类应该只有一个引起它变化的原因。简单来说,一个类或模块应该只负责一项任务或功能。例如,一个负责处理用户登录的类不应该承担其他与用户无关的功能。

2.2、开放封闭原则

开放封闭原则(Open-Closed Principle,OCP),软件实体(类、模块、函数等)应该是可扩展的,但对修改是封闭的。这意味着我们应该通过扩展现有实体,而不是修改它们来实现新的功能或行为。例如,通过使用抽象类或接口,我们可以定义一个通用的日志记录接口,然后通过实现该接口来添加新的日志记录器。

2.3、里式替换原则

里式替换原则(Liskov Substitution Principle,LSP),子类应该能够替换父类并且不影响程序的逻辑正确性。简单来说,子类应该能够以父类的身份无缝使用,并且不引起错误或异常。例如,如果有一个父类定义了一个返回数字的方法,子类应该能够返回同样类型的数字,而不是返回字符串或其他类型。

2.4、依赖倒转原则

依赖倒转原则(Dependency Inversion Principle,DIP),高层模块不应该依赖于低层模块的具体实现,而是应该依赖于抽象接口或类。简单来说,代码应该依赖于接口或抽象类,而不是具体的实现类。例如,一个控制器类应该依赖于定义好的接口而不是具体的服务类。

2.5、接口隔离原则

接口隔离原则(Interface Segregation Principle,ISP),客户端不应该依赖于它不需要的接口。简单来说,一个类不应该强制依赖于它不使用的接口方法。例如,如果有一个需要进行文件操作的类,不应该强制实现与网络通信相关的方法。

2.6、迪米特法则

迪米特法则(Law of Demeter,LoD,最少知识原则),一个对象应该与其他对象之间保持最少的了解。简单来说,一个类或对象应该尽可能少地知道其他类或对象的细节。例如,如果一个类需要使用另一个类的功能,应该通过接口或抽象的方式进行交互,而不是直接调用该类的方法。

2.7、合成复用原则

合成复用原则(Composition/Aggregation Reuse Principle,CARP),优先使用对象组合和聚合,而不是继承来达到代码复用的目的。简单来说,应该通过组合多个类的方式来实现代码复用,而不是通过继承。例如,使用组合关系将多个小的功能类组合成一个大的功能类,而不是通过继承来扩展功能。

三、代码例子

3.1、单一职责原则例子

// 单一职责原则例子
class UserService {public void register(String username, String password) {// 用户注册逻辑}
}class EmailService {public void sendEmail(String recipient, String content) {// 发送邮件逻辑}
}

3.2、开放封闭原则例子

// 开放封闭原则例子
interface Logger {void log(String message);
}class ConsoleLogger implements Logger {public void log(String message) {System.out.println(message);}
}class FileLogger implements Logger {public void log(String message) {// 将日志写入文件的逻辑}
}

3.3、里式替换原则例子

// 里式替换原则例子
class Shape {public double getArea() {return 0;}
}class Rectangle extends Shape {private double width;private double height;public void setWidth(double width) {this.width = width;}public void setHeight(double height) {this.height = height;}public double getArea() {return width * height;}
}

过上述例子,可以更好地理解七大设计原则在实际代码中的应用。这些原则有助于提高代码的可维护性、扩展性和重用性。

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

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

相关文章

学会Docker之---应用场景和基本操作

实体机、VM和容器 实体机(Physical Machine)是指实际的物理设备,例如我们常见的计算机主机、服务器等。它们是由硬件组成,可以直接运行操作系统和应用程序。 虚拟机(Virtual Machine)是在一台物理机上通过…

去除照片中多余人物方法分享-这些方法快收藏起来

拍照时经常会碰到一些意外的情况,比如不小心捕捉到了一些不需要的人或物,这会影响照片的美观效果,因此学习如何去除照片中多余人物就显得特别重,下面分享一些常用的去除照片中多余人物的方法,如果你也感兴趣的话&#…

Linux块设备缓存Bcache使用

1 Bcache简介 Bcache是Linux内核块层cache,它使用SSD来作为HDD硬盘的cache,从而起到加速作用。Bcache内核模块仅在Linux 3.10及以上版本支持,因此使用Bcache,需要将内核升级到3.10及以上版本,并在内核配置项中打开Bca…

【Docker】Docker网络及容器间通信详解

目录 背景 默认网络 1、bridge 网络模式 2、host 网络模式 3、none 网络模式 4、container 网络模式 自定义网络 容器间网络通信 IP通信 Docker DNS server Joined容器 前言 本实验通过docker DNS server和joined 容器两种方法实现Docker容器间的通信。Docker容器间…

Qt工具开发,该不该跳槽?

Qt工具开发,该不该跳槽? 就这样吧,我怕你跳不动。 嵌入式UI,目前趋势是向着LVGL发展。QT已经在淘汰期了。很多项目还在用,但技术上已经落后。QT短期内不会全面淘汰,但退位让贤的大趋势已经很清楚了。 最近很多小伙伴…

UE4 顶点网格动画播放后渲染模糊问题

问题描述:ABC格式的顶点网格动画播放结束后,改模型看起来显得很模糊有抖动的样子 解决办法:关闭逐骨骼动态模糊

二叉树实现表达式求值(C++)

用二叉树来表示表达式,树的每一个节点包括一个运算符和运算数。代数表达式中只包含,-,*,/,(,)和一位整数且没有错误。按照先括号,再乘除,后加减的规则构造二叉…

GEO生信数据挖掘(九)WGCNA分析

第六节,我们使用结核病基因数据,做了一个数据预处理的实操案例。例子中结核类型,包括结核,潜隐进展,对照和潜隐,四个类别。第七节延续上个数据,进行了差异分析。 第八节对差异基因进行富集分析。…

nfs+rpcbind实现服务器之间的文件共享

NFS简介 NFS服务及Network File System,用于在网络上共享存储,分为2,3,4三个版本,最新为4.1版本。NFS基于RPC协议,RPC为Remote Procedure Call的简写。 应用场景:用于A,B,C三台机器上需要保证被访问到的文件是一样…

10.17课上(七段显示器,递归异或与电路)

异或的递归与数电实现 用二选一选择器实现异或函数 在异或当中,如果有一项为0,就可以把那一项消掉;如果有一项为1,就是把剩下的所有项运算完的结果取反 (由此在算法当中可以采用递归解决) 当w1为0时&…

Electron webview 内网页 与 preload、 渲染进程、主进程的常规通信 以及企业级开发终极简化通信方式汇总

Electron 嵌入的页面中注入的是 preload.js 通过在标签中给 prelaod赋值,这里提到了 file://前缀,以及静态目录 static 怎么获取 实际代码,其中__static就是我们存放静态文件的地方,这个 static 是 electron 源代码根目录下的文件…

Nested loop(PostgreSQL 14 Internals翻译版)

连接类型和方法 连接是SQL语言的一个关键特性;它们是其力量和灵活性的基础。行集(要么直接从表中检索,要么作为某些其他操作的结果接收)总是成对连接。 有几种类型的连接: 内连接。 内连接(指定为“INNER JOIN”或简称为“JOIN”)由满足特定连接条件的…