為提升軟體重用性、可讀性與維護性,建立嚴謹的模組化開發規範至關重要。本文整理自實務專案經驗,涵蓋函數規模控制、重複代碼消除、介面設計原則、分層重構範例,並提供完整的錯誤代碼體系 (HRESULT 風格) 與函數模板範本,可直接套用於團隊開發標準。
重構前:cmGetSomething 內含開檔、讀取、關檔邏輯。新需求需支援傳入已開啟的 CFile*。
重構後:
// 低層通用讀取函數
long cmReadSomething(CFile* pFile) {
if (!pFile) return CM_POINTER_IS_NULL;
// 核心讀取邏輯...
return CM_OK;
}
// 高層封裝:開檔 → 呼叫低層 → 關檔
long cmGetSomething(const char* pszFileName) {
CFile* pFile = new CFile(pszFileName, CFile::modeRead);
if (!pFile) return CM_POINTER_IS_NULL;
long lResult = cmReadSomething(pFile);
IF_ERROR_GOTO_END; // 巨集:失敗跳轉 END
delete pFile;
END:
return lResult;
}
關鍵點:核心邏輯下沉,高層僅負責資源獲取/釋放與錯誤傳遞。
採用 COM 風格 HRESULT 結構:Severity(1) | Customer(1) | Reserved(1) | Facility(11) | Code(16)。
// 設施代碼
#define FACILITY_CM 0x80 // 通用模組
#define FACILITY_VR 0x81 // 虛擬實境
#define FACILITY_IMG 0x82 // 影像處理
// 類別代碼 (高 6 bits)
#define MEMORY_CLASS 0x01
#define FILE_CLASS 0x02
// 錯誤碼產生巨集
#define CMEMAKEHR(code) MAKE_HRESULT(SEVERITY_ERROR, FACILITY_CM, (0x38<<10)|code)
// 常用錯誤碼
#define CM_OK S_OK
#define CM_MEM_ALLOC_FAIL CMEMAKEHR(0x001)
#define CM_INVALID_POINTER CMEMAKEHR(0x003)
#define CM_OPEN_FILE_FAIL CMEMAKEHR(0x011)
#define CM_READ_FILE_FAIL CMEMAKEHR(0x017)
#define CM_PARAM_BEYOND CMEMAKEHR(0x030)
#define CM_CONNECT_FAIL CMEMAKEHR(0x700)
// ... 更多定義見原文
// 自動檢查並跳轉
#define IF_ERROR_GOTO_END if (FAILED(lResult)) goto END;
// 運行時顯示中文/英文訊息
static RESULTINFOS sResultInfo[] = {
{CM_MEM_ALLOC_FAIL, "記憶體配置失敗", "Memory Alloc Failed"},
{CM_OPEN_FILE_FAIL, "檔案開啟失敗", "Open File Failed"},
// ...
};
void DisplayChineseMessage(HRESULT hr) {
MessageBox(NULL, GetChineseMessage(hr), "錯誤", MB_OK);
}
HRESULT lResult = CM_OK、goto END 錯誤處理、SAFE_DELETE 巨集防止重複釋放。模組化不只是拆分函數,更是一套介面契約、錯誤傳遞、資源管理、文件同步的完整工程紀律。導入統一的 HRESULT 體系、函數模板與巨集輔助,能讓團隊程式碼風格一致、除錯效率倍增、維護成本大幅降低。建議將本規範納入專案《開發手冊》,並配合 Code Review 強制執行。