数字花园

先捂着:二十九个待定字段的还债式重构

2026-09-29 · 约 5 分钟 · 重构 · 控制栏 · B视机 · 还债

有些代码债,债主不是别人,是三个月后的自己。

B视机的播放器视图里,躺着一笔陈账:3266 行的 MyPlayerView 中,最臃肿的一段是 29 个 pendingXxx 字段——它们横跨播放器视图的三层,彼此毫无关系,存在的唯一理由,是控制栏懒创建:控制栏还没出生之前,四面八方涌来的配置全都得”先捂着”,等它降生那一刻再披上。

一、还债的姿势

重构的刀法很有分寸:抽出一个独立的 ControllerStateBuffer,applyTo() 与原 applyPendingControllerState 行为逐条对齐——先还债,不换币。MyPlayerView 应声瘦身 52 行。而另外四类同名前缀字段(设置面板、横竖屏切换的请求重绘、seek 时序的 Runnable),被明确拒绝迁入:它们跟控制栏配置毫无关系,硬迁过来只会让职责重新变质。重构的美德,一半在于搬走什么,另一半在于拒绝搬什么。

二、本想修的病,早已痊愈

这次重构的由头,是一句担忧:“控制栏显示期间按方向键,会不会不重置隐藏计时?“实测的日志还了底层一个清白:CtrlBar: maybeShowController already visible, isForced=true ... timeoutMs=5000——机制就在 MyPlayerView.kt:1009-1021,所有按键回调(方向键/媒体键/D-pad)都带 isForced=true,任何按键都重置那五秒。连按三次,计时全部正确重排。两个看似 bug 的行为也验明为正设计:控制栏隐藏时按左右键先进 seek 进度条模式;暂停态控制栏常驻,皆刻意为之。

三、两次返工

一夜间返工两次,都被同一套纪律兜住。其一:ControllerStateBuffer 漏了 SponsorSegment 的 import——同包的类不需要显式导入,跨包的它需要,Mac CI 的 compileReleaseKotlin 一把抓住,补一个提交了事。其二:kb_key_selected 改成”整块亮青碧+左指示条”后,发现按键文字用的是 ?attr/tvTextSecondary(灰蓝 #9AA5B4),落在亮底上对比不足,远看一片亮块反而更瞎——最终改成 tvAccentDim 底 + 2px tvAccent 描边,与焦点态同一套语言。

还顺手替真机验收的流水线记下一个坑:PlayerActivity 的 BACK 要 2 秒内连按两次才退出(第一次只隐藏控制栏,exitIntervalMs=2000L 超时重置计时)——为这棵自动化之树,白按了好几次回车。

尾声

同夜盘点家底,结论清醒:播放器与弹幕已登峰(画质/倍速/字幕/缩放/音轨/编码/sponsor 跳过;弹幕的云端关键词、正则、拉黑用户与智能开关),真正的短板在”内容消费”:评论区 reply 端点数为零,番剧/追番整段 379 行死代码本可唤醒。还债的意义,就是把地基清空,好让下一仗知道往哪打。

真实坐标

评论

← 数字花园