最近在作一个项目,该项目原来是由C++编写的,如今须要翻译成Java,在翻译过程当中,同事没有理解清楚具体需求,在开发中进行了直译,直到生产上出现故障了(测试竟然没测出来?)一块儿研究才发现...java
先看一下C++代码的样子测试
//vector<CorBillGroup>& vCorBillGroups
while(rs->next()){
if(load(rs,bill)){
//判断分组
corId = pm->getCorpId(bill.getPartyRoleId(),bill.getBillingCycleId());
if (corId < 0)
throw BusinessLogicException("找不到银行划扣分组ID", corId);
int i=0;
for ( i=0;i<vCorBillGroups.size();i++) {
if(vCorBillGroups[i].getCorperationId() == corId){
vCorBillGroups[i].add(bill);
break;
}
}
if(i == vCorBillGroups.size()) {
CorBillGroup corBillGroup;
corBillGroup.setCorperationId(corId);
corBillGroup.add(bill);
vCorBillGroups.push_back(corBillGroup);
}
}
}
复制代码
而后看一下同事翻译的初版的样子spa
for (VirtualBillVO vo : bills) {
long partyRoleId = vo.getPartyRoleId();
Partner partner = getPartnerManager().getPartner(Integer.parseInt(partyRoleId + ""));
corId = partner.getCorpId();
if (corId < 0) {
throw new BusinessLogicException("找不到银行划扣分组ID", corId);
}
int i = 0;
for (CorBillGroupVO corVo : vCorBillGroups) {
i++;
if (corVo.getM_iCorperationId() == corId) {
corVo.add(vo);
break;
}
}
if (i == vCorBillGroups.size()) {
CorBillGroupVO corBillGroup = new CorBillGroupVO();
corBillGroup.setM_iCorperationId(corId);
corBillGroup.add(vo);
vCorBillGroups.add(corBillGroup);
}
}
复制代码
先不考虑这里具体是干啥的,单纯从代码结构的角度来看,彷佛代码是没啥问题的。可是程序可不是看代码结构的! 因为C++代码有具体业务含义,简单介绍一下这段代码的背景:给一组帐单(bills),按照运营商(corId)进行分组后返回。这么简单的需求,也不知道C++代码为啥写的这么复杂,这也致使翻译这段代码的同事犯了糊涂。翻译
最简单的解决方式就是如上述分析同样,将i++放在break条件以后便可,可是分组代码真的要写这么晦涩吗?见仁见智了...code
不多有人真的去注意for循环条件执行的顺序,以及i++和++i的区别,我老大在看到这段代码的时候也犹豫了一下,后来才恍然大悟怀疑这个i++在break以后是否有执行,测试了一下才肯定本身的想法。平时这种代码可能都是不会有问题的,可是一旦触发了某种边界条件,就不必定是你想象的样子了。因此在写代码以前,仍是要明确本身要实现的功能是什么,若是同事最开始翻译代码的时候明确知道这是一段分组代码,我相信他绝对不会这样去写的!开发