《嵌入式软件设计方法》--设计原则

article/2025/9/14 14:56:20

设计原则(SOLID)

使用各个原则的首字母组成了一个单词:SOLID。

  • SRP:Single Responsibility Principle,单一职责原则;
  • OCP:Open Closed Principle,开闭原则;
  • LSP:Liskov Substitution Principle,里氏替换原则;
  • ISP:Interface Segregation Principle,接口隔离原则;
  • DIP:Dependence Inversion Principle,依赖倒置原则。

1. 单一职责原则(SRP)

1.1 定义

但一职责原则(Single Responsibility Principle)的定义:“就一个类而言应该仅有一个引起他变化的原因”。
该原则的亮相状态是:类只应该承担一个责任。如果一个类承担的多个责任,那么引起他变化的原因就越多,就降低了类的稳定性。
SRP强调类不应该承担太多的职责。唯有专注才能保证高内聚,唯有单一才能保证细粒度。高内聚和细粒度也更利于软件的重用。

1.2 SRP对方法设计的影响

单一职责原则适合于接口,类,同样也使用于一般的方法(函数),即一个方法也尽可能只做一件事情。

1.3 小结

遵循单一职责的好处:

  • 类的复杂性降低:实现了什么职责都有明确的定义。
  • 可读性提高:职责清晰明了,类的设计简单,易读易理解。
  • 可维护性提高:职责单一后,依赖关系更加简单,维护起来也更加容易。
  • 变更引起的风险降低:不会引入额外的依赖,每次变更不会引起大量的测试验证。
    实际应用中,应该根据实际情况使用SRP,在职责不容易划分时,不必强求,首先以最简单的方法实现,直到“变化的原因”产生时,再继续迭代,优化程序设计。

2. 开闭原则(OCP)

2.1 定义

​ 开闭原则(open closed principle):“一个软件实体(类、模块、函数等等),应该对扩展开放,对修改关闭”
​ 一个软件只要在生命周期内,就有可能发生变化。软件设计时尽量适应这些可能的变化,以提高软件的稳定性和灵活性。开闭原则用于指导我们设计的软件应该如何实现变化,主要包括:

  1. 对扩展开放

表示软件是可以扩展的。一个软件实体应该尽可能地扩展来实现变化,改变软件实体的功能,即通过添加新的代码来满足那些改变的新行为。
2. 对修改关闭

这里的不可修改指的是不能通过修改已有的代码来完成变化。
正确的使用OCP,可以在软件变化时,只需要添加新的代码,而不必更改已经正常运行的代码。这很好的的避免了大规模的测试、部署和重构。
开闭原则的目的时拥抱可能的变化。而变化的软件在设计之初并没有显现出来。因此,开闭原则是为软件实体的未来事件而制定的对现行开发设计进行约束的一个原则。

2.2 小结

​ 开闭原则是一个基础的原则,是总的设计直到思想。创建正确的抽象是要花费时间和精力的,同时,大量的抽象也增加了软件设计的复杂性。拒绝不程序的抽象和抽象本身一样中重要。

3. 里氏替换原则(LSP)

3.1 定义

如果对应每个类型为S的对象O1,都存在一个类型为T的对象O2,使得所有针对类型T变形的程序P中,用O1替换O2后,程序P的行为没有发生变化,那么类型S就是类型T的子类型。

LSP

一种更通俗的说法:**所有引用基类的地方,必须能都透明的使用其子类的对象。**只要父类出现的地方,子类就可以出现,而且替换子类不会产生任何错误或者异常,使用者可能根本不需要直到传递过来的对象究竟是子类对象还是父类对象。

3.2 基于契约设计

LSP强调"可替换性"。可以将父类及其接口看作一种契约,针对父类的某一方法,其制定了一种契约,即该方法的**“前置条件”"后置条件"**。前置条件是执行方法的前提,可以看作对输入的契约;后置条件的该方法对外的反馈,可以看作是对输出的契约。
前后置条件

为了保证子类对于父类的可替换性,子类的前后置条件需要满足如下规则

  • 前置条件
    相比于父类的某一方法,子类的前置条件只能相等或更弱,条件范围扩大。
  • 后置条件
    相比于父类的某一方法,子类的后置条件只能相等或更强,条件范围缩小。

3.3 小结

采用里氏替换原则的目的是为了避免继承的滥用,进而增强程序的健壮性,使软件升级时也可以保持非常好的兼容性。应用程序基于父类进行编程,即使增加子类或者修改子类也不会对应用程序造成影响。

