“坑与抗坑”---我们要做个有“素质”的程序猿
产品代有这样的一段代码:
1、定义了一个定时任务的注册列表:
std::list<software_object*> _software_object_list; std::list<software_object*> _software_object_list;
2、线程以固定的周期调用、执行列表中注册的定时任务
std::list<software_object*>::iterator iter;
for (iter = _software_object_list.begin(); iter != _software_object_list.end(); ++iter)
{
(void)(*iter)->check();
}
3、需要新增定时任务,如下方式注册
obj = new TIMER_TASK_A(this);
if(obj == NULL)
{
return false;
}
_software_object_list.push_back(obj);
obj = new TIMER_TASK_B(this);
if(obj == NULL)
{
return false;
}
_software_object_list.push_back(obj);
//新增其它的定时功能TIMER_TASK_new在此注册。
4、看似很简单的机制,于是小H同学,在结尾处增加了一个xiao_h_new_add_timer定时任务注册,并验证该任务功能正常,就去happy了。
obj = new TIMER_TASK_B(this);
if(obj == NULL)
{
return false;
}
_software_object_list.push_back(obj);
obj = new xiao_h_new_add_timer(this);
if(obj == NULL)
{
return false;
}
_software_object_list.push_back(obj);
5、XXX天后,TIMER_TASK_B功能受损,查看日志及代码,系统中竟有这样的一处特殊处理:
if (pFrame->GetCmdCode() == GET_TZ_INFO_CMD)
{
TIMER_TASK_B* pTZ_monitor = dynamic_cast<TIMER_TASK_B*>(_software_object_list.back());
if(NULL == pTZ_monitor)
{
log_major("The last**_object is not TIMER_TASK_B!");
return;
}
pTZ_monitor->set_tz(pFrame);
}
6、 额,你可以注册新增定时任务,但是只能在中间注册, TIMER_TASK_B 必须放在最后,添加TIMER_TASK_B 特殊处理的程序猿,不舍得新增变量、 (亦或有更高的构思),但是又担心将别人坑的太惨,于是在遥远的地方增加了这样的一行日志, log_major("The last**_object is not TIMER_TASK_B!");
7、很不幸,小H同学在茫茫志(日志)海中,没有抓住这最后一颗救命稻草(log_major("The last**_object is not TIMER_TASK_B!");
8、怪谁呀?
坑的教训:我们要做一个有“素质”的程序猿,不想被坑,但也不要给别人挖坑。
抗坑的教训:同学,不要只关注自己功能,记得还要要看周边功能及系统中是否有新增的异常日志,其它诸如”战战兢兢如履薄冰“无需再提。
作者|韩小光
- 点赞
- 收藏
- 关注作者
评论(0)