美文网首页
关于修改代码逻辑思路

关于修改代码逻辑思路

作者: 我就要取名叫夏末 | 来源:发表于2018-08-06 09:48 被阅读0次

    周末在家突然想到之前写的代码处理逻辑有问题,心痒难耐终于熬到周一,可以修改了。
    代码背景是根据传入的数据,获取特定字段,比如hagkDealerId,到对应的数据库里查询是否已经同步过该数据。

    //判断hage数据库t_hage_dealer中是否已存在该经销商,d.getIsSynced()可能有三种情况,0,1,null
    DealerEntity d = dealerRepository.findFirstByHawkDealerId(String.valueOf(dealerId.get("hawkDealerId")));
              if (d!=null) {
                  continue;
              }
    

    可以说非常简单粗暴了,查不到数据,说明没同步,继续往下走。查到有数据,说明同步过,结束本次循环。

    我使用isSynced来标记数据的同步状态,0为未同步至电商平台,同步至电商平台后,根据获取电商平台返回值并修改同步标记0→1,表示同步成功。
    所以查询出来的d.getIsSynced(),其实会有三种情况。0,1,null:
    0对应同步至hage但没有成功同步到电商平台的状态,可能是数据有问题;
    1表示数据已经成功同步到电商平台;
    null表示这次的数据为新数据;

    所以原先的判断显然是不对的,如果操作人员修正了有问题的数据,尝试重新同步时,会因为之前有数据不为空而直接跳过。

    //判断hage数据库t_hage_dealer中是否已存在该经销商,d.getIsSynced()可能有三种情况,0,1,null
    DealerEntity d = dealerRepository.findFirstByHawkDealerId(String.valueOf(dealerId.get("hawkDealerId")));
              if (d.getIsSynced()==0) {
                     dealerRepository.delete(d);
              }else if(d.getIsSynced()==1){
                     continue;
              }
    

    如果查询到的同步标记为0,那就删掉数据库中的原数据,重新同步;
    如果查询到的同步标记为1,跳出本次循环;
    如果未查询到数据,不受影响继续同步;

    这种情况下,如果数据库中没有数据,即为null的情况,尝试获取其isSynced值,会报空指针异常。
    于是做如下改动:

    //判断hage数据库t_hage_dealer中是否已存在该经销商,d.getIsSynced()可能有三种情况,0,1,null
     DealerEntity d = dealerRepository.findFirstByHawkDealerId(String.valueOf(dealerId.get("hawkDealerId")));
                            if (d==null){
                                insertDealer(dealerEntity,dealerId);
                            }else if(d.getIsSynced()==0) {
                                dealerRepository.delete(d);
                                insertDealer(dealerEntity,dealerId);
                            }else if(d.getIsSynced()==1){
                                continue;
                            }
    

    其中insertDealer()方法是【把经销商数据保存在hage数据库t】的动作抽象出来形成的方法。

    对于数据处理的思考:
    应该考虑到数据状态的所有可能性,并对每一种不同可能性的情况都做出相应的处理。不能简单笼统地一刀切处理数据。

    另外一开始以为根据字段查出来数据库中值,赋值给d后,删除d只是把表层的d删除了,不会对数据库中的数据有影响。
    但是dealerRepository.delete(d),这个操作,直接映射数据库,把数据库里的数据也删除了,可谓是触及灵魂深处的操作,233333

    相关文章

      网友评论

          本文标题:关于修改代码逻辑思路

          本文链接:https://www.haomeiwen.com/subject/vokwvftx.html