Java 想要一些建议来清理一系列if语句吗

Java 想要一些建议来清理一系列if语句吗,java,refactoring,Java,Refactoring,我有一个方法,它做了大量的验证,它正在失控。如果您能就如何最好地清理这种方法提出建议,我将不胜感激。我使用的是Java11,这个方法是SpringBoot微服务的一部分 public void validateRequest(DepositRequest depositRequest, String transferId, String userId) { if (!Arrays.asList("REALTIME_PAYMENT", "ACCOUNT_PAY

我有一个方法,它做了大量的验证,它正在失控。如果您能就如何最好地清理这种方法提出建议,我将不胜感激。我使用的是Java11,这个方法是SpringBoot微服务的一部分

public void validateRequest(DepositRequest depositRequest, String transferId, String userId) {
    if (!Arrays.asList("REALTIME_PAYMENT", "ACCOUNT_PAYMENT").contains(depositRequest.creditTransfer()
            .getTransferInformation().getValue())) {
        logError(depositRequest, participantUserId, etransferId, INVALID_ACCOUNT_NUMBER);
        throw new ServerValidationException(INVALID_ACCOUNT_NUMBER, PAYMENT);
    }

    if (depositRequest.creditTransfer().getGroupHeader().getSettlementInformation().getClearingSystem() == null) {
        logSchemaValidationError(depositRequest, etransferId, participantUserId, "proprietary");
        throw new ServerValidationException(SCHEMA_VALIDATION_ERROR, PAYMENT);
    }

    if (depositRequest.creditTransfer().getGroupHeader().getInstructing()
            .getInstitutionIdentification().getMemberIdentification() == null) {
        logSchemaValidationError(depositRequest, etransferId, participantUserId, "member_identification");
        throw new ServerValidationException(SCHEMA_VALIDATION_ERROR, PAYMENT);
    }

    if (depositRequest.creditTransfer().getGroupHeader().getInstructed()
            cialInstitutionIdentification().getMemberIdentification() == null) {
        logSchemaValidationError(depositRequest, etransferId, participantUserId, "member_identification");
        throw new ServerValidationException(SCHEMA_VALIDATION_ERROR, PAYMENT);
    }

    if (depositRequest.creditTransfer().getTransferInformation().getCreditor().getName() == null) {
        logSchemaValidationError(depositRequest, etransferId, participantUserId, "creditor.name");
        throw new ServerValidationException(SCHEMA_VALIDATION_ERROR, PAYMENT);
    }

    if (depositRequest.creditTransfer().getTransferInformation().getDebtor().getName() == null) {
        logSchemaValidationError(depositRequest, etransferId, participantUserId, "debtor.name");
        throw new ServerValidationException(SCHEMA_VALIDATION_ERROR, PAYMENT);
    }

    if (depositRequest.authorization() != null) {
        if (depositRequest.authorization().getToken() == null ||
                authorization().getToken().length() < 1 ||
                authorization().getToken().length() > 35) {
        logSchemaValidationError(depositRequest, etransferId, participantUserId, "participant_authorization_token");
        throw new ServerValidationException(SCHEMA_VALIDATION_ERROR, PAYMENT);
        }
    }

    if (!isCreditorAccountIdentificationValid(depositRequest.creditTransfer().getTransferInformation().getIdentification())) {
        logSchemaValidationError(depositRequest, etransferId, participantUserId, "identification");
        throw new ServerValidationException(INVALID_ACCOUNT_INFO, PAYMENT);
    }

    if (!depositRequest.creditTransfer().getTransferInformation().getSettlementDate().equals(LocalDate.now())) {
        logSchemaValidationError(depositRequest, etransferId, participantUserId, "settlement_date");
        throw new ServerValidationException(SCHEMA_VALIDATION_ERROR, PAYMENT);
    }
}
public void validateRequest(存款请求存款请求、字符串传输ID、字符串用户ID){
如果(!Arrays.asList(“实时付款”,“帐户付款”)包含(存款请求.贷记转账()
.getTransferInformation().getValue()){
日志错误(depositRequest、participantUserId、etransferId、无效的帐户号);
抛出新的ServerValidationException(无效的帐户号、付款);
}
if(depositRequest.creditTransfer().getGroupHeader().getSettlementInformation().getClearingSystem()==null){
logSchemaValidationError(depositRequest、etransferId、participantUserId,“专有”);
抛出新的ServerValidationException(模式\验证\错误,付款);
}
if(存款请求.creditTransfer().getGroupHeader().getInstructing())
.getInstitutionIdentification().getMemberIdentification()=空){
logSchemaValidationError(存款请求、etransferId、参与者用户ID、“成员标识”);
抛出新的ServerValidationException(模式\验证\错误,付款);
}
如果(存款请求.creditTransfer().getGroupHeader().getInstructed())
cialInstitutionIdentification().getMemberIdentification()==null){
logSchemaValidationError(存款请求、etransferId、参与者用户ID、“成员标识”);
抛出新的ServerValidationException(模式\验证\错误,付款);
}
if(DepostRequest.creditTransfer().getTransferInformation().GetCredit().getName()==null){
LogSchemaValidationOnError(存款请求、etransferId、participantUserId、“债权人名称”);
抛出新的ServerValidationException(模式\验证\错误,付款);
}
if(DepostRequest.creditTransfer().getTransferInformation().GetDebter().getName()==null){
LogSchemaValidationOnError(存款请求、etransferId、participantUserId、“债务人名称”);
抛出新的ServerValidationException(模式\验证\错误,付款);
}
if(存款请求.授权()!=null){
if(DepostRequest.authorization().getToken()==null||
授权().getToken().length()<1||
授权().getToken().length()>35){
LogSchemaValidationOnError(存款请求、etransferId、participantUserId、“参与者授权令牌”);
抛出新的ServerValidationException(模式\验证\错误,付款);
}
}
如果(!isCreditorAccountIdentificationValid(depositRequest.creditTransfer().getTransferInformation().getIdentification())){
logSchemaValidationError(存款请求、etransferId、参与者用户ID、“标识”);
抛出新的ServerValidationException(无效的帐户信息、付款);
}
如果(!depositRequest.creditTransfer().getTransferInformation().getSettlementDate().equals(LocalDate.now())){
logSchemaValidationError(存款请求、etransferId、参与者用户ID、“结算日”);
抛出新的ServerValidationException(模式\验证\错误,付款);
}
}

简单的代码就是好代码。您当前的代码易于理解和维护。所以我不必急于改变它。但如果你愿意,你可以:

  • 在单独的私有方法中执行每个验证,只需调用主验证方法中的每个方法

    public void validateRequest(DepositRequest depositRequest, String transferId, String userId) {
     validateAccountNumber(depositRequest,transferId, userId);
        ...
    }
    
    private void validateAccountNumber(DepositRequest depositRequest, String transferId, String userId) {
        ...
    }
    
  • 您可以想象并创建一个验证程序接口

    public interface Validator {
         void validate(DepositRequest depositRequest, String transferId, String userId);
    }
    
    public class AccountIDValidator implements Validator {
         public void validate(DepositRequest depositRequest, String transferId, String userId){
              ...
          }
     }
    
  • 然后,为每个验证创建此接口的实例,并将它们放在列表中,以便验证成为

       List<Validator> validators=Arrays.asList(new AccountIDValidator(),...);
    
       public void validateRequest(DepositRequest depositRequest, String transferId, String userId) {
           for (Validator v:validators){
              v.validate();
           }
       }
    
    List validators=Arrays.asList(新AccountIDValidator(),…);
    public void validateRequest(存款请求存款请求、字符串transferId、字符串userId){
    for(验证器v:验证器){
    v、 验证();
    }
    }