在閱讀《專業嵌入式軟件開發》配套代碼時發現,部分函數因缺乏中間變量,導致單行代碼過長、嵌套層級深、可讀性極差。以下是重構前的片段:
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_ ++;
}
}
痛點:
• 重複出現 g_buckets[_handle->bucket_index_].dll_ 長表達式
• 邏輯分支混雜,難以快速定位關鍵操作
• 維護時修改桶索引極易出錯
p_bucketif (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_ ++;
}
}
| 維度 | 重構前 | 重構後 |
|---|---|---|
| 重複表達式次數 | 3 次 | 0 次(統一通過 p_bucket 訪問) |
| 單行最大字符數 | >120 | <80 |
| 修改桶索引風險 | 需同步修改 3 處 | 僅修改初始化行 |
| 閱讀認知負荷 | 高 | 低 |
p_bucket 明確表達「指向當前桶的指針」,優於 tmp、p 等無意義名稱x + y)且僅使用一次user.getAddress().getCity())總結:適度引入中間變量是「零成本」提升代碼可維護性的最有效手段之一,建議養成習慣。