2026-03 onResume 的權(quán)限檢查優(yōu)化(三)


    override fun onResume() {
        super.onResume()
        // 檢查是否有讀寫存儲(chǔ)空間的權(quán)限
        mainViewModel.checkPermission(this)
    }

針對(duì)這一段代碼,如果要在視頻或技術(shù)分享中描述背景,需要用一些“專業(yè)痛點(diǎn)詞匯”來瞬間抓住 Senior 聽眾的耳朵。

以下是關(guān)鍵詞,分為表象問題、架構(gòu)缺陷工程風(fēng)險(xiǎn)三個(gè)維度:


1. 表象問題 (Surface Symptoms)

描述代碼在跑起來時(shí)最直觀的“丑陋”之處:

  • Boilerplate Pile-up (樣板代碼堆砌)onResume 變成了邏輯雜貨鋪,每增加一個(gè)需要權(quán)限的功能,這里就會(huì)多一行。
  • Fragile State (脆弱的狀態(tài)):邏輯散落在生命周期回調(diào)中,難以追蹤到底是誰觸發(fā)了刷新。
  • Manual Orchestration (手動(dòng)編排):Activity 像個(gè)保姆一樣,必須手動(dòng)指揮 ViewModel 的每一步動(dòng)作。

2. 架構(gòu)缺陷 (Architectural Flaws)

從 Senior 的視角分析這段代碼違反了哪些設(shè)計(jì)原則:

  • Context Leakage (Context 泄露風(fēng)險(xiǎn)):直接傳遞 this 給 ViewModel,是內(nèi)存泄漏最經(jīng)典的誘因。
  • Tight Coupling (強(qiáng)耦合):ViewModel 強(qiáng)依賴于 Activity 的實(shí)例,導(dǎo)致兩者“生死相依”,無法獨(dú)立存在。
  • Violation of SoC (違反關(guān)注點(diǎn)分離):ViewModel 應(yīng)該只負(fù)責(zé)業(yè)務(wù)邏輯,現(xiàn)在卻不得不處理 checkPermission 這種系統(tǒng)級(jí)的 UI 冗余工作。
  • Testability Barrier (測(cè)試壁壘):由于 ViewModel 內(nèi)部持有了 Activity 引用,如果不使用 Mock 框架或 Robolectric,你根本無法對(duì)這段邏輯進(jìn)行純 JVM 的單元測(cè)試。

3. 工程風(fēng)險(xiǎn) (Engineering Risks)

描述這段代碼在復(fù)雜項(xiàng)目(如 SmartPDF)中可能帶來的隱患:

  • Memory Leak (內(nèi)存泄漏):如果 checkPermission 內(nèi)部包含異步回調(diào)(如彈窗等待),Activity 銷毀后,ViewModel 仍持有其引用。
  • Inconsistent State (狀態(tài)不一致):當(dāng)用戶從系統(tǒng)設(shè)置頁切回時(shí),這種命令式的觸發(fā)可能因?yàn)閳?zhí)行順序問題導(dǎo)致數(shù)據(jù)未及時(shí)刷新。
  • Entropy Increase (熵增):隨著功能增加,Activity 變得越來越臃腫(Fat Activity),維護(hù)成本指數(shù)級(jí)上升。

我們可以這樣串聯(lián)這些關(guān)鍵詞(腳本示例):

“在重構(gòu) SmartPDF 的過程中,我發(fā)現(xiàn)很多舊代碼在 onResume 里直接調(diào)用 viewModel.checkPermission(this)。
表面上看這只是簡(jiǎn)單的一行調(diào)用,但在架構(gòu)層面,它引入了嚴(yán)重的 Tight Coupling (強(qiáng)耦合)。這種做法不僅讓 ViewModel 暴露在 Memory Leak (內(nèi)存泄漏) 的風(fēng)險(xiǎn)下,更由于強(qiáng)依賴 Activity 實(shí)例,建立了一道 Testability Barrier (測(cè)試壁壘)。
這種 Manual Orchestration (手動(dòng)編排) 的模式,本質(zhì)上是讓 Activity 承擔(dān)了過多的非 UI 職責(zé),違背了 Separation of Concerns (關(guān)注點(diǎn)分離)?!?/p>


總結(jié):你的關(guān)鍵詞清單 (Cheat Sheet)

維度 關(guān)鍵詞 (English / 中文)
模式 Imperative (命令式) vs Declarative (聲明式)
耦合 Tight Coupling (強(qiáng)耦合) / Context Leakage (Context 泄露)
原則 Separation of Concerns (關(guān)注點(diǎn)分離) / DIP (依賴倒置)
維護(hù) Fat Activity (臃腫的 Activity) / Boilerplate (樣板代碼)
質(zhì)量 Testability (可測(cè)試性) / Robustness (魯棒性)

