test(tools): 行数组不变式收紧为"18 个全部等于行数"
背景:`AppendRow()`(提交 85aaed5)已经成为新增面板行的唯一入口, 18 个平行数组由它一次补齐。因此旧的宽松判据("13 个必须等长 + 4 个重采样专属列允许为空")不再需要 —— 任何一列短于行数, 就是"有人绕过 AppendRow 手写 push"的直接证据。 改动: * `panels` 检查:改为断言 18 个数组长度**全部**等于 `rowRefs.size()`, 失败时打印全部 18 列的长度便于定位。 * `panelscroll` 检查:同样收紧(大文件 566 行时才会暴露的问题)。 * `Tools/README.md`:同步不变式描述。 文档: * `Documents/Code_Review_Plan.md` 新增 §八(第 36 轮节点与硬约束)。 * `Documents/Code_Review_Progress.md` 新增第 36 轮(两次重构 + 三个搬移陷阱)。 * `Documents/Code_Review_Report.md` 新增 §13(拆分职责表、为何不做完整合并、 失败可见性对比、后续建议)。 * `Documents/agent_mem.md` 新增第 36 轮规则。 验证: * `make release` 全量零 error / 零 warning,产物 **785,408 B**。 * `UnitTests` → checks=260 failed=0;`OffscreenChecks -all` → 6/6 PASS,checks=101 failed=0。 * `panels -mode compare` → 7 个面板像素哈希与几何逐项不变。 * `panelscroll`(MF4 566 行)→ 18 个行数组全部 = 566。
This commit is contained in:
1 parent
85aaed55f6
commit
221f9d2410
6 files changed
+260
-35
No files matched your search
@@ -347,3 +347,66 @@ Makefile 按目录通配收集源文件,**无需登记新文件**。
|
||||
**本轮未做**:与 P22 抢时间,且属纯可读性收益。
|
||||
3. **给平行数组补检查**:在 `panels` 里增加"每个 row 的 17 项长度一致"断言
|
||||
(成本极低,可作为第 1 项的前置护栏)—— 已记入待办。
|
||||
|
||||
---
|
||||
|
||||
## 第 36 轮(2026-11-04):§12.7 两项建议落地
|
||||
|
||||
### P26 拆分 `PaintEdgeCursor` —— ✅ 完成(提交 `38fbd4b`)
|
||||
|
||||
* 新增 `Components/PlotView/Src/PlotViewPanelPaint.cpp`(1016 行,**机械搬移、零逻辑改动**):
|
||||
* `PaintPanelCountTableRows` —— 边沿计数表格(固定表头 + 可滚动行);
|
||||
* `PaintPanelListRows` —— 列表式(均值/中心轴/弱峰/重采样/截取)条目栏 + 参数行;
|
||||
* `PaintPanelMarkerGroups` —— 自由标记(分组栏 + 表头 + 条目 + 吸顶)。
|
||||
每个函数只接收它真正需要的参数(`layout` / `tabLane` / `kind` / `laneIndex`),
|
||||
不再"整个函数都看得见"。
|
||||
* `PlotViewPaint.cpp`:6554 → 5575 行(`PaintEdgeCursor` 由约 1900 行降到约 900 行);
|
||||
三处块替换为一行调用,骨架(边框/标题栏/折起三角/GX 徽标/✕)与底部按钮仍在一处。
|
||||
* 滚动条绘制抽为 `pvdetail::PaintPanelScrollBar(g, layout, theme)`。
|
||||
* **顺带补上第 35 轮承诺未落地的一处**:`PaintEdgeCursor` 的标题仍是 7 层三元式
|
||||
(与 `EdgePanelWidth` 里另一条链并存,后者漏了 MARK/CLIP)⇒ 统一为 `PanelTitle(kind)`。
|
||||
|
||||
**过程中"机械搬移"踩到的三个真实问题**(都已修)
|
||||
1. 提取块里引用的 `paintCounts` / `paintPanelScrollBar` 是**局部 lambda** ⇒
|
||||
前者改为新函数内的局部 lambda(只服务于该段)、后者提升为 pvdetail 内联函数。
|
||||
2. 「标记透明度」滑块用到的 `panel` / `pad` 是外层局部变量 ⇒ 改为从 `layout.panel` 派生。
|
||||
3. `tabLanes` 在 marker 段里是**被写**的(回写各列实测宽度)⇒ 参数必须非 const。
|
||||
|
||||
### P27 平行数组错位隐患 —— ✅ 用 `AppendRow()` 消除(提交 `85aaed5`)
|
||||
|
||||
审计发现 `EdgePanelLayout` 每行对应 **18 个平行 vector**,而**四个**布局分支各自手写 push:
|
||||
* 边沿计数表格:13 次 push;
|
||||
* 列表式基行:13 次 push;
|
||||
* 「未勾选/收起」分支:又补 6(+重采样 4)次空 push;
|
||||
* 「重采样展开」/「普通展开」分支:各自再 push 6(+4)次。
|
||||
任何一处漏推 ⇒ 该列之后所有行读到**别人的**矩形。
|
||||
|
||||
改法:
|
||||
* 新增 `EdgePanelLayout::AppendRow(ref, header, nameRect, triangle, check)` —— **唯一入口**,
|
||||
18 个数组一次补齐(其余列为空矩形)。
|
||||
* 三个 push 块 → 各 **1 次 `AppendRow`**;参数行/重采样行改为 `rowXxx.back() = …` **赋值**;
|
||||
「未勾选/收起」分支的 6+4 次补空 push **整段删除**(AppendRow 已补过)。
|
||||
* ⇒ "新增一列"只需改 `AppendRow` 一处;"新增一行"必须走它(结构上不会漏列)。
|
||||
|
||||
⚠️ **没做完整结构合并**(`std::vector<PanelRow>` + 列视图),理由:
|
||||
列视图需要 `EdgePanelLayout` 自定义拷贝构造/赋值来重绑视图,而该类型是
|
||||
`EdgePanelLayoutFor()` 的返回值、又被存进 `std::vector` —— 拷贝是热路径,
|
||||
拷贝语义写错会产生**比原缺陷更隐蔽的悬垂视图**(原缺陷至少会被长度不变式抓到)。
|
||||
先消除真实隐患,结构合并留待"逐行几何基线"检查就绪。
|
||||
|
||||
### P28 收紧不变式
|
||||
|
||||
`panels` / `panelscroll` 里的长度检查从"13 个必须等长 + 4 个可空"改为
|
||||
**18 个全部必须等于行数** —— `AppendRow()` 成为唯一入口后,"某列短了"
|
||||
就是"有人绕过它手写 push"的直接证据。
|
||||
|
||||
### 本轮验证
|
||||
|
||||
| 项 | 结果 |
|
||||
| --- | --- |
|
||||
| `make release`(全量) | 零 error / 零 warning;产物 786,432 → **785,408 B** |
|
||||
| `make -C Tools` | 零 error / 零 warning |
|
||||
| `UnitTests` | `checks=260 failed=0 cases=19` |
|
||||
| `OffscreenChecks -all` | 6/6 PASS,`checks=101 failed=0`(断言合并后略减) |
|
||||
| `panels -mode compare` | 7 个面板像素哈希 + 几何**逐项不变**(两次重构全程守住) |
|
||||
| `panelscroll`(MF4,566 行) | 18 个行数组长度全部 = 566,行为不变 |
|
||||
Reference in new issue
Block a user