代碼是給人讀的,順便能在機器上運行。優雅代碼不僅減少BUG,更降低維護成本。本文從十個維度闡述編寫美麗代碼的核心原則。
student_age, teacher_age — 語義自明age1, age2 — 需腦補上下文避免冗餘:結構體內成員無需重複類型前綴
// 違例
struct Student { int student_age; char *student_name; };
// 推薦
struct Student { int age; char *name; }; // 結構體名已表達語境
參數名要表達意圖:StringCopy(char *strSource, char *strDestination) 瞬間明確拷貝方向。
單字符變量:i,j,k 限用於循環計數等極局部範圍。
// 好:括號明確分組
if ((a | b) && (a & c))
// 差:依賴默認優先級,極難閱讀
if (a | b && a & c)
熟記優先級表不現實,團隊協作中顯式括號是專業素養。
// 過度復合:三層三元運算符嵌套
max = a > b ? (a > c ? a : c) : (b > c ? b : c);
// 清晰版:順序邏輯,易擴展、易調試
max = a;
if (max < b) max = b;
if (max < c) max = c;
單語句也加大括號:if (...) { ... } 防止後期維護添加語句時漏加括號導致邏輯錯誤。
| 類型 | 推薦寫法 | 避免寫法 | 理由 |
|---|---|---|---|
| 布爾 | if (flag) / if (!flag) | if (flag == TRUE) | TRUE值無統一標準(VC++=1, VB=-1) |
| 整型 | if (value == 0) / if (value != 0) | if (value) | 避免誤解為布爾語義 |
| 指針 | if (p == NULL) / if (p != NULL) | if (p == 0) | NULL語義明確,0易混淆整型 |
C++11+建議用nullptr替代NULL。
// 箭頭型嵌套:難讀、難維護
if (cond1) {
if (cond2) {
if (cond3) { ... }
}
}
// if-else-if鏈:結構清晰
if (cond1) { ... }
else if (cond2) { ... }
else if (cond3) { ... }
// 多條件分支:優先考慮switch
switch (value) {
case 1: ... break;
case 2: ... break;
default: ...;
}
// 差:i++; // i加1
// 好:// 此處跳過已處理的標記位,避免重複計算
i++;
代碼自解釋優於註釋;復雜演算法、業務規則、非顯而易見決策必須註釋。
優雅代碼非天賦,而是習慣與紀律的產物。從命名開始,用專業標準要求自己,代碼庫自然演進為藝術品。