魔數 指在程式碼中直接使用字面數值(如 64),而非透過巨集(#define)或常數(const)賦予語義名稱。這看似微不足道,實則是維護噩夢的溫床。
#define MIN_MSK_LEN 20
int adjustMsk(MskContext *Context)
{
char temp[64] = {0}; // 魔數 64:MSK 最大位元組數
if (Context->lenMsk > 64) { // 魔數 64 再次出現
memcpy(temp, Context->msk + (Context->lenMsk - 64), 64); // 第三次
// ...
memcpy(Context->msk, temp, 64); // 第四次
}
else if (Context->lenMsk < MIN_MSK_LEN) // 唯一使用常數的地方
return ERROR;
// ...
}
64 無法立即理解其業務含義;註解易過時、不同步,不如常數名稱直觀。64,極易漏改或誤改。#define MIN_MSK_LEN 20
#define MAX_MSK_LEN 64 // 語義化命名
int adjustMsk(MskContext *Context)
{
char temp[MAX_MSK_LEN] = {0};
if (Context->lenMsk > MAX_MSK_LEN) {
memcpy(temp, Context->msk + (Context->lenMsk - MAX_MSK_LEN), MAX_MSK_LEN);
// ...
memcpy(Context->msk, temp, MAX_MSK_LEN);
}
else if (Context->lenMsk < MIN_MSK_LEN)
return ERROR;
// ...
}
constexpr 或 const:具型別安全、作用域限制、除錯可見性優於巨集。constants.h 或命名空間,便於維護與複用。MAX_/MIN_/DEFAULT_ 前綴,語義一目瞭然。「魔數」之「魔」,非魔法之神奇,乃魔鬼般可怕。養成「見數值即定義常數」的習慣,是專業工程師的基本素養。
本文出自 “至簡李雲” 博客,請務必保留此出處:https://yunli.blog.51cto.com/831344/265730