该内容来自 maxrave-dev/kotlin-footguns 中的 delta-absent-not-infinite 条目,主题是:没有基线的变化值是“缺失”,不是“无穷”。
用途:用于指导统计类界面(如对比上一周期的指标卡片)如何正确计算与展示变化百分比,避免在无有效基线时编造数字。
主要能力与做法:
- 提供示例函数 percentDelta(now: Long, before: Long?): Int?,当 before 为 null 或 before <= 0L 时返回 null。
- 在状态层用 previous.takeIf { p -> !p.isEmpty } 丢弃没有事件的上一期快照,使整屏数值都不带变化值。
- 在数值层用 before <= 0 处理“该期有事件但某指标为零”的情况;文中指出两层守卫都需要。
文中列出的陷阱:
- 空基线下的 +100% 属于伪装成洞察的噪声,会让整列数字失去区分度。
- 缺失应渲染为缺失:要么省略元素,要么显式打印“no previous period”;不应使用破折号、0 或 em dash 占位。
- JVM 上 Int 运算会饱和而非回绕,极小基线会产生 Int.MAX_VALUE;需要在基线过小时抑制或改用“×N”格式。
- toInt() 向零截断会使 −0.5% 变成 +0%,与真实 +0.5% 显示相同;应四舍五入或按原始比值判断符号。
- 涨跌同色会让符号成为唯一区分,应通过颜色、箭头或足够字号编码方向。
- 比较区间必须等长,例如用同一函数以 offset 与 offset + 1 派生两个窗口;否则会变成在度量日历本身。
- 缺失基线时,图例、坐标轴、“vs previous period”说明也需一并移除。
- 两个快照应作为一致的一对获取,避免本期计数与上期总数混排。
验证方式:文中给出在仓库根目录执行的只读命令,包括 grep 查找 percentDelta( 的所有调用点、用 awk 演示截断、grep 检查 delta >= 0 分支、rangeFor( 与 if (offset == 0) 的窗口生成分支。
适用场景:Kotlin 应用中涉及周期对比、环比、变化率展示的 UI 代码审查与实现。
限制:该资料仅为单项编码准则与示例,未提供完整库、安装方式、版本支持、性能数据或平台兼容性信息。