移动/游戏
写或审查 Kotlin 分支与控制流时,用…
在编写或审查 Kotlin 的 when 表达式、guard 条件、sealed 类型穷尽性、智能转换、可空分支、提前返回或替换复杂 if/else 链时使用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 49/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
写或审查 Kotlin 分支与控制流时,通用
解决思路
- 命名被分类的值:如果每个分支都在测试它,就用 `when (subject)`;否则保留无主语 `when` 或 `if` 链。
- 按代码形态选择分支形状:单一被分类值用 `when (subject)`;互不相关的布尔条件用无主语 `when` 或 `if`/`else`;主情况加分支局部谓词用 guard 条件;主路径前处理非法输入用提前返回、`require` 或 `check`;封闭且有返回值的域用穷尽 `when` 表达式;开放输入或有意回退用显式 `else`。
- 仅在带主语的 `when` 上、主条件之后使用 guard,且该额外谓词属于该分支、同时仍有一个无 guard 分支处理主条件;把带 guard 的分支放在最前;拆分逗号分隔的条件,而不是只给其中一个加 guard。
- 对于封闭的 enum、Boolean、sealed 类型或可空封闭类型,列出每个 case 并省略 `else`;对象按值匹配,类/数据类子类型用 `is` 匹配;当映射需要时保留智能转换后的 payload;如果输入是开放的服务器/平台值或需要真正的回退/日志,则保留 `else`。
- 仅当提前返回能从主路径中移除非法或可空状态时才使用它;保留表达清理、事务或错误处理的嵌套结构。
- 验证智能转换在不用 `as`、`!!`、可变临时变量或重复转换的情况下仍然有效;如果无效,保留原形状或做更小的重构。
- 编译并测试;失败时回到最小的适用早期步骤或保留原形状;当主语、回退和分支数据对读者清晰、且结果形状更易扫读时结束。
- 用 guard 分支细化某个 case,而不是嵌套 `if`,例如:`return when (event) { is Event.Message if event.isUnread -> Row.Highlighted(event.message); is Event.Message -> Row.Normal(event.message); Event.Empty -> Row.Empty }`。
- 当重复条件分类同一个值时使用带主语 `when`,并在它是更大分类中的一个 case 时把 `null` 作为分支,例如:`return when (val selected = selection) { null -> SelectionUi.None; is Selection.Single if selected.item.isArchived -> SelectionUi.Archived(selected.item); is Selection.Single -> SelectionUi.Active(selected.item); is Selection.Multiple -> SelectionUi.Count(selected.items.size) }`。
适用边界 · 注意事项
- 不要在不受支持的 Kotlin 版本上引入 guard。
- 不要把互不相关的布尔检查强行塞进带主语 `when`,不要移除开放世界的回退,也不要扁平化那些会掩盖清理、事务或错误的代码。