当前位置: 首页 > 知识库问答 >
问题:

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

阚原
2023-03-14

我有一个方法,它做了相当多的验证,它正在发展失控。如果有任何关于如何最好地清理这种方法的建议,我将不胜感激。我使用的是Java 11,这个方法是spring boot微服务的一部分。

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);
    }
}

共有1个答案

谢鸿羲
2023-03-14

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

>

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

    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();
           }
       }
    

    希望这有帮助!

  •  类似资料:
    • 2023的秋招启动有一段时间了,今年有2个应届生的HC,最近项目不忙,连续2天面试下来,有些话想和2023的同学们聊一聊。 PS:我面试的是产品经理,也叫系统产品经理,也叫技术研发产品经理;一些关注点比较垂直于这个岗位。 1、2023的大环境,需要同学们多争取面试机会,寻找双方最适合的工作机会 今年的环境,想必大家都能感同身受 从我检索简历和安排面试来看,清北的硕士,C9联盟,QS200的同学,占

    • 在React中开发验证功能。我是一个新手,不想在学习的同时养成任何坏习惯,所以我正在寻找关于如何清理这里的代码块的建议。 该函数检查输入字段,如果它们为空,则将适当的消息附加到数组。检查所有输入字段后,如果该数组为空,则继续提交表单。如果该数组包含错误消息,则该消息将显示到屏幕(未显示) 只是在寻找清理我的条件语句的方法,如果可能的话!谢谢

    • 我可以简化、清理或组合这三个语句吗?? 、和是互斥的。但是,它们不是基于单个表达式,所以switch语句不能工作?我可以使用if-then-else结构吗?

    • 随着 IT 培训行业雨后春笋般崛起,码农的入门门槛越来越低,每年都会输出数十万码农,对于互联网整个行业来说,这是一件好事,能促进行业的整体发展,但是对于相关开发的从业者来说,程序员的竞争也越来越大。 并不是每一个人都适合软件开发,首先你要确认是否发自内心的热爱这个领域,而不是纯粹为了「高薪职业」。 即使互联网发展的再快,对于码农这个职业,一时半会也很难被取缔,这就像建筑工地的农民工一样,存在了几千

    • 我的新想法是使用9个点,围绕我的玩家对象,并检查这些点中的哪一个是在瓷砖的界限内。一个点在每个角落,每边和一个在中心。每种瓦片类型将使用一组不同的规则来处理冲突。 然而,每种瓦片类型都必须使用一组复杂的条件语句来进行冲突测试--可能过于复杂。有什么指导吗?

    • 我有一个场景,其中我得到一个String消息列表,我必须遍历String并调用另一个方法,这是一个长时间运行的过程。然后我必须收集这个长时间运行过程的结果并连接结果并将其发送回用户交互界面。我对Scala中的这些未来概念很陌生。我正在使用Play框架,其中字符串列表将来自用户交互界面。这是我第一次尝试实现ht场景的样子: 为简单起见,long RunningCall将只返回一个字符串。稍后我将把它