
设计模式与项目优化
文章平均质量分 84
记录在工作项目中进行新需求开发和老旧代码重构用到的一些设计模式优化方法。
进击ing小白
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
gtest在代码迭代中测试应用
在项目升级优化中对于一些在重要模块建立必要的单元测试极为重要,如常用的计费模块,在优化代码迭代升级时保证计费前后的一致性及其重要,但是对于众多的计费规则,边界情况众多,每次升级都进行全面测试特别耗费开发时间;再此引入单元测试gTest,建立完备的边界单元测试用例,在每一次迭代后可以快速的检测是否优化迭代导致计费规则前后不一致问题,保证在项目提测前减少bug。原创 2025-01-08 20:15:09 · 281 阅读 · 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 · 2038 阅读 · 0 评论 -
项目优化之职责链模式应用
职责链模式,是一种行为型模式,使多个对象构成对象链,将一个请求传递给对象链,哪个对象适合处理这个请求就让哪个对象来处理,可避免请求的发送者和接收者之间的耦合关系。如果请求在对象链上节点处理后仍可以往下传递,这种每个节点只处理一部分的职责链即是功能链,类似于流水线每个站点只处理任务的一部分,到流水线尽头任务即完成。职责链模式的优点发送者和接收者不需要知道彼此的具体细节。可以动态地添加或修改处理链,而不影响其他部分。请求可以被多个对象处理,不必绑定到特定的处理者。原创 2024-12-31 23:12:54 · 764 阅读 · 0 评论 -
项目优化中对象的隐式共享
本文介绍了Qt框架中通过继承QSharedData实现自定义数据隐式共享的方法。Qt内置类型如QString采用隐式共享技术(读时共享,写时复制)提升性能和内存效率。开发者可让自定义类继承QSharedData,并用QSharedDataPointer管理数据,实现类似特性。文章详细展示了PersonData类的实现过程,包括数据定义、指针管理和测试用例,并对比了与std::shared_ptr的区别。最后总结了Qt隐式共享的优势:提升内存效率、优化性能、简化API,并给出了实际开发中的使用建议。原创 2025-07-29 16:22:04 · 81 阅读 · 0 评论 -
项目优化中加密算法的使用
本文系统介绍了数据安全通信中的加密算法及签名技术,重点分析了对称加密(AES、DES、3DES、SM4)和非对称加密(RSA)算法的原理与实现。对称加密采用相同密钥加解密,非对称加密使用公钥私钥对,RSA算法通过数学运算实现密钥生成与加解密流程。文章详细阐述了RSA的密钥生成、加密解密步骤,以及OpenSSL库的具体实现代码。同时介绍了数字签名技术(MD5、SHA系列)的应用场景及安全性比较。全文通过理论讲解与代码示例相结合的方式,为开发者提供了数据加密与签名的完整技术方案。原创 2025-01-21 21:41:00 · 175 阅读 · 0 评论 -
静态库和动态库的创建和调用方法
在移动交通项目上有许多设备需要使用,如在高速收费站往往需要多目相机、ETC、电子地秤和道闸等等设备,上层软件往往需要集成这些设备进行收费站软件项目方案的集成,每个地区指定的方案不同,采购的设备类型和指定的厂商往往不同,但是作为供应商针对不同的地区要求需要做好设备的接口适配这些需求,其中最常见的即采用动态库或静态库,通过上层软件指定的接口协议对设备功能进行封装,同时配合上层软件调试达成项目目的。原创 2025-07-19 08:47:11 · 254 阅读 · 0 评论 -
项目优化之开机自启动
摘要:本文介绍了在Windows系统中实现Qt程序开机自启动的方法。通过修改注册表HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/Run路径实现自启动功能,并提供了使用QSettings操作注册表的具体代码示例。文章还强调了需要管理员权限才能访问注册表,以及在64位系统上32位程序可能遇到的注册表重定向问题。该方案特别适用于无人值守的停车管理系统等需要自动恢复运行的场景。原创 2025-07-18 13:57:38 · 306 阅读 · 0 评论 -
对象创建控制
在实际项目中对于一些对象需要在栈上创建,避免在堆上创建引起不要的内存泄露风险;同时一些对象由于生命周期在整个软件运行期,不适合在栈上创建只能在堆上创建;以下针对两种情况进行阐述和代码实践。原创 2025-07-17 10:33:56 · 175 阅读 · 0 评论 -
项目中PostGreSql数据库的维护
实际交通项目中PostGreSql数据库中的车辆相关数据每天不断更新增加,长此以往数据库的查询插入更新等效率会逐渐增加,相关数据库操作的TimeBenck也会频频爆出耗时日志。除此之外磁盘存储的坏道,数据的丢失,索引的损坏,数据库的断电崩溃等等也会引起数据库连接问题,对于一些大型商业停车场会带来较大的损失。以下记录实际中常用的一些排查维护方法。原创 2025-06-19 16:14:35 · 975 阅读 · 0 评论 -
项目开发中一些python测试脚本
在实际项目开发中由于排期和开发进度等和不具备测试环境等原因需要单独进行模拟测试;此时python撰写脚本进行测试环境模拟是一种比较方便的方式。以下是一些测试中常用的脚本总结。原创 2025-06-13 16:53:42 · 81 阅读 · 0 评论 -
项目优化中ini配置文件解析器
在停车管理项目中不同道闸口的终端配置可能不同,如靠近居民楼的道闸终端LED的语音播报音量和靠近马路的道闸门口不同;不同终端道闸锁闸时间也可能不同,诸如此类放在数据库中,不同的终端在启动时必须先连接到数据库才能加载,远没有本地配置文件方便,也不如配置文件方便技术支持修改方便,对于此类本地化配置的参数需要进行提取改写到本地配置文件中。原创 2025-04-17 23:42:20 · 654 阅读 · 0 评论 -
excel表格的读写
项目中产生的数据除了可视化处理经常也需要以excel的形式导入导出,如停车收费项目中月租车数据、账单数据和过车数据等经常需要从软件中检索导出备份或做账目统计,也有必要将导入的数据可导入软件,以便恢复数据。原创 2025-01-21 21:52:24 · 158 阅读 · 0 评论 -
Qt图形视图框架在项目中的应用
Qt图形试图框架是Qt库中用于创建2D图形用户界面的模块。它提供了丰富的绘图功能,支持绘制形状、文本、图像以及处理复杂的图形效果。通过使用Qt Graphics View框架,开发者可以构建交互式和动态的图形应用程序,如绘图软件、地图应用和数据可视化工具等。原创 2025-03-21 16:50:36 · 342 阅读 · 0 评论 -
观察者模式和发布订阅模式
简单来说就是定义了被观察类与观察类的关系,让多个观察对象同时监听一个被观察对象,当被观察者状态发生变化时通知所有的观察对象,便于及时更新观察者状态。观察者: 内部包含被观察者对象,当被观察者对象的状态发生变化时,接收状态更新通知,更新自身状态。被观察者: 内部包含了所有观察者对象,当状态发生变化时通知所有的观察者状态的更新。原创 2024-12-31 23:03:51 · 163 阅读 · 0 评论 -
std::call_once的原理及使用
是 C++11 中引入的一个模版函数,实现多线程环境下实现单次调用,避免重复执行同一操作。原创 2025-02-01 16:22:08 · 782 阅读 · 0 评论 -
C++ 内存序在多线程中的使用
C++11中的内存序(Memory Order)为开发者提供了工具,帮助控制多线程程序中不同线程之间的内存操作顺序,从而避免由于编译器或处理器优化导致的指令重排问题。这些内存序提供了从无序到严格一致的内存访问保证,让程序员能够在性能和安全性之间进行权衡。本文将详细介绍C++中的六种内存序,并通过实际例子补充说明它们的应用场景。原创 2025-03-05 23:06:05 · 1209 阅读 · 0 评论 -
提升C++项目编译速度
提高程序编译效率一方面从代码文件管理方面不断降低不同文件之间的依赖关系,另外一方面从代码的业务层面剥离剧烈变动的业务逻辑和相对稳固的代码框架,尽可能的将变化部分小范围可控,尽可能的降低耦合度,这方面设计模式的使用是一个不错的选择。此外一些编译器上的配置如开启多核编译等以及一些加速编译的工具也有一定的效果,此处不详谈这方面。https://blog.csdn.net/WSTONECH/article/details/143989953文章浏览阅读282次。原创 2025-02-22 23:16:32 · 1231 阅读 · 0 评论 -
Qt中插件的使用
插件是一种(遵循一定规范的应用程序接口编写出来的)程序,定位于开发实现应用软件平台不具备的功能的程序。插件必须依赖于应用程序才能发挥自身功能,仅靠插件是无法正常运行的;相反地,应用程序并不需要依赖插件就可以运行,这样一来,插件就可以加载到应用程序上并且动态更新而不会对应用程序造成任何改变(热更新)。插件就像硬件插卡一样,可以被随时删除、插入和修改,所以结构很灵活,容易修改,方便软件的升级和维护。原创 2024-11-15 16:49:46 · 1406 阅读 · 0 评论 -
QSplashScreen --软件启动前的交互
QSplashScreen 是 Qt 中的一个类,用于显示启动画面。它通常在应用程序启动时显示,以向用户显示应用程序正在启动的状态。启动画面可以是一个图片,也可以是一个包含了文本、图片等内容的窗口。//slots//protected 可以继承自绘。原创 2025-02-21 17:07:08 · 1054 阅读 · 0 评论 -
Qt程序退出相关资源释放问题
通过重写主界面的这个函数可在窗口关闭前执行一些自定义的操作,比如询问用户是否真的要关闭窗口,或者保存未保存的数据。如果该窗口是主窗口,且所有子窗口都已关闭,应用程序会退出,退出前会触发和aboutToQuit信号。• 当调用quit()时,它会退出主事件循环,触发QApplication::exec()返回,并关闭所有打开的窗口。• quit()通常用于在应用程序中实现“退出”功能,比如在菜单项的“退出”操作上绑定这个函数。• close()适用于关闭单个窗口或控件的场景,比如“关闭”按钮的操作。原创 2025-02-20 16:18:34 · 1212 阅读 · 0 评论 -
CRTP在项目优化中的使用
CRTP 全称,即奇异递归模板模式。是一种 C++ 编程技巧,使用模板类和继承的组合来实现。该模式的关键思想是:在模板类的定义中,模板参数是当前类自身(通常是派生类)。这个技巧通常用于实现编译时多态,优化性能,C++中std:: enable_shared_from_this 也是一种CRTP的实践。。原创 2025-02-19 21:45:26 · 866 阅读 · 0 评论 -
PostgreSql数据库执行统计
在实际项目中为了确保软件长时间正常运行,监控数据库的执行情况非常有必要,这个扩展可以帮助你识别最频繁运行的查询、哪些查询消耗的时间最长,以及系统的整体工作量,从而对性能瓶颈进行诊断和优化。PostgreSql的pg_stat_statements插件提供一种方法追踪一个服务器所执行的所有 SQL 语句的执行统计信息,可以用于统计数据库的资源开销,分析TOP SQL。原创 2025-02-17 16:48:21 · 251 阅读 · 0 评论 -
Boost中几种有趣容器的应用
需要注意的是circular_buffer的迭代器不是循环的,指向或超过end()的迭代器也会引发断言异常,前面所说的到达末尾时自动循环使用容器的另一端空间指的是当达到容器的容量上限,继续push_back方法压入元素时,原来begin处的元素就会被覆盖,原来begin + 1处的元素成为新的begin。C++的STL的map和mutil_map可以把key映射到value,但是这种映射关系是单向的,然而实际项目中有一些场景,双射容器更合适。它实现了一个通用、与标准库的容器一致的接口,并且具有与。原创 2025-02-09 11:35:44 · 802 阅读 · 0 评论 -
内存池和对象的使用
Boost.Pool 包含一些用于管理内存的类。虽然 C++ 程序通常用于 new 动态分配内存,但内存提供方式的详细信息取决于标准库的实现和操作系统。例如,使用 Boost.Pool,您可以加速内存管理,从而更快地为程序提供内存。Boost.Pool 不会更改操作系统的行为 new。Boost.Pool 会首先从操作系统请求托管内存 - 例如,使用 new .从外部来看,您的程序已经分配了内存,但在内部,内存还不是必需的,而是交给 Boost.Pool 来管理它。原创 2025-02-14 15:31:45 · 1032 阅读 · 0 评论 -
无边框界面开发中鼠标事件不触发问题
Qt默认鼠标跟踪事件是关闭的,只有按下鼠标左键移动时才会触发;所以需要setMouseTracking(true)开启鼠标追踪事件。解决方案:将QMainWindow的子控件centralWidget等同样开启鼠标跟踪事件setMouseTracking(true),则子控件的鼠标移动事件会通过事件循环传递到父类的QMainWindow中,最终触发QMainWindow的mouseMoveEvent函数。//mainwindow的鼠标跟踪事件被子控件遮挡拦截,原创 2024-12-18 16:22:22 · 756 阅读 · 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 · 162 阅读 · 0 评论 -
项目优化中文件压缩
在停车收费项目中,一些车流量大的车厂日志信息文件增加的很快,虽然采用spdlog根据大小限制了每一份日志的大小,但是往往这种车流量大的车厂是一些大型商场,各种类型车辆收费不同,不同时间往往有不同的优惠,且跟车严重会带来不少各种各样的问题;日志需要保存的时间就更久一些,因此对于日志按照时间尺度进行打包压缩是一个很好的方案,先mark以下,待后续空闲补充该部分内容。原创 2025-01-21 22:00:54 · 204 阅读 · 0 评论 -
项目优化之文件监控
QFileSystemWatcher 是 Qt 框架中提供的一个类,用于监视文件系统中的文件和目录的变化。它允许你在文件或目录发生变化时接收通知,并可以用于监视文件的创建、删除、重命名以及内容修改等操作。这对于需要实时监控文件系统变化的应用程序是非常有用的。原创 2025-01-23 17:09:03 · 241 阅读 · 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 · 2197 阅读 · 0 评论 -
结构性设计模式-----适配器模式
将一个类的接口转换为客户希望的另一个接口,Adapter模式使得原本由于接口不兼容的类不能一起工作的类可以一起工作。原创 2024-12-23 11:56:08 · 963 阅读 · 0 评论 -
软件源码SVN版本号追溯
工作中软件开发过程中根据需求变更、缺陷修复、不同人员定制功能等等实际现场使用的软件会有不同的版本,若出现问题难以进行源码追溯,排查问题困难。原创 2025-01-14 16:22:33 · 448 阅读 · 0 评论 -
fmt 字符串格式化在项目中的使用
fmt 库是一个开源的 C++ 格式化库,它提供了一种简洁、安全和方式来进行字符串格式化,headonly全部头文件实现,直接引入项目即可。该库的设计目标是提供与 Python 的语法类似的功能,同时保持 C++ 的类型安全性和性能,在C++20中引入标准。原创 2025-01-08 21:05:57 · 651 阅读 · 0 评论 -
项目优化之策略模式
策略模式(Strategy Pattern) 是一种行为型设计模式,把算法的使用放到环境类中,而算法的实现移到具体策略类中,实现了二者的分离,即算法本身和使用算法的客户端代码是解耦的。最终将具体的计费规则单独以插件的形式接入程序,从而保证不同项目不同版本的程序计费规则的开发和迁移独立于主程序,极大的节约了开发资源。对于规则在不同版本之间的迁移,可以采用Qt的插件将不同的计费策略编译为插件,便于适用不同版本的程序,关于插件参考。通过定义不同的策略类来实现不同的算法,客户端可以根据需要选择具体的策略。原创 2024-12-31 22:57:05 · 1342 阅读 · 0 评论 -
RAII编程范式在项目中的一些具体应用
RAII在实际项目中应用广泛,除了资源申请和释放、TimeBench等,需要成对调用的操作、函数退出必须的操作等等都有很好的应用,用好RAII可以避免大部分的资源泄露问题。原创 2024-11-23 11:55:46 · 793 阅读 · 0 评论 -
项目优化之备忘录模式
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便于在不同时机可以切换到不同的状态中。原创 2024-12-23 21:08:53 · 1203 阅读 · 0 评论 -
对象序列化
一、对象序列化基本概念二、Boost库中对象序列化应用三、自定义对象序列化四、对象序列化在项目重构中应用原创 2024-12-04 22:27:08 · 196 阅读 · 0 评论 -
PIMPL模式和D指针
Pimpl(pointer to implementation, 指向实现的指针)是一种用来对“类的接口与实现”进行解耦合的方法。就是将真正的实现细节的Implementor从类定义的头文件中分离出去,公有类通过一个私有指针指向隐藏的实现类,是促进接口和实现分离的重要机制,可以避免在头文件中暴露私有细节。Pimpl 并不是严格意义上的设计模式(它是受制于 C++ 语言特定限制的变通方案),这种惯用法可以看作的一种特例。私有成员完全可以隐藏在共有接口之外,尤其对于闭源API的设计尤其的适合。原创 2024-11-23 11:49:56 · 402 阅读 · 0 评论 -
组件写作-----模板模式
模板模式利用虚函数的多态和稳定的任务流程模板,可以在需求变化时,只需要继承模板,将开发精力集中到具体的实现步骤即可。原创 2024-11-08 21:58:15 · 873 阅读 · 0 评论 -
创建型模式-----建造者模式
软件构建过程中有时候一个复杂的对象的构建可分解为多个子对象按照一定的算法逻辑进行构建,这种构建算法基本稳定但构建的子部件却经常变化。创建者模式则是将构建的算法和子组件分开,将变化和不变分开,当子组件变化时只影响子组件本身不影响构建算法本身,加强了构建算法的封闭性,提升了组件的扩展性。原创 2024-10-25 22:20:23 · 939 阅读 · 0 评论 -
创建型模式-----工厂模式
工厂模式主要是定义一个创建对象的接口,通过虚函数让子类决定实例化具体的对象,使得类的实例化延迟到子类中,从而达到解耦的目的。原创 2024-10-24 17:31:48 · 1017 阅读 · 0 评论