java—重构稍有不同的ifs序列

bvk5enib  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(340)

我有一个类,其中有重复的代码,但略有不同:

public class ServiceImpl implements Service {
  @Autowired
  private OtherService otherService;

  private static final int IN_ERROR_1 = 250;
  private static final int IN_ERROR_2 = 1000;
  private static final int IN_ERROR_3 = 251;
  private static final int IN_ERROR_4 = 252;
  private static final int IN_ERROR_5 = 253;

  public String determineField(String value) {
    ResponseDTO response = otherService.determineField(value);
    if(response.getStatus != Status.OK) {
      if(response.getRetCode() == IN_ERROR_1)
        throw new CustomException(OutError.TECH_ERROR);
      if(response.getRetCode() == IN_ERROR_2)
        throw new CustomException(OutError.TECH_ERROR);

      if(response.getRetCode() == IN_ERROR_3)
        throw new CustomException(OutError.FUNC_ERROR);
      if(response.getRetCode() == IN_ERROR_4)
        throw new CustomException(OutError.FUNC_ERROR);
      if(response.getRetCode() == IN_ERROR_5)
        throw new CustomException(OutError.FUNC_ERROR);
    }
    return response.getField();
  }

  public Coords processValues(String value, String otherValue) {
    Coords coords = new Coords();
    ResponseDTO response = otherService.process(value, otherValue);
    if(response.getStatus != Status.OK) {
      if(response.getRetCode() == IN_ERROR_1)
        throw new CustomException(OutError.TECH_ERROR);
      if(response.getRetCode() == IN_ERROR_2)
        throw new CustomException(OutError.TECH_ERROR);

      if(response.getRetCode() == IN_ERROR_3)
        throw new CustomException(OutError.TECH_ERROR); // DIFFERENT OUT ERROR TYPE FOR IN_ERROR_3 !
      if(response.getRetCode() == IN_ERROR_4)
        throw new CustomException(OutError.FUNC_ERROR);
      // MISSING IN_ERROR_5 CASE !
    } else {
      coords.setCode(response.getCode());
      coords.setName(response.getName());
    }
    return coords;
  }
}

所以在这里我尝试重构错误处理,在这个类中,它实际上更大(更多的错误代码)并且重复了不止一次。事实上,类的大部分都是错误处理。
以下是我尝试过的:我最初想重构它,将错误处理放在一个方法中,并使用一些Map来获取out错误类型。但那是在我注意到细微差别之前。现在看来我无法按照我想要的方式重构。
有没有其他我没有考虑过的重构方法?

axzmvihb

axzmvihb1#

可以为每个错误代码构建Map,但略有不同。

static class Key {

    private final int code;
    private boolean discriminator;

    private Key(int code, boolean discriminator){
        this.code = code;
        this.discriminator = discriminator;
    }

    public static Key fromCode(int code){
        return new Key(code, false);
    }

    public static Key fromCodeAndDiscriminator(int code){
        return new Key(code, true);
    }

    // hashCode/equals...

}

  Map<Integer, Exception> map = Map.of(
       Key.fromCode(250),                 new CustomException(OutError.TECH_ERROR),
       Key.fromCode(1000),                new CustomException(OutError.FUNC_ERROR),
       Key.fromCode(251),                 new CustomException(OutError.FUNC_ERROR),
       Key.fromCodeAndDiscriminator(251), new CustomException(OutError.TECH_ERROR)
       .....
  )

现在您可以在呼叫端轻松区分它们。如果有更多需要区别对待的案例(例如,还有一个案例 251 可能Map到另一个案例),您需要 enum 作为鉴别器,而不是 boolean .

相关问题