int nCntHttp = 0, nCntFtp = 0, nCntSmtp = 0, nCntSsh = 0;
新增協議需增變數、增 printf/assert,維護惡夢。
int nCntProto[4]; // 0:HTTP, 1:FTP, 2:SMTP, 3:SSH
可迴圈處理,但出現 **Magic Number** [2],順序變動即全線崩壞。
enum PROTO { PROTO_HTTP, PROTO_FTP, PROTO_SMTP, PROTO_SSH };
int nCntProto[4];
nCntProto[PROTO_SMTP]++; // 可讀、順序調整只改 enum
消除索引 Magic Number,但陣列大小 4 仍硬編碼。
enum PROTO {
PROTO_HTTP,
PROTO_FTP,
PROTO_SMTP,
PROTO_SSH,
PROTO_NUM // 自動等於元素個數 (此處為 4)
};
int nCntProto[PROTO_NUM]; // 無任何 Magic Number
// 遍歷
for (int i = 0; i < PROTO_NUM; ++i) print(nCntProto[i]);
新增協議只需在 PROTO_NUM 前插入枚舉值,PROTO_NUM 自動遞增,**所有用處零修改**。
// 配合 std::vector
std::vector vctCntProto(PROTO_NUM);
// 或 C++17 std::array
std::array arrCntProto{};
PROTO_NUM **必須置於枚舉末尾**。PROTO_HTTP = 80, PROTO_HTTPS = 443, PROTO_NUM → PROTO_NUM 將為 444,**不再等於個數**。此時應改用獨立 constexpr size_t PROTO_COUNT = 4;。