C 語言程序由函數組成,**每個函數實現單一、獨立、內聚的功能**。這是結構化程序設計的基石,直接決定代碼的可讀性、可測試性、可維護性。
| 反模式(大雜燴函數) | 正模式(單一職責函數) |
|---|---|
void process_all() { input(); calc(); sort(); print(); save(); } | void input(); void calc(); void sort(); void print(); void save(); |
| 改一處牽一身、難以單元測試、變量作用域混亂 | 各司其職、可獨立測試、可復用、可並行開發 |
// 只負責判斷邏輯,不做 I/O,不打印
bool is_triangle(int a, int b, int c) {
return a + b > c && a + c > b && b + c > a;
}
// 只負責讀取三邊長,返回讀取狀態
bool read_sides(int *a, int *b, int *c) {
return scanf("%d %d %d", a, b, c) == 3;
}
// 只負責格式化輸出結果
void print_result(bool ok) {
puts(ok ? "能構成三角形" : "不能構成三角形");
}
// main 只串聯流程
int main() {
int a, b, c;
if (read_sides(&a, &b, &c)) {
print_result(is_triangle(a, b, c));
} else {
fputs("輸入格式錯誤\n", stderr);
}
return 0;
}
const,輸出用指針,錯誤碼用返回值。bool/int 錯誤碼,或輸出參數帶回結果,避免全局 errno。關鍵資源申請必檢查返回值。// triangle.h —— 對外接口契約
#ifndef TRIANGLE_H
#define TRIANGLE_H
#include
bool is_triangle(int a, int b, int c);
bool read_sides(int *a, int *b, int *c);
void print_result(bool ok);
#endif
// triangle.c —— 內部實現細節
#include "triangle.h"
#include
// ... 實現同上 ...
// main.c —— 使用者
#include "triangle.h"
int main() { ... }
✅ **編譯防火牆**:修改 triangle.c 內部算法,無需重編譯 main.c(只需重鏈接)。
| 誤區 | 正確做法 |
|---|---|
| 「函數越多越好」 | 粒度適中:邏輯完整、可復用才拆分。單行代碼不必封裝函數。 |
| 「全局變量方便傳數據」 | **嚴禁**跨函數通信用全局變量。參數傳遞、返回值、結構體指針是正道。 |
| 「靜態函數不用聲明」 | 文件內部函數**必須加 static**,限制作用域,防止符號衝突,利於編譯器優化。 |
| 「遞歸比迴圈高級」 | 遞歸適合分治(樹、圖、分治算法),簡單迴圈用迴圈,避免棧溢出、性能損耗。 |