代码如下,将这一段代码优化了下
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里面了,这里出现了错误
{
BBB(msg);
VX_INFO_FUN_OUT();
return;
}
//理论上不会到这里,因为id.empty会会处理,这里做一个保护
if(U::isB(msg->msg_sender_)){
BBB(msg);
return;
}
#endif
错误原因:
1. 虽然在当前PROJECT_A的逻辑下,和原来的代码等效
2. 在不是PROJECT_A的逻辑时,这里就少了这个判断和退出的执行,虽然BBB(msg);消息仅在PROJECT_A中需要处理(其它项目不涉及,因此才做这个优化),但这个优化本身导致了问题
-------------在非PROJECT_A的项目时
if (id.empty())------------------------------这个分支缺失了
{
BBB(msg);
VX_INFO_FUN_OUT();
return;
}
考虑到BBB(MSB)仅在PROJECT_A中需要,因此,将代码回退,并将BBB(msg)做如下处理
#ifdef PROJECT_A
BBB
#else
BBB --------------------这里不做任何处理,保持现状
扩展:
1. 尽量将变化隔离
2. 隔离是整块(#ifdef $else #endif 隔离整个函数,而不是部分)而不是一个片段(这里仍不够好)有if(U::isB(msg->msg_sender_)){------------这个逻辑仍做的不够好
3. 最好避够这种通过项目宏隔离的方式-------------采用分支或是其它手段更好
#endif