命名風格大比拚:為什麼一致性比選擇更重要?
好的命名是程式碼最廉價的文件。本文系統整理四大主流命名法、縮寫慣例、變數/函數/常數/巨集的具體規範,並給出跨團隊協作的決策框架。
四大命名法派系
| 命名法 | 特徵 | 範例 | 適用場域 |
| 匈牙利命名法 | 前綴編碼型別/屬性 + 首字大寫單詞 | lpszStr (長指標、以零結尾字串) | Windows API、MFC、COM、早期 Microsoft 技術棧 |
| 駝峰命名法 | 首字小寫,後續單詞首字大寫 | printEmployeePaychecks() | Java、JavaScript、C# 區域變數/方法、Swift、Go |
| 帕斯卡命名法 | 所有單詞首字大寫 | DisplayInfo(), UserName | C# 類別/屬性/公用方法、.NET 框架、TypeScript 介面 |
| 底線命名法 | 全小寫 + 底線分隔 | tic_init(), g_total_count | C 語言、Linux 核心、GNU 專案、Python (PEP 8)、Rust |
C/C++ 專案推薦規範(底線派系擴充)
1. 函數命名:模組_動作 或 模組_動作_對象
tic_init() // 模組 tic,動作 init
adc_is_busy() // 謂語 is_busy,模組 adc
uart_tx_char() // 模組 uart,動作 tx,對象 char
timer2_isr() // 中斷服務常式固定後綴 _isr
2. 變數命名:全小寫 + 底線
| 類別 | 前綴 | 範例 | 說明 |
| 區域變數 | 無 | length, test_offset | 單字母 i,j,k 限用於迴圈索引 |
| 臨時變數 | 無 | tmp | 短生命週期,勿濫用 |
| 靜態區域變數 | s_ | static int s_lastw; | 標示 static 儲存期 |
| 全域變數 (外部可見) | g_ | void (*g_capture_hook)(void); | 警示:跨檔案可見,需謹慎使用 |
| 全域變數 (模組內部) | s_ 或 無前綴 + static | static int s_module_state; | 檔案作用域,配合 static |
3. 常數與巨集:全大寫 + 底線,模組前綴防衝突
#define TIMER0_MODE_RELOAD 2
#define TIMER2_COUNT_RETRIEVE(val) ((uint16)(65536 - (val)))
// 類函數巨集採函數命名風格
#define timer2_clear() (TF2 = 0)
#define timer0_is_expired() (TF0)
常用英文縮寫對照表 (節錄)
| 完整單字 | 縮寫 | 完整單字 | 縮寫 |
| buffer | buf/buff | pointer | ptr |
| count | cnt | receive | recv |
| destination | dst/dest | source | src |
| initialize | init | temporary | tmp/temp |
| length | len | value | val |
| message | msg | index | idx |
| number | num | register | reg |
| previous | pre/prev | return | ret |
混合風格實務策略
- 專案統一:新專案立即在
CONTRIBUTING.md 或 .clang-format 定義標準,CI 強制檢查。
- 模組邊界隔離:第三方庫保持原風格,不要重構外部代碼命名,僅在介面層做適配。
- 語言慣例優先:C 用底線,C# 類別用帕斯卡/方法用駝峰,Java 全駝峰,Python 底線,Rust 類型帕斯卡/函數底線。
- 工具自動化:
clang-tidy、cpplint、golint、eslint、ruff 整合至編輯器與 CI。
避坑指南
- 避免
l (小寫 L) 與 1、O 與 0 混淆
- 避免僅大小寫區分:
count vs Count
- 避免保留字/關鍵字:
class、template、virtual
- 巨集名稱全大寫,防止與變數/函數衝突
- 布林變數建議
is_/has_/can_/should_ 前綴:is_valid, has_error
命名規範沒有銀彈,**一致性**才是核心價值。團隊共識 > 個人偏好,工具強制 > 口頭約定,漸進統一 > 一次性大重構。