許多開發者編程多年,對自己代碼卻缺乏自信。根因多為風格混亂導致可讀性差。本文總結跨語言 (C/C++/Java/Basic) 通用的良好風格原則,助你寫出「美麗」代碼。
// 好
int studentAge, teacherAge;
struct Student { int age; char *name; } // 結構體名已含 "Student" 語義
// 差
int age1, age2;
struct Student { int studentAge; char *studentName; } // 字段名冗餘
// 參數名要表達方向
void StringCopy(char *strSource, char *strDestination); // 一眼知誰拷貝給誰
// 好
if ((a > b) && (a < c))
// 差
if (a > b && a < c) // 功能相同但極難閱讀,易產生歧義
// 差:三元運算符嵌套三層
max = a > b ? (a > c ? a : c) : (b > c ? b : c)
// 好:展開為順序語句
max = a;
if (b > max) max = b;
if (c > max) max = c;
規則:if/for/while 體即使單行也加大括號,防止嵌套修改時出錯。
| 類型 | 正確寫法 | 錯誤寫法 | 原因 |
|---|---|---|---|
| boolean | if (flag) / if (!flag) | if (flag == true) | 布爾變量直接判斷最自然 |
| 整數 | if (value == 0) / if (value != 0) | if (value) / if (!value) | 後者誤導以為是布爾量 |
| 指針/引用 | if (ptr == NULL) / if (ptr != NULL) | if (ptr == 0) / if (ptr != 0) | NULL 語義明確,0 易混淆為整數 |
// 差:平行 if,邏輯不明、易出錯
if (cond1) ...
if (cond2) ...
if (cond3) ...
// 好:else-if 鏈,條理清晰、互斥明確
if (cond1) ...
else if (cond2) ...
else if (cond3) ...
// 適合場景可用 switch 替換
// 差:每次迭代調用 strlen
for (i = 0; i < strlen(name); i++)
// 好:循環外預計算
n = strlen(name);
for (i = 0; i < n; i++)
多重循環跳出、錯誤處理跳轉 (VB On Error GoTo) 等場景可用,但嚴禁濫用導致面條代碼。
// 差:100、99 毫無語義
for (i=0; i<100; i++); for (i=0; i<99; i++);
// 好:賦予語義名稱
#define MAX 100 // C 宏
const int MAX = 100; // C++/Java 常量
for (i=0; i
C 標準庫 getchar() 違反此則:名字暗示返回 char,實為 int (為容納 EOF)。導致:
char c = getchar(); // 自然但錯誤
if (c == EOF) ... // EOF 可能被截斷
設計時:函數名語義必須與返回類型匹配。
野指針 ≠ NULL 指針,指向「垃圾內存」,極其危險。兩大成因:
char *p = NULL; 或 char *str = malloc(100);free(p); p = NULL; / delete ptr; ptr = NULL; 防止誤用良好風格非一蹴而就,需在每次敲碼時堅持。上述十條原則語言無關,貫穿命名、表達式、控制流、類型語義、資源管理全維度。代碼是給人讀的,順帶能跑在機器上——這才是專業工匠的態度。