雜談
代碼如下,將這一段代碼優(yōu)化了下
string id = AAA(msg->msg_sender_);
if (id.empty())
{
BBB(msg);
VX_INFO_FUN_OUT();
return;
}
#ifdef PROJECT_A
//理論上不會到這里,因為id.empty會會處理,這里做一個保護
if(U::isB(msg->msg_sender_)){
BBB(msg);
return;
}
#endif
如下
string id = AAA(msg->msg_sender_);
#ifdef PROJECT_A
if (id.empty())------------------------------將這一段放到 PROJECT_A里面了,這里出現(xiàn)了錯誤
{
BBB(msg);
VX_INFO_FUN_OUT();
return;
}
//理論上不會到這里,因為id.empty會會處理,這里做一個保護
if(U::isB(msg->msg_sender_)){
BBB(msg);
return;
}
#endif
錯誤原因:
1. 雖然在當(dāng)前PROJECT_A的邏輯下,和原來的代碼等效
2. 在不是PROJECT_A的邏輯時,這里就少了這個判斷和退出的執(zhí)行,雖然BBB(msg);消息僅在PROJECT_A中需要處理(其它項目不涉及,因此才做這個優(yōu)化),但這個優(yōu)化本身導(dǎo)致了問題
-------------在非PROJECT_A的項目時
if (id.empty())------------------------------這個分支缺失了
{
BBB(msg);
VX_INFO_FUN_OUT();
return;
}
考慮到BBB(MSB)僅在PROJECT_A中需要,因此,將代碼回退,并將BBB(msg)做如下處理
#ifdef PROJECT_A
BBB
#else
BBB --------------------這里不做任何處理,保持現(xiàn)狀
擴展:
1. 盡量將變化隔離
2. 隔離是整塊(#ifdef $else #endif 隔離整個函數(shù),而不是部分)而不是一個片段(這里仍不夠好)有if(U::isB(msg->msg_sender_)){------------這個邏輯仍做的不夠好
3. 最好避夠這種通過項目宏隔離的方式-------------采用分支或是其它手段更好
#endif

浙公網(wǎng)安備 33010602011771號