4. 接口隔离原则(ISP)

4.1 定义

接口隔离原则有如下两种定义:

  1. “客户端不应该依赖他不需要的接口”;
  2. “类间的以来关系应该建立在最小的接口之上”;

4.2 小结

ISP 强调“类或模块不应该依赖于它们不会使用的方法”。如果依赖了那些它们根本不
会使用的方法,那么这些类或模块就会陷入一种窘境:当那些根本不会使用的方法发生变更
时,也会对模块或类产生影响,这极大的增加了类与类之间的耦合,致使每一次方法变更的
影响范围很大,难以维护。分离接口是针对这类问题的一种很好的解决方案。
ISP 实际应用起来比其它几个原则相对来讲都要容易一些。在实际应用中,如果一些接
口类中包含了过多的方法,就应该根据实际应用场合,考虑将接口拆分,以杜绝不必要的依
赖关系,进而降低模块之间的耦合。
ISP 要求接口是微小的、纯洁的、没有冗余的,不应该出现臃肿的接口(Fat Interface)。
实际上,接口就是对外的一种“承诺”,接口越小,承诺也就越少,变更的风险也就越小,
对系统的开发也就更加有利。但是接口的“小”是有限度的,试想一下,既然要求小,那就
直接设计到“最小”:每个接口类只包含一个方法。

5. 依赖倒置原则(DIP)

5.1 定义

  1. 高层模块不应该依赖于低层模块,两者都应该依赖于抽象;
  2. 抽象不应该依赖于细节;
  3. 细节应该依赖于抽象;

5.3 小结

依赖倒置原则的本质就是通过抽象使各个类或模块实现彼此独立,互不影响。特别是解
决了在传统嵌入式开发中,高层模块经常依赖于低层模块(例如具体芯片、硬件模块等)的
现状,使开发出跨平台的应用程序成为可能。
“依赖倒置原则”倒置了接口所有权,低层模块不再向高层模块提供自己的 API(高层
模块不直接调用低层模块),而是由高层模块定义接口类,接口的所有权属于高层模块,低
层模块只是按照接口类的要求进行实现而已。


http://chatgpt.dhexx.cn/article/c1BJnwDI.shtml

相关文章

嵌入式软件设计之设计模式

文章目录 前言1.设计模式之适配器模式2.设计模式之单例模式3.设计模式之命令模式4.设计模式之门面模式 前言 在嵌入式软件设计过程中,也会用到一些设计模式,所以说设计模式并不是面向对象语言的专利,下面我通过查资料以及自己的思考总结的几…

2、【已解决】Oracle错误问题(ORA-03113)

在执行一条sql时出现了如下问题: 处理方案网上找了一下日志,说是备份日志满了的原因; 通过以下方法看了下错误日志信息: 1、export TIME_STYLE%Y-%m-%d %H:%M:%S #格式化文件日期,便于查找错误文件 2、sqlplus &qu…

搭建ADG过程中复制报错 RMAN-03009 ORA-03113

搭建ADG过程中复制报错 RMAN-03009 ORA-03113 猜测主备之间网络路由过多导致。。。 开启mrp进程报错 发现数据文件是主库ASM的路径,备库是单机的 switch database to copy; 报错RMAN-6571 report schema;switch database to copy; select name from v$datafile;s…

oracle 启动报错03113,oracle数据库无法启动,总报ora-03113错误

虚机上装的oracle,由于系统突然宕机,导致了以下问题: 问题: 1、监听无法启动: $ lsnrctl start LSNRCTL for Linux: Version 11.2.0.4.0 - Production on 22-NOV-2018 15:27:11 Copyright (c) 1991, 2013, Oracle. Al…

oracle 启动报错03113,Oracle 入门之Oracle启动报错“ORA-03113”

Oracle 入门之Oracle启动报错“ORA-03113” [日期:2010-09-25] 来源:Linux社区 作者:naruto6006 [字体:大 中 小] 早上连接Oracle,发现oracle无法正常工作,无法shutdown immediate方式关闭,shutdown abort方…

linux oracle 03113,Oracle数据库关闭时出现ORA-03113错误

Oracle数据库关闭时,出现ORA-03113错误: SQL> shutdown immediate ORA-03113: end-of-file on communication channel Process ID: 3437 Session ID: 125 Serial number: 5 SQL> startup ORA-24324: service handle not initialized ORA-01041: in…

oracle startup open ora 03113,oracle宕机,startup报错ora03113

一、故障情况 应用无法连接数据库,检查oracle发现已经宕机。 startup 后报错 ORA-03113: end-of-file on communication channel 二、查找原因 查看alter日志 tail -500 /oracle/database/oracle/diag/rdbms/udb/udb1/trace/alter_UDB1.log Unable to create archiv…

ora03113通信通道的文件结尾 会话id 149 序列号 3

ORA-19815: 警告: db_recovery_file_dest_size 字节 已使用100.00%, 尚有 0 字节可用。” 是db_recovery_file_dest_size也叫归档日志空间不足导致 解决方法 第一步,将空间设置大点,另一个就是将多余的文件删除掉即可,那么我们就将这两个办法…

ORA-03113:通信通道的文件结尾

转自--------------http://blog.csdn.net/zwk626542417/article/details/39667999 由来 今天跟往常一样,登陆PL/SQL,确登陆失败,出现一个错误“ORA-01034”和“ORA-27101”如图: 然后就就通过命令提示符去登陆Oracle,去…

ORA-03113:通信通道的文件结尾-完美解决方案

今天发现系统登录和查询数据特别慢,orcl进程占用内存也特别高。打开程序调试用,存储过程调用时报错【ORA-03113:通信通道的文件结尾】 解决方案: oracle 文档中对这个错误这样解释: ORA-03113 错误就是说连接到数据…

ORA-03113: 通信通道的文件结尾

一、报错及错误原因 启动oracle数据库事报错:ORA-03113: 通信通道的文件结尾,报错内容如下图 出现问题后,去查看告警日志文件(D:\app\diag\rdbms\cjyorcl\cjyorcl\trace\alert_cjyorcl.log),日志报错内容如…

TinyPng:在线PNG图片压缩工具

本资源由 伯乐在线 - 卢伟 整理 TinyPng:在线PNG图片压缩工具是一款可以帮助网页设计师们优化图片的工具,只需要简单的两步就可以完成对PNG图片的高压缩而且还不会影响PNG图片的质量,这样就可以解决网页设计师因图片太大而影响网站加载网页速度的难题。 …

在线PNG图片压缩工具推荐——TinyPng

日常开发工作中时常需要对PNG图片压缩,今天推荐大家一个在线的图片压缩工具,ThinyPng 在线地址:TinyPNG – Compress WebP, PNG and JPEG images intelligently TinyPng:在线PNG图片压缩工具是一款可以帮助网页设计师们优化图片的工具&#x…

Image 图片

Image 图片 随机矩阵画图 这一节我们讲解怎样在matplotlib中打印出图像。这里打印出的是纯粹的数字,而非自然图像。下面用 3x3 的 2D-array 来表示点的颜色,每一个点就是一个pixel。 import matplotlib.pyplot as plt import numpy as npa np.array([0.…

libpng 处理png图片

尝试 最近遇到一个需求需要处理png 图片,由于处理过bmp 图片,所以想跟bmp 图片的处理过程一样直接去掉头信息,但是发现解开png之后发现头信息中数据长度和实际的的,data 数据量对不上,发现数据是压缩,跟bm…

Image Manipulation with StyleGAN

StyleGAN 特征插值算法复现 本教程通过对 StyleGanV2 网络上的部分修改,实现图片的拼接。 参考论文 StyleGAN of All Trades: Image Manipulation with Only Pretrained StyleGAN 一、StyleGAN 简介 在GAN出现之前,图形学已经出现了一个重要分支&…

GIMP( GNU IMAGE MANIPULATION PROGRAM)

openGL系列文章目录 文章目录 openGL系列文章目录前言一、GIMP获取?二、使用步骤1.安装2.GIMP使用 总结 前言 我们在使用openGL处理纹理时,为了达到某种特效需要对三维模型添加纹理,而有些纹理在网上是下不到的,而且在一些商用项…

【PNG overview】PNG专题!

【PNG overview】PNG专题! 作者 鼯鼠 2007.1.22 转贴请注明出处 这段时间因为工作原因开始接触PNG,遇到问题的时候,在网上搜索资料总是零零碎碎,而且有很多的说法根没就是人云亦云,信手拈来,根本…

php imagejpeg函数,php imagepng()函数有什么用?

imagepng()是PHP中的一个内置函数,用于在浏览器或文件中显示图像。该函数的主要用途是在浏览器中查看图像,将任何其他图像类型转换为PNG,并对图像应用过滤器。 语法:bool imagepng( resource $image, int $to, int $quality, int …