- 博客(19)
- 收藏
- 关注
原创 月球车移动实战:面向对象命令模式
本文档在《月球车移动实战:函数式命令组合设计》同一题意下,将+ 自由函数的实现改为(Command 模式),便于用继承扩展新指令类型,并在运行时以统一接口驱动行为。
2026-04-13 14:05:04
362
原创 月球车移动实战:函数式命令组合设计
阅读指引:测试覆盖初始状态、转向、位移、组合命令与边界场景,是需求反推的主要依据。阅读指引:执行入口实现极简,只负责执行命令并返回自身,体现执行器与命令解耦。这组测试不仅验证功能,也固化了命令模型的契约,后续重构时可作为回归保护。阅读指引:基础命令与高阶命令的实现都在这里,重点看方向映射、模运算和。,从而支持链式调用。状态变更逻辑全部在命令层,职责边界清晰。这个题目的关键不在“坐标加减”,而在“如何建模命令”。阅读指引:定义核心领域对象与命令抽象,重点关注。更好的思路是将“命令”抽象为一等公民,并让。
2026-04-13 11:59:21
332
原创 技术教练认证:扑克牌游戏
规则新增通过仓库扩展,不破坏主流程统计判型让实现简洁、优雅、可读将牌按“重复优先、点数次之”重排,将同牌型比较统一为逐位比较,显著减少分支逻辑比较链路固定,便于调试与性能分析测试按规则分层组织,回归成本低如果把这道题看成一个微型规则引擎,那么最值得复用的经验就是:先抽象数据特征,再组织比较流程。统计判型正是这个思路在扑克牌场景中的高性价比实践。
2026-04-11 11:48:50
360
原创 基于 LRU 的流表老化:工程实践
问题:大规模流表下,周期性全表扫描老化成本高;多线程命中后集中上报 LRU 更新,易造成消息突发与丢包。手段:用LRU 顺序表达“最近访问”,把淘汰与同步的焦点从“全体键”收束到链表顺序 + 哈希定位;在工程上可进一步结合分协议 idle侵入式链表与固定结点池等,控制分配次数与指针稳定性。跨线程:在节流基础上对发送时刻做按lru_index的散列,把更新打散到 [base, base + range),缓解拥塞、利于链表与真实流量一致。落地注意。
2026-04-02 14:26:23
333
原创 基于 CRTP 的单例模板
工程里经常会有“全局唯一”的对象:日志器、配置中心、指标上报器、线程池、驱动管理器等。工程上更值得关注的是边界条件:进程退出时的析构顺序、以及“初始化线程安全”不等于“方法线程安全”。这篇模板选的是第一种路径:保持析构存在,但把风险点讲清楚。这里给出一个可复用的模板:用 CRTP 让“谁是单例”在类型层面固定下来,同时用函数内。若你的单例析构里访问了“已经先析构的其它静态对象”,可能出问题。初始化线程安全不代表“方法线程安全”。这套写法把“唯一实例”的约束收口到两处:基类统一删除拷贝/移动,派生类用。
2026-04-01 15:46:18
334
原创 从 0 到 1:用 Mixin 实现角色模式(以协议端点为例)
角色负责「职责切片」:协议里变化最频繁的是「当前栈里启用了哪些能力」,用角色比用枚举 + 巨型分支更可持续。Pimpl 负责「稳定 ABI 边界」:对外头文件保持精简,角色实现与第三方依赖留在.cpp。宏要克制只统一与对的虚继承;虚析构只在Role;USE_ROLEHAS_ROLE与成员名role##Role对齐;纯虚与业务逻辑写在{ ... }里。与策略模式配合:同一角色内部仍可用策略替换算法(例如不同压缩策略),避免角色类本身变成上帝类。测试:对每个IRole做 mock,对Impl。
2026-04-01 13:05:01
352
原创 8种Ethernet帧格式的统一解析
4种以太帧格式二层报文在「目的 MAC + 源 MAC」之后,不同帧族在下一字段上并不一致:Ethernet II 跟的是EtherType,IEEE 802.3 跟的是Length,再往后还有 LLC、SNAP、Novell Raw 等差异。再叠加可选 VLAN Tag(802.1Q/802.1ad),工程里往往要处理4 种主类型 ×(带/不带 VLAN)≈ 8 种组合。如何用一套统一的头部视图(EthHeader)同时覆盖 8 种组合,并把“字段布局”与“类型识别”从业务逻辑里抽离出来。
2026-03-31 16:36:53
375
原创 编译宏在版本差分中的应用
编译期与运行期分层:宏解决「有没有能力」,开关解决「要不要用」,混在一层里容易要么镜像臃肿,要么运维不灵活。宏命名与文档这类名字建议在团队内有一份简短说明,避免新人误用成「带开关的」或反过来。避免在宏里塞复杂逻辑:宏参数里只宜放简短语句或调用;复杂逻辑封装成函数,宏只负责调用,便于调试与单测。链接与符号:若卸载专用函数仅在下存在,需保证非卸载构建不引用这些符号,或通过弱符号、桩函数等策略统一处理。测试矩阵。
2026-03-31 16:35:38
230
原创 Ping-Pong 内存在统计上报的两个应用
后者的切换点在“统计查询定时器超时后,从 DPU 读到累计值并算完 delta 之后”,用双快照保证。上报线程直接读“正在写的累计值”时,往往会遇到一致性问题:一个结构体里多个字段来自不同时间点。Ping-Pong 内存(双缓冲)说白了就是准备两块同构缓冲区,让它们在“写”和“读”两个角色之间来回切换。,如果这些字段在打包过程中被更新(哪怕都在同一线程里,只要更新点穿插在打包逻辑之间),就可能读到一个“拼出来的状态”。统计模块维护一份累计值。这相当于“双缓冲的累计快照”:读到的永远是某个时刻的稳定累计值。
2026-03-30 16:50:17
380
原创 算法基础-数组
特别的,如果mid还是使用(left + right)/2可能会存在left=0, right=1,mid等于0的情况,然后left=mid就一直无法更新边界退出循环了,可以使用上取整技巧规避,即mid = (left + right + 1) / 2;由于存在right=mid,退出条件必须是left < right,不然可能会死循环(考虑left=1,right=1的情况)由于存在left=mid,退出条件必须是left < right,不然可能会死循环(考虑left=0, right=0的情况)
2024-11-27 21:05:56
1793
原创 STL容器并发不安全导致的double free
众所周知,C++的STL里提供的map容器不能保证线程安全,项目因此给map加了一个锁,封装了一个线程安全的map,如下所示这里的读写锁是全局资源,通过封装RAII类,在构造函数内实现读或写保护,析构函数内实现解锁,就不用担心锁忘记释放,看起来也更简洁【参见Effective C++条款13以对象管理资源】
2024-03-29 11:20:35
997
1
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