重构多个 || java 中 If 语句中的 && 条件

To refactor multiple || and && conditions inside If statement in java

重构多个|| java

中 If 语句中的 && 条件

重构多个|| java

中 If 语句中的 && 条件

重构多个|| java

中 If 语句中的 && 条件
for (Student students : studentList) {

    if ((Constants.CODE1.equals(students.getactivities().getCode())
            && ValidationRepository.validateStudentId1(department.getId()))
            || ((Constants.CODE2).equals(students.getactivities().getCode())
                    && ValidationRepository.validateStudentId2(department.getId())
                    && ValidationRepository.validateStudentId3(department.getId()))
            || ((Constants.CODE3
                    .equals(students.getactivities().getCode())
                    || Constants.CODE4
                            .equals(students.getactivities().getCode()))
                    && (ValidationRepository.validateStudentId4(
                            department.getId(),
                            students.getactivities().getCode())))
            || ((Constants.CODE5.equals(students.getactivities().getCode())
                    || Constants.CODE6
                            .equals(students.getactivities().getCode())

                    || Constants.CODE7
                            .equals(students.getactivities().getCode())
                    || Constants.CODE15
                            .equals(students.getactivities().getCode())

                    || Constants.CODE8
                            .equals(students.getactivities().getCode())
                    || Constants.CODE9
                            .equals(students.getactivities().getCode())

                    || Constants.CODE10
                            .equals(students.getactivities().getCode())
                    || Constants.CODE11
                            .equals(students.getactivities().getCode()))

                    && (ValidationRepository.validateStudentId4(
                            department.getId(),
                            students.getactivities().getCode())))

    )
    { 
        some statements
    }

我给你一个建议:

  1. 我相信你可以包含列表中的所有代码并检查天气 students.getactivities().getCode() 是否存在于列表中。
listOf(Constants. CODE7, Constants.CODE8, Constants.CODE9 ...).contains(students.getactivities().getCode());
  1. 您还应该将代码块提取到外部方法:
private validateStudentWithCode1(Students students) 
{
return Constants.CODE1.equals(students.getactivities().getCode())
                         && ValidationRepository.validateStudentId1(department.getId());
}

这个问题没有明确的答案,但我有以下建议:

  1. 不要每次都调用students.getactivities().getCode()。它不仅降低了代码的可读性,而且效率低下。 (除非此方法不会 return 每次都具有相同的值!) 而是在 if 语句之前使用变量:
int code = students.getactivities().getCode();

然后,您可以随时引用该变量。 department.getId().

也可以这样做
  1. 您可以使用辅助方法来避免将该代码与多个常量进行比较,如下所示:
private boolean matchesAny(int code, int... possibleMatches) {
    for (int match: possibleMatches) {
        if (code == match) return true;
    }
    return false;
}

这样,您的代码将如下所示:

    int departmentId = department.getId();
    for (Student students : studentList) {
        int code = students.getactivities().getCode();
        // Case 1
        if ((Constants.CODE1.equals(code)
                && ValidationRepository.validateStudentId1(departmentId))
                // Case 2
                || (Constants.CODE2.equals(code)
                && ValidationRepository.validateStudentId2(departmentId)
                && ValidationRepository.validateStudentId3(departmentId))
                // Case 3
                || (matchesAny(code, Constants.CODE3, Constants.CODE4)
                && ValidationRepository.validateStudentId4(departmentId, code))
                // Case 4
                || (matchesAny(code,
                    Constants.CODE5,
                    Constants.CODE6,
                    Constants.CODE7,
                    Constants.CODE8,
                    Constants.CODE9,
                    Constants.CODE10,
                    Constants.CODE11,
                    Constants.CODE15)
                && ValidationRepository.validateStudentId4(departmentId, code))) {
            // some statements
        }
    }
    // rest of method

private boolean matchesAny(int code, int... possibleMatches) {
    for (int match : possibleMatches) {
        if (code == match) return true;
    }
    return false;
}

还是不漂亮,但已经好多了。为了让它变得更好,您可以尝试将 4 个案例变成单独的语句,然后让它们都调用相同的代码。

创建一个方法来验证学生 在方法内部创建常量代码和验证 repo 函数的映射

public boolean validateStudent(String constantCode, departmentId){
Map<String, Boolean> map = new HashMap<>();
map.put(Constants.CODE1,  
ValidationRepository.validateStudentId1(departmentId));
map.put(Constants.CODE2,  
ValidationRepository.validateStudentId2(departmentId));

if(map.containsKey(constantCode)){
        return map.get(operation);
    
    }
    
    return false;


 }

现在你可以像下面这样调用验证方法

validateStudent(constantCode, departmentId)

在内部,常量代码键的映射值将是您的函数。 确保在映射中使用相同的方法参数名称和键值。