在 Senior 工程師的語境下,我們很少簡(jiǎn)單地使用“改代碼”這種詞。為了體現(xiàn)架構(gòu)眼界和對(duì)工程質(zhì)量的追求,需要使用更具“工業(yè)感”和“方法論”的表達(dá)。

以下是針對(duì)“代碼優(yōu)化”和“重構(gòu)”的專業(yè)表述建議:


1. 關(guān)于“重構(gòu)” (Refactoring) —— 側(cè)重結(jié)構(gòu)與質(zhì)量

當(dāng)你談?wù)撝貥?gòu)時(shí),重點(diǎn)應(yīng)放在“不改變外部行為的前提下,消除技術(shù)債”

  • 提升內(nèi)聚,降低耦合 (Enhancing Cohesion & Decoupling)

“這次重構(gòu)的核心是解耦。通過將權(quán)限邏輯抽離到獨(dú)立的 Observer 中,我們實(shí)現(xiàn)了 UI 與業(yè)務(wù)邏輯的關(guān)注點(diǎn)分離 (SoC)?!?/p>

  • 消除技術(shù)債 (Eliminating Technical Debt)

“這段舊代碼存在明顯的樣板代碼堆砌 (Boilerplate)。通過引入聲明式接口,我們有效清理了歷史遺留的技術(shù)債。”

  • 提升可維護(hù)性與可擴(kuò)展性 (Maintainability & Scalability)

“重構(gòu)的目標(biāo)是建立一套可擴(kuò)展的模式?,F(xiàn)在的架構(gòu)允許我們?cè)诓挥|動(dòng) Activity 核心邏輯的前提下,輕松增加新的觸發(fā)條件?!?/p>

  • 代碼壞味道 (Code Smells)

“我們識(shí)別并重構(gòu)了幾個(gè)關(guān)鍵的 Code Smells,比如長(zhǎng)方法(Long Method)和臃腫的類(Large Class)。”


2. 關(guān)于“優(yōu)化” (Optimization) —— 側(cè)重性能與健壯性

當(dāng)你談?wù)搩?yōu)化時(shí),重點(diǎn)應(yīng)放在“更少、更快、更穩(wěn)”。

  • 內(nèi)存腳印 (Memory Footprint)

“通過切斷 ViewModel 對(duì) Activity 的直接引用,我們顯著降低了內(nèi)存泄漏的風(fēng)險(xiǎn),優(yōu)化了應(yīng)用的內(nèi)存腳印?!?/p>

  • 響應(yīng)式流轉(zhuǎn) (Reactive Streamlining)

“我們將原有的命令式調(diào)用 (Imperative) 優(yōu)化為響應(yīng)式數(shù)據(jù)流 (Reactive Data Flow),確保了狀態(tài)的一致性?!?/p>

  • 性能增益 (Performance Gain)

“這種異步非阻塞的設(shè)計(jì)減少了主線程的負(fù)擔(dān),帶來了更流暢的 UI 響應(yīng)性。”

  • 魯棒性/健壯性 (Robustness)

“優(yōu)化后的邏輯能夠更好地處理邊界情況 (Edge Cases),比如在進(jìn)程被殺后依然能確保權(quán)限狀態(tài)的正確自愈?!?/p>


3. 在視頻腳本中如何“漂亮”地總結(jié)?

你可以用這一套組合拳來總結(jié)你的重構(gòu)行為:

“這次重構(gòu)不僅僅是代碼層面的清理 (Cleanup),更是一次設(shè)計(jì)范式的演進(jìn) (Paradigm Shift):從‘手動(dòng)維護(hù)狀態(tài)’轉(zhuǎn)向了‘自動(dòng)感知狀態(tài)’?!?/p>

關(guān)鍵詞對(duì)照表 (Senior Cheat Sheet)

普通說法 Senior 說法 (中文) 專業(yè)術(shù)語 (English)
把代碼拆開 邏輯解耦 / 職責(zé)拆分 Decoupling / SoC
刪掉沒用的代碼 精簡(jiǎn)樣板代碼 / 消除冗余 Refining Boilerplate
讓代碼更好測(cè) 提升可測(cè)試性 Enhancing Testability
以前容易崩 增強(qiáng)系統(tǒng)魯棒性 Strengthening Robustness
以前運(yùn)行慢 降低計(jì)算開銷 / 提升吞吐量 Reducing Overhead

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容