数字花园
先捂着:二十九个待定字段的还债式重构
有些代码债,债主不是别人,是三个月后的自己。
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 行死代码本可唤醒。还债的意义,就是把地基清空,好让下一仗知道往哪打。
真实坐标
- 陈账:
MyPlayerView3266 行中 29 个pendingXxx字段横跨三层,服务懒创建的控制栏 - 还债:抽
ControllerStateBuffer,applyTo()行为对齐;MyPlayerView-52 行;4 类同名前缀字段拒绝迁入 - 无病:控制栏 re-arm 由
MyPlayerView.kt:1009-1021的isForced=true保证;三连按验证;隐藏时 seek 模式与暂停常驻为设计 - 返工×2:
SponsorSegmentimport 被 Mac CI 抓住;kb_key_selected亮底对比不足 →tvAccentDim底 + 2pxtvAccent描边 - 坑:BACK 2 秒双击退出(
exitIntervalMs=2000L);docs/md 被 gitignore,结论只落磁盘(待用户决定去路)
评论