串口助手开发经验 - Luis-123

news/2025/9/24 22:31:43/文章来源:https://www.cnblogs.com/Luis-long/p/19110120

串口助手开发经验

Posted on 2025-09-24 22:28  Luis-123-long  阅读(0)  评论(0)    收藏  举报

1.在开发log功能的时候,发现点击发送数据后,没有反应(初始化陷阱)

经检查(很漫长的检查)后发现在最后面加了上次遗留的初始化导致的,相当于初始化两次,

img

因为加了log功能后需要传入两个实例的构造函数,但是在最后面又重新进入初始化了,但是没有传入参数,导致_logger为null。

后续debug引入一个日志验证

img

发现一初始化就为null,后续要注意这个

  • 先初始化基础服务(如日志器)
  • 再初始化依赖它们的服务

2.空对象模式应用

在使用log记录的时候,设计模式特别适合像空日志器这样的"无状态工具对象",它提供了接口实现的灵活性,同时保持了资源使用的最优化

NullSerialPortLogger中使用私有构造函数是为了:

  1. 强制单例模式:确保全局只有一个实例
  2. 防止误用:避免开发者创建不必要的实例
  3. 优化资源:减少内存占用和初始化开销
  4. 保持一致性:所有使用者共享相同的行为

img

单例模式在日志系统中的优势:

1.内存效率

// 使用单例:整个应用只有一个实例
var logger1 = NullSerialPortLogger.Instance;
var logger2 = NullSerialPortLogger.Instance;// logger1 == logger2,内存中只有一个对象

2.简化访问

// 任何地方都可以直接访问
public class MyService
{private ISerialPortLogger _logger = NullSerialPortLogger.Instance;// 不需要构造函数注入
}

3.空对象模式

// 作为空对象模式的实现
public class SerialPortService
{public SerialPortService(ISerialPortLogger logger = null){// 如果没有提供日志器,使用空日志器单例_logger = logger ?? NullSerialPortLogger.Instance;}
}

3.构造函数设计原则

  • 所有必需依赖都应作为参数
  • 使用参数验证确保依赖不为null
  • 避免在构造函数中执行复杂逻辑

实现依赖注入

img

实现定时发送

ISerialPortService 的实现类 SerialPortService 包含定时发送、异常处理等逻辑。通过接口抽象,FrmHelper 可以:

• 调用 SendData 和 StartTimedSend 方法时,无需关心具体实现细节。

• 在需要时替换为其他实现(如带日志或性能监控的版本)。

总结

这种写法的核心目的是 解耦 和 提高扩展性,符合以下设计原则:

  1. ​ 依赖倒置原则(DIP):依赖抽象(接口),不依赖具体类。
  2. ​ 开闭原则(OCP):通过扩展而非修改实现功能变化。
  3. ​ 单一职责原则(SRP):FrmHelper 专注于界面逻辑,不处理串口细节。

github地址:luis1900/SerialPortAssistant-OOP

gittee地址:https://gitee.com/beethoven1900/serial-port-assistant

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

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

相关文章

泊头网站建设公司做网站都需要自己的服务器吗

FL Studio 21是一款强大的数字音频工作站(DAW)软件,为您提供一个完整的软件音乐制作环境。它是制作高质量的音乐、乐器、录音等的完整解决方案。该程序配备了各种工具和插件,帮助你创建专业的虚拟乐器,如贝斯、吉他、钢…

电商设计网站如何制作网站视频教程

web渗透测试漏洞复现 1. ZooKeeper未授权漏洞复现1.1 ZooKeeper简介1.2 ZooKeeper漏洞复现1.3 ZooKeeper漏洞修复建议1. ZooKeeper未授权漏洞复现 1.1 ZooKeeper简介 ZooKeeper 是一个分布式的、开源的协调服务,最初由雅虎开发,现隶属于 Apache 软件基金会,是Google的Chub…

《计算机算法设计与分析》系列--算法实现题1.1-统计数字问题

引言: 这个题在原书的配套习题解答中,描述得比较简略,我不太看得懂,于是按自己的思路做了一遍。 问题描述: 一本书有n页,页码为1,2,.. N,(注意,页码的格式,0不会在最前面) 问在这所有的页码中,0-9这10个数…

银河麒麟系统root密码重置

银河麒麟系统root密码重置 一、系统环境Kylin-Server-V10-SP3-2403-Release-20240426-x86_64二、系统密码重置 1.重启系统重启操作系统,出现如下界面后按e键,进入grub模式。2.默认grub账户密码系统需要输入grub账户密…

银河麒麟系统磁盘管理

银河麒麟系统磁盘管理 一、系统环境Kylin-Server-V10-SP3-2403-Release-20240426-x86_64.iso二、磁盘管理 1.添加物理磁盘系统识别磁盘,不重启系统重新扫描 SCSI 主机适配器识别到新连接的 SCSI 或 SATA 存储设备 ech…

浅谈傅里叶级数

我们可能都听说过傅里叶级数,但我们确切地知道它是什么吗?在这篇文章中,我将尝试逐一剖析这些概念。希望到最后,当你听到这些术语时,无论是在机器学习文献中还是与数学相关的内容中,你都能明白是怎么回事。 傅里…

js遍历对象

js遍历对象JavaScript 对象是由键值对组成的集合,遍历对象即逐个访问这些键值对。 常见的遍历方法包括 for...in 循环、Object.keys()、Object.values() 和 Object.entries()。 在jquery中还经常使用$.each(obj, func…

瑞丽网站建设域名注册局官网

目录 配置开始 Zabbix添加linux主机 4.为agent.zabbix.com添加模板 环境: (隔天做的更换了IP,不影响实际操作) IP 192.168.50.50 关闭防火墙规则 更改主机名 [rootlocalhost ~]# vim /etc/hostname agent.zabbix.com [rootloca…

day 10 (函数2 )

day 10 (函数2 &)课程:https://www.bilibili.com/video/BV1o4411M71o?spm_id_from=333.788.videopod.episodes&p=183 10.1 函数二学习目标简介------------------------------------------------ 执行后10…

入驻了爱发电

从2025/9/24起,我正式入驻了爱发电平台

奖励函数(双足)

1.通用奖励项:is_terminated,判断机器人是否终止 2.基座惩罚项 惩罚基座z方向的速度,鼓励机器人保持平衡 惩罚基座x,y方向上的角速度,鼓励机器人保持水平 3.关节惩罚项 惩罚关节加速度,鼓励平滑运动 关节位置限制…

离线部署镜像仓库搭建

离线部署镜像仓库搭建 一、系统准备一台可联网服务器:用于同步仓库(与目标系统同架构) 一台离线内网服务器:最终使用离线内网仓库的机器 存储空间:至少200GB 系统版本:CentOS Linux release 8.5.2111二、在可联网…

Temporal和Airflow有什么差别

Temporal和Airflow有什么差别 Temporal 和 Apache Airflow 是两种主流的工作流编排工具,但它们在设计理念、核心优势和适用场景上有着显著的不同。下面通过一个表格快速梳理它们的核心差异,然后我会进一步解释这些差…

厚街公司网站建设wordpress模板和下载不同

转载一篇问题解决博客:问题解决 一、烧录系统 使用SDK烧录 二、安装archiconda3 JETSON TX2 NX的架构是aarch64,与win10,linxu不同,所以不能安装Anaconda,这里安装对应的archiconda。 1. 安装 wget https://github.com/Archiconda/build-tools/rel…

有前景的长沙企业网站建设开发一套小程序大概多少钱

在C语言中,位段(Bit Fields)是一种用来对结构体中的成员进行位级别的控制的特性。通过位段,我们可以灵活地控制结构体中各个成员的位数,从而节省内存空间并提高程序的效率。本篇博客将详细讲解C语言中位段的相关知识&a…

建立网站教程dedecms_v5.6室内装饰设计公司企业网站模板.rar

今日继续学习树莓派4B 4G:(Raspberry Pi,简称RPi或RasPi) 本人所用树莓派4B 装载的系统与版本如下: 版本可用命令 (lsb_release -a) 查询: Opencv 版本是4.5.1: 紧接着上篇文章学习的串口通信,今日学习如何让树莓派开机…

lc1035-不相交的线

难度:中等(中期)题目描述“连连看” 上下两个数组,相同的数可以连线,问在不交叉的情况下最多可以连多少条线示例 输入:nums1 = [1,4,2], nums2 = [1,2,4] 输出:2 解释: 1 4 2 | \ 1 2 4输入:nums1 = [2,5,1,…

Spring Boot 接入 Redis Sentinel:自动主从切换与读写分离实战(修复单机多实例与 Sentinel 配置坑) - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

智能中控终端-多环境联动的智慧管控中枢

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

自我介绍与未来规划

自我介绍与未来规划一、自我介绍 大家好,我叫李昊,专业是数据科学与大数据技术; 方向:大数据开发、大数据分析; 兴趣爱好:听歌、排球、调酒(熟练使用基础调酒工具,能够调制多款经典鸡尾酒并且自研了多款特调)…