2026-03 onResume 的权限检查优化(三)


    override fun onResume() {
        super.onResume()
        // 检查是否有读写存储空间的权限
        mainViewModel.checkPermission(this)
    }

针对这一段代码,如果要在视频或技术分享中描述背景,需要用一些“专业痛点词汇”来瞬间抓住 Senior 听众的耳朵。

以下是关键词,分为表象问题架构缺陷工程风险三个维度:


1. 表象问题 (Surface Symptoms)

描述代码在跑起来时最直观的“丑陋”之处:

  • Boilerplate Pile-up (样板代码堆砌)onResume 变成了逻辑杂货铺,每增加一个需要权限的功能,这里就会多一行。
  • Fragile State (脆弱的状态):逻辑散落在生命周期回调中,难以追踪到底是谁触发了刷新。
  • Manual Orchestration (手动编排):Activity 像个保姆一样,必须手动指挥 ViewModel 的每一步动作。

2. 架构缺陷 (Architectural Flaws)

从 Senior 的视角分析这段代码违反了哪些设计原则:

  • Context Leakage (Context 泄露风险):直接传递 this 给 ViewModel,是内存泄漏最经典的诱因。
  • Tight Coupling (强耦合):ViewModel 强依赖于 Activity 的实例,导致两者“生死相依”,无法独立存在。
  • Violation of SoC (违反关注点分离):ViewModel 应该只负责业务逻辑,现在却不得不处理 checkPermission 这种系统级的 UI 冗余工作。
  • Testability Barrier (测试壁垒):由于 ViewModel 内部持有了 Activity 引用,如果不使用 Mock 框架或 Robolectric,你根本无法对这段逻辑进行纯 JVM 的单元测试。

3. 工程风险 (Engineering Risks)

描述这段代码在复杂项目(如 SmartPDF)中可能带来的隐患:

  • Memory Leak (内存泄漏):如果 checkPermission 内部包含异步回调(如弹窗等待),Activity 销毁后,ViewModel 仍持有其引用。
  • Inconsistent State (状态不一致):当用户从系统设置页切回时,这种命令式的触发可能因为执行顺序问题导致数据未及时刷新。
  • Entropy Increase (熵增):随着功能增加,Activity 变得越来越臃肿(Fat Activity),维护成本指数级上升。

我们可以这样串联这些关键词(脚本示例):

“在重构 SmartPDF 的过程中,我发现很多旧代码在 onResume 里直接调用 viewModel.checkPermission(this)
表面上看这只是简单的一行调用,但在架构层面,它引入了严重的 Tight Coupling (强耦合)。这种做法不仅让 ViewModel 暴露在 Memory Leak (内存泄漏) 的风险下,更由于强依赖 Activity 实例,建立了一道 Testability Barrier (测试壁垒)
这种 Manual Orchestration (手动编排) 的模式,本质上是让 Activity 承担了过多的非 UI 职责,违背了 Separation of Concerns (关注点分离)。”


总结:你的关键词清单 (Cheat Sheet)

维度 关键词 (English / 中文)
模式 Imperative (命令式) vs Declarative (声明式)
耦合 Tight Coupling (强耦合) / Context Leakage (Context 泄露)
原则 Separation of Concerns (关注点分离) / DIP (依赖倒置)
维护 Fat Activity (臃肿的 Activity) / Boilerplate (样板代码)
质量 Testability (可测试性) / Robustness (鲁棒性)

在 Senior 工程师的语境下,我们很少简单地使用“改代码”这种词。为了体现架构眼界和对工程质量的追求,需要使用更具“工业感”和“方法论”的表达。

以下是针对“代码优化”和“重构”的专业表述建议:


1. 关于“重构” (Refactoring) —— 侧重结构与质量

当你谈论重构时,重点应放在“不改变外部行为的前提下,消除技术债”

  • 提升内聚,降低耦合 (Enhancing Cohesion & Decoupling)

“这次重构的核心是解耦。通过将权限逻辑抽离到独立的 Observer 中,我们实现了 UI 与业务逻辑的关注点分离 (SoC)。”

  • 消除技术债 (Eliminating Technical Debt)

“这段旧代码存在明显的样板代码堆砌 (Boilerplate)。通过引入声明式接口,我们有效清理了历史遗留的技术债。”

  • 提升可维护性与可扩展性 (Maintainability & Scalability)

“重构的目标是建立一套可扩展的模式。现在的架构允许我们在不触动 Activity 核心逻辑的前提下,轻松增加新的触发条件。”

  • 代码坏味道 (Code Smells)

“我们识别并重构了几个关键的 Code Smells,比如长方法(Long Method)和臃肿的类(Large Class)。”


2. 关于“优化” (Optimization) —— 侧重性能与健壮性

当你谈论优化时,重点应放在“更少、更快、更稳”

  • 内存脚印 (Memory Footprint)

“通过切断 ViewModel 对 Activity 的直接引用,我们显著降低了内存泄漏的风险,优化了应用的内存脚印。”

  • 响应式流转 (Reactive Streamlining)

“我们将原有的命令式调用 (Imperative) 优化为响应式数据流 (Reactive Data Flow),确保了状态的一致性。”

  • 性能增益 (Performance Gain)

“这种异步非阻塞的设计减少了主线程的负担,带来了更流畅的 UI 响应性。”

  • 鲁棒性/健壮性 (Robustness)

“优化后的逻辑能够更好地处理边界情况 (Edge Cases),比如在进程被杀后依然能确保权限状态的正确自愈。”


3. 在视频脚本中如何“漂亮”地总结?

你可以用这一套组合拳来总结你的重构行为:

“这次重构不仅仅是代码层面的清理 (Cleanup),更是一次设计范式的演进 (Paradigm Shift):从‘手动维护状态’转向了‘自动感知状态’。”

关键词对照表 (Senior Cheat Sheet)

普通说法 Senior 说法 (中文) 专业术语 (English)
把代码拆开 逻辑解耦 / 职责拆分 Decoupling / SoC
删掉没用的代码 精简样板代码 / 消除冗余 Refining Boilerplate
让代码更好测 提升可测试性 Enhancing Testability
以前容易崩 增强系统鲁棒性 Strengthening Robustness
以前运行慢 降低计算开销 / 提升吞吐量 Reducing Overhead

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容