首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

引入中介變數提升程式碼可讀性:重構實戰案例

     編輯:關於C語言

重構前:巢狀存取難閱讀

if (TIMER_STARTED == _handle->state_) {
    timer_handle_t next;

    if (g_timer_next == _handle) {
        g_timer_next = (timer_handle_t) dll_next(&g_bucket_firing->dll_, &_handle->node_);
    }
    next = (timer_handle_t) dll_next(&g_buckets[_handle->bucket_index_].dll_, &_handle->node_);
    if (0 != next) {
        next->round_ += _handle->round_;
    }
    dll_remove(&g_buckets[_handle->bucket_index_].dll_, &_handle->node_);
    if (g_buckets[_handle->bucket_index_].reentrance_ > 0) {
        g_bucket_firing->level_++;
    }
}

重構後:語意清晰、減少重複運算

if (TIMER_STARTED == _handle->state_) {
    timer_handle_t next;
    bucket_t *p_bucket = &g_buckets[_handle->bucket_index_];  // 中介指標

    if (g_timer_next == _handle) {
        g_timer_next = (timer_handle_t) dll_next(&g_bucket_firing->dll_, &_handle->node_);
    }
    next = (timer_handle_t) dll_next(&p_bucket->dll_, &_handle->node_);
    if (0 != next) {
        next->round_ += _handle->round_;
    }
    dll_remove(&p_bucket->dll_, &_handle->node_);
    if (p_bucket->reentrance_ > 0) {
        g_bucket_firing->level_++;
    }
}

改進效益

  • 可讀性:p_bucket 語意明確,取代冗長陣列索引
  • 效能:減少重複計算 _handle->bucket_index_ 及陣列索引
  • 維護性:若桶結構變更,只需修改一處
  • 除錯:中介變數可在除錯器直接觀察

通用原則

  1. 複雜表達式超過 2 層巢狀 → 提取中介變數
  2. 重複子表達式出現 ≥ 2 次 → 提取中介變數
  3. 命名要表達「業務含義」而非「資料結構路徑」
  4. 配合 const 防止意外修改

延伸:Clang-Tidy 自動重構

現代工具可自動偵測並建議提取:

// 啟用檢查
clang-tidy -checks='readability-*', 'performance-*' ...
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved