设计模式与项目优化
文章平均质量分 84
记录在工作项目中进行新需求开发和老旧代码重构用到的一些设计模式优化方法。
进击ing小白
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
gtest在代码迭代中测试应用
在项目升级优化中对于一些在重要模块建立必要的单元测试极为重要,如常用的计费模块,在优化代码迭代升级时保证计费前后的一致性及其重要,但是对于众多的计费规则,边界情况众多,每次升级都进行全面测试特别耗费开发时间;再此引入单元测试gTest,建立完备的边界单元测试用例,在每一次迭代后可以快速的检测是否优化迭代导致计费规则前后不一致问题,保证在项目提测前减少bug。原创 2025-01-08 20:15:09 · 527 阅读 · 0 评论
-
项目中spdlog库的使用
spdlog支持跨平台(Windows、Linux、Mac、Android),主要开发语言是C++ ,headonly引入方式,主打高性能,支持单线程/多线程、同步/异步阻塞非阻塞模式,也可自己扩展。被顶层调用来输出日志的类,一个logger可以存储多个sink,输出时遍历所有sink的log(log_msg)函数进行输出;set_level(level_enum):设置logger日志输出最低等级,如果logger所包含的sink没有设置最低等级,则该设置起效。原创 2024-10-15 16:15:53 · 2368 阅读 · 0 评论
-
项目优化之职责链模式应用
职责链模式,是一种行为型模式,使多个对象构成对象链,将一个请求传递给对象链,哪个对象适合处理这个请求就让哪个对象来处理,可避免请求的发送者和接收者之间的耦合关系。如果请求在对象链上节点处理后仍可以往下传递,这种每个节点只处理一部分的职责链即是功能链,类似于流水线每个站点只处理任务的一部分,到流水线尽头任务即完成。职责链模式的优点发送者和接收者不需要知道彼此的具体细节。可以动态地添加或修改处理链,而不影响其他部分。请求可以被多个对象处理,不必绑定到特定的处理者。原创 2024-12-31 23:12:54 · 879 阅读 · 0 评论
-
Qt 无边框窗口进阶指南
本文深入解析了 Qt 环境下无边框窗口的完整实现方案。针对无边框窗口移除系统标题栏后引发的拖动、拉伸等核心痛点,重点讲解了如何借助 Win32 API 与 Windows 消息机制(WM_NCHITTEST、WM_NCCALCSIZE)进行系统级处理,实现流畅的窗口移动、精准的尺寸调整以及“置顶全屏”等特殊交互模式。文章提供了详尽的代码示例,并通过对比 Qt 原生方案与系统级实现的差异,揭示了 Win32 消息机制在桌面开发中的独特价值,为构建现代化、高性能的桌面应用提供了可靠的技术参考。原创 2026-08-25 14:49:25 · 237 阅读 · 0 评论 -
海外CMS系统中的RTL字符显示问题
本文总结了CMS系统在海外版本RTL(从右向左)语言环境下的金额显示问题及解决方案。由于Unicode双向文本算法会影响货币符号的位置,导致配置前置的货币符号被自动后置。通过插入LRM/RLM控制字符主动干预文本方向,同时在需要固定文本组合的场景使用LRE/PDF控制字符,彻底解决了UI、票据和Excel导出中的金额显示问题,为国际化适配提供了实践经验。原创 2026-08-22 08:15:15 · 335 阅读 · 0 评论 -
QBasicTimer vs QTimer —— 选择正确的计时器
这篇博客对比了QBasicTimer与QTimer的适用场景和性能,指出QBasicTimer更高效但API较底,QTimer更便捷但开销略高。文中澄清了两大误区:QBasicTimer同样能使用lambda,且也支持跨线程(需配合事件和线程)。通过实际案例演示了在实时性要求高的场景下选用QBasicTimer,并验证了其在高频任务中的性能优势。结论是:追求快速开发用QTimer,追求极致性能用QBasicTimer。原创 2026-08-21 16:46:51 · 336 阅读 · 0 评论 -
Qt程序国际化之多语言翻译应用
本文介绍了Qt程序国际化的完整流程。首先通过Qt设计师生成界面并创建ts翻译文件,编辑后转换为qm文件加载使用。重点讲解了语言热切换的实现方案:通过安装翻译器触发LanguageChange事件,该事件会传播至所有窗口部件,调用retranslateUI函数实现界面文本更新。文章提供了LanguageManager管理类实现语言切换的核心代码,并强调在构造函数中调用retranslateUI的重要性,以避免切换语言时界面数据丢失的问题。最后给出了标准的changeEvent和retranslateUI实现范原创 2024-10-07 00:33:40 · 591 阅读 · 0 评论 -
QCustomPlot的使用介绍
本文介绍了在Qt开发中使用QCustomPlot库实现高性能数据可视化的经验。针对道路车流数据可视化大屏项目中QChart性能不足的问题,通过改用QCustomPlot库成功解决了大数据量实时刷新的性能瓶颈。文章详细对比了QCustomPlot与QChart的性能差异,并提供了完整的折线图实现代码示例,包括数据绑定、样式设置、交互功能(点击显示数值、右键导出图片)等核心功能。同时总结了常见图表类型(折线图、散点图、柱状图等)的绘制方法和注意事项,特别强调了大数据量场景下的性能优化技巧。该方案已在实际项目中验原创 2026-05-13 16:42:50 · 546 阅读 · 0 评论 -
托盘程序在实际项目中的应用
本文介绍了在停车场项目中运用系统托盘功能的实现方法。通过Qt的QSystemTrayIcon类,可以方便地创建托盘图标,实现最小化到托盘而非退出的功能。文章详细说明了图标控制、提示信息、消息通知和右键菜单等核心功能,并提供了代码示例。在实际应用中,通过拦截关闭事件实现窗口隐藏到托盘,同时支持双击唤醒主界面。该方案有效解决了后台程序运行期间界面干扰问题,特别适合需要长期运行的服务类应用程序。原创 2025-11-03 14:41:24 · 975 阅读 · 0 评论 -
项目优化中对象的隐式共享
本文介绍了Qt框架中通过继承QSharedData实现自定义数据隐式共享的方法。Qt内置类型如QString采用隐式共享技术(读时共享,写时复制)提升性能和内存效率。开发者可让自定义类继承QSharedData,并用QSharedDataPointer管理数据,实现类似特性。文章详细展示了PersonData类的实现过程,包括数据定义、指针管理和测试用例,并对比了与std::shared_ptr的区别。最后总结了Qt隐式共享的优势:提升内存效率、优化性能、简化API,并给出了实际开发中的使用建议。原创 2025-07-29 16:22:04 · 220 阅读 · 0 评论 -
项目优化中加密算法的使用
本文系统介绍了数据安全通信中的加密算法及签名技术,重点分析了对称加密(AES、DES、3DES、SM4)和非对称加密(RSA)算法的原理与实现。对称加密采用相同密钥加解密,非对称加密使用公钥私钥对,RSA算法通过数学运算实现密钥生成与加解密流程。文章详细阐述了RSA的密钥生成、加密解密步骤,以及OpenSSL库的具体实现代码。同时介绍了数字签名技术(MD5、SHA系列)的应用场景及安全性比较。全文通过理论讲解与代码示例相结合的方式,为开发者提供了数据加密与签名的完整技术方案。原创 2025-01-21 21:41:00 · 294 阅读 · 0 评论 -
静态库和动态库的创建和调用方法
本文系统介绍了静态库和动态库的开发与应用。首先分析了C++程序构建的四个核心阶段(预处理、编译、链接、运行),详细对比了静态库和动态库在构建过程、内存使用、部署维护等方面的差异。然后通过具体案例演示了Windows平台下静态库(.lib)和动态库(.dll)的创建、使用及发布流程,包括三种动态库调用方式(隐式链接、显式链接、Qt封装)。针对跨编译器兼容性问题,深入探讨了调用约定(__stdcall/__cdecl)、链接规范(extern "C")和导出导入机制(__declspec)的原创 2025-07-19 08:47:11 · 449 阅读 · 0 评论 -
项目优化之开机自启动
摘要:本文介绍了在Windows系统中实现Qt程序开机自启动的方法。通过修改注册表HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/Run路径实现自启动功能,并提供了使用QSettings操作注册表的具体代码示例。文章还强调了需要管理员权限才能访问注册表,以及在64位系统上32位程序可能遇到的注册表重定向问题。该方案特别适用于无人值守的停车管理系统等需要自动恢复运行的场景。原创 2025-07-18 13:57:38 · 433 阅读 · 0 评论 -
对象创建控制
在实际项目中对于一些对象需要在栈上创建,避免在堆上创建引起不要的内存泄露风险;同时一些对象由于生命周期在整个软件运行期,不适合在栈上创建只能在堆上创建;以下针对两种情况进行阐述和代码实践。原创 2025-07-17 10:33:56 · 231 阅读 · 0 评论 -
项目中PostGreSql数据库的维护
实际交通项目中PostGreSql数据库中的车辆相关数据每天不断更新增加,长此以往数据库的查询插入更新等效率会逐渐增加,相关数据库操作的TimeBenck也会频频爆出耗时日志。除此之外磁盘存储的坏道,数据的丢失,索引的损坏,数据库的断电崩溃等等也会引起数据库连接问题,对于一些大型商业停车场会带来较大的损失。以下记录实际中常用的一些排查维护方法。原创 2025-06-19 16:14:35 · 1124 阅读 · 0 评论 -
项目优化中ini配置文件解析器
在停车管理项目中不同道闸口的终端配置可能不同,如靠近居民楼的道闸终端LED的语音播报音量和靠近马路的道闸门口不同;不同终端道闸锁闸时间也可能不同,诸如此类放在数据库中,不同的终端在启动时必须先连接到数据库才能加载,远没有本地配置文件方便,也不如配置文件方便技术支持修改方便,对于此类本地化配置的参数需要进行提取改写到本地配置文件中。原创 2025-04-17 23:42:20 · 777 阅读 · 0 评论 -
excel表格的读写
项目中产生的数据除了可视化处理经常也需要以excel的形式导入导出,如停车收费项目中月租车数据、账单数据和过车数据等经常需要从软件中检索导出备份或做账目统计,也有必要将导入的数据可导入软件,以便恢复数据。原创 2025-01-21 21:52:24 · 271 阅读 · 0 评论 -
Qt图形视图框架在项目中的应用
Qt图形试图框架是Qt库中用于创建2D图形用户界面的模块。它提供了丰富的绘图功能,支持绘制形状、文本、图像以及处理复杂的图形效果。通过使用Qt Graphics View框架,开发者可以构建交互式和动态的图形应用程序,如绘图软件、地图应用和数据可视化工具等。原创 2025-03-21 16:50:36 · 487 阅读 · 0 评论 -
观察者模式和发布订阅模式
简单来说就是定义了被观察类与观察类的关系,让多个观察对象同时监听一个被观察对象,当被观察者状态发生变化时通知所有的观察对象,便于及时更新观察者状态。观察者: 内部包含被观察者对象,当被观察者对象的状态发生变化时,接收状态更新通知,更新自身状态。被观察者: 内部包含了所有观察者对象,当状态发生变化时通知所有的观察者状态的更新。原创 2024-12-31 23:03:51 · 256 阅读 · 0 评论 -
std::call_once的原理及使用
是 C++11 中引入的一个模版函数,实现多线程环境下实现单次调用,避免重复执行同一操作。原创 2025-02-01 16:22:08 · 978 阅读 · 0 评论 -
C++ 内存序在多线程中的使用
C++11中的内存序(Memory Order)为开发者提供了工具,帮助控制多线程程序中不同线程之间的内存操作顺序,从而避免由于编译器或处理器优化导致的指令重排问题。这些内存序提供了从无序到严格一致的内存访问保证,让程序员能够在性能和安全性之间进行权衡。本文将详细介绍C++中的六种内存序,并通过实际例子补充说明它们的应用场景。原创 2025-03-05 23:06:05 · 1367 阅读 · 0 评论 -
提升C++项目编译速度
提高程序编译效率一方面从代码文件管理方面不断降低不同文件之间的依赖关系,另外一方面从代码的业务层面剥离剧烈变动的业务逻辑和相对稳固的代码框架,尽可能的将变化部分小范围可控,尽可能的降低耦合度,这方面设计模式的使用是一个不错的选择。此外一些编译器上的配置如开启多核编译等以及一些加速编译的工具也有一定的效果,此处不详谈这方面。https://blog.youkuaiyun.com/WSTONECH/article/details/143989953文章浏览阅读282次。原创 2025-02-22 23:16:32 · 1517 阅读 · 0 评论 -
Qt中插件的使用
插件是一种(遵循一定规范的应用程序接口编写出来的)程序,定位于开发实现应用软件平台不具备的功能的程序。插件必须依赖于应用程序才能发挥自身功能,仅靠插件是无法正常运行的;相反地,应用程序并不需要依赖插件就可以运行,这样一来,插件就可以加载到应用程序上并且动态更新而不会对应用程序造成任何改变(热更新)。插件就像硬件插卡一样,可以被随时删除、插入和修改,所以结构很灵活,容易修改,方便软件的升级和维护。原创 2024-11-15 16:49:46 · 2208 阅读 · 0 评论 -
QSplashScreen --软件启动前的交互
QSplashScreen 是 Qt 中的一个类,用于显示启动画面。它通常在应用程序启动时显示,以向用户显示应用程序正在启动的状态。启动画面可以是一个图片,也可以是一个包含了文本、图片等内容的窗口。//slots//protected 可以继承自绘。原创 2025-02-21 17:07:08 · 1278 阅读 · 0 评论 -
Qt程序退出相关资源释放问题
通过重写主界面的这个函数可在窗口关闭前执行一些自定义的操作,比如询问用户是否真的要关闭窗口,或者保存未保存的数据。如果该窗口是主窗口,且所有子窗口都已关闭,应用程序会退出,退出前会触发和aboutToQuit信号。• 当调用quit()时,它会退出主事件循环,触发QApplication::exec()返回,并关闭所有打开的窗口。• quit()通常用于在应用程序中实现“退出”功能,比如在菜单项的“退出”操作上绑定这个函数。• close()适用于关闭单个窗口或控件的场景,比如“关闭”按钮的操作。原创 2025-02-20 16:18:34 · 1672 阅读 · 0 评论 -
CRTP在项目优化中的使用
CRTP 全称,即奇异递归模板模式。是一种 C++ 编程技巧,使用模板类和继承的组合来实现。该模式的关键思想是:在模板类的定义中,模板参数是当前类自身(通常是派生类)。这个技巧通常用于实现编译时多态,优化性能,C++中std:: enable_shared_from_this 也是一种CRTP的实践。。原创 2025-02-19 21:45:26 · 1006 阅读 · 0 评论 -
PostgreSql数据库执行统计
在实际项目中为了确保软件长时间正常运行,监控数据库的执行情况非常有必要,这个扩展可以帮助你识别最频繁运行的查询、哪些查询消耗的时间最长,以及系统的整体工作量,从而对性能瓶颈进行诊断和优化。PostgreSql的pg_stat_statements插件提供一种方法追踪一个服务器所执行的所有 SQL 语句的执行统计信息,可以用于统计数据库的资源开销,分析TOP SQL。原创 2025-02-17 16:48:21 · 345 阅读 · 0 评论 -
Boost中几种有趣容器的应用
需要注意的是circular_buffer的迭代器不是循环的,指向或超过end()的迭代器也会引发断言异常,前面所说的到达末尾时自动循环使用容器的另一端空间指的是当达到容器的容量上限,继续push_back方法压入元素时,原来begin处的元素就会被覆盖,原来begin + 1处的元素成为新的begin。C++的STL的map和mutil_map可以把key映射到value,但是这种映射关系是单向的,然而实际项目中有一些场景,双射容器更合适。它实现了一个通用、与标准库的容器一致的接口,并且具有与。原创 2025-02-09 11:35:44 · 932 阅读 · 0 评论 -
内存池和对象的使用
Boost.Pool 包含一些用于管理内存的类。虽然 C++ 程序通常用于 new 动态分配内存,但内存提供方式的详细信息取决于标准库的实现和操作系统。例如,使用 Boost.Pool,您可以加速内存管理,从而更快地为程序提供内存。Boost.Pool 不会更改操作系统的行为 new。Boost.Pool 会首先从操作系统请求托管内存 - 例如,使用 new .从外部来看,您的程序已经分配了内存,但在内部,内存还不是必需的,而是交给 Boost.Pool 来管理它。原创 2025-02-14 15:31:45 · 1191 阅读 · 0 评论 -
无边框界面开发中鼠标事件不触发问题
Qt默认鼠标跟踪事件是关闭的,只有按下鼠标左键移动时才会触发;所以需要setMouseTracking(true)开启鼠标追踪事件。解决方案:将QMainWindow的子控件centralWidget等同样开启鼠标跟踪事件setMouseTracking(true),则子控件的鼠标移动事件会通过事件循环传递到父类的QMainWindow中,最终触发QMainWindow的mouseMoveEvent函数。//mainwindow的鼠标跟踪事件被子控件遮挡拦截,原创 2024-12-18 16:22:22 · 1041 阅读 · 0 评论 -
项目中enable_shared_from_this的使用
std::enable_shared_from_this是在内部保存一个对 this 的弱引用(例如 std::weak_ptr)。当 std::shared_ptr 的构造函数检测到无歧义且可访问的 enable_shared_from_this 基类时,如果内部存储的弱引用未被生存的 std::shared_ptr 占有,就会赋值新建的 std::shared_ptr。enable_shared_from_this 是个CRTP模板类,提供了一个可以返回一个shared_ptr的接口。原创 2025-01-27 20:37:08 · 265 阅读 · 0 评论 -
项目优化中文件压缩
在停车收费项目中,一些车流量大的车厂日志信息文件增加的很快,虽然采用spdlog根据大小限制了每一份日志的大小,但是往往这种车流量大的车厂是一些大型商场,各种类型车辆收费不同,不同时间往往有不同的优惠,且跟车严重会带来不少各种各样的问题;日志需要保存的时间就更久一些,因此对于日志按照时间尺度进行打包压缩是一个很好的方案,先mark以下,待后续空闲补充该部分内容。原创 2025-01-21 22:00:54 · 313 阅读 · 0 评论 -
项目优化之文件监控
QFileSystemWatcher 是 Qt 框架中提供的一个类,用于监视文件系统中的文件和目录的变化。它允许你在文件或目录发生变化时接收通知,并可以用于监视文件的创建、删除、重命名以及内容修改等操作。这对于需要实时监控文件系统变化的应用程序是非常有用的。原创 2025-01-23 17:09:03 · 350 阅读 · 0 评论 -
PostgreSql的备份和升级
该数据库版本主要分为主要版本和次要版本,大版本基本每年发布一次,小版本则每几个月即发布,更新较快。在10.0之前所使用的数据库版本由三个数字组成,如9.5.2,主要版本为9.5,次要版本为2,即9.5版本第二次发布;在10.0之后版本由两位数字组成,如10.16,10为主要版本,16为次要版本,同一个主版本由于数据的存储结构相同,且总是前后版本兼容,因此升级只需要将旧版本的data文件替换到新的data文件即可;而跨越主版本升级则会因为存储结构的改变而不能简单的进行data替换。原创 2024-10-12 22:54:29 · 2399 阅读 · 0 评论 -
结构性设计模式-----适配器模式
将一个类的接口转换为客户希望的另一个接口,Adapter模式使得原本由于接口不兼容的类不能一起工作的类可以一起工作。原创 2024-12-23 11:56:08 · 1031 阅读 · 0 评论 -
软件源码SVN版本号追溯
工作中软件开发过程中根据需求变更、缺陷修复、不同人员定制功能等等实际现场使用的软件会有不同的版本,若出现问题难以进行源码追溯,排查问题困难。原创 2025-01-14 16:22:33 · 574 阅读 · 0 评论 -
fmt 字符串格式化在项目中的使用
fmt 库是一个开源的 C++ 格式化库,它提供了一种简洁、安全和方式来进行字符串格式化,headonly全部头文件实现,直接引入项目即可。该库的设计目标是提供与 Python 的语法类似的功能,同时保持 C++ 的类型安全性和性能,在C++20中引入标准。原创 2025-01-08 21:05:57 · 867 阅读 · 0 评论 -
项目优化之策略模式
策略模式(Strategy Pattern) 是一种行为型设计模式,把算法的使用放到环境类中,而算法的实现移到具体策略类中,实现了二者的分离,即算法本身和使用算法的客户端代码是解耦的。最终将具体的计费规则单独以插件的形式接入程序,从而保证不同项目不同版本的程序计费规则的开发和迁移独立于主程序,极大的节约了开发资源。对于规则在不同版本之间的迁移,可以采用Qt的插件将不同的计费策略编译为插件,便于适用不同版本的程序,关于插件参考。通过定义不同的策略类来实现不同的算法,客户端可以根据需要选择具体的策略。原创 2024-12-31 22:57:05 · 1490 阅读 · 0 评论 -
RAII编程范式在项目中的一些具体应用
RAII在实际项目中应用广泛,除了资源申请和释放、TimeBench等,需要成对调用的操作、函数退出必须的操作等等都有很好的应用,用好RAII可以避免大部分的资源泄露问题。原创 2024-11-23 11:55:46 · 902 阅读 · 0 评论 -
项目优化之备忘录模式
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便于在不同时机可以切换到不同的状态中。原创 2024-12-23 21:08:53 · 1275 阅读 · 0 评论
分享