java - 验证 DTO 中的字段时如何避免重复的 if-else?

标签 java lambda

StudentDTO 类具有大约 20 个字符串属性,每个属性都需要根据下面注释中给出的逻辑来验证是否强制。这将使 update 方法变得冗长,并且 if else 过多。异常消息应根据属性评估而变化。此代码使用 Java 11。

  // all fields except lastUpdated  are string
    public Student populateStudent(final StudentDTO studentDTO) {
        Student student = new Student();
        boolean dataUpdated = false;
        /*
        If mandatory parameter is:
            1.) null : parameter is not updating
            2.) empty : validate and throw an exception
            3.) blank : validate and throw an exception
         */
        if (isEmptyOrBlank(studentDTO.getName())) {
            handleBadParam("Bad student name");
        } else {
            if (studentDTO.getName() != null) {
                student.setName(studentDTO.getName());
                dataUpdated = true;
            }
        }
        if (isEmptyOrBlank(studentDTO.getBirthday())) {
            handleBadParam("Bad student birthday");
        } else {
            if (studentDTO.getBirthday() != null) {
                student.setBirthday(studentDTO.getBirthday());
                dataUpdated = true;
            }
        }

        // .... 20 other similar if-else statements later ....

        // if atleast one parameter updated then date should update
        if (dataUpdated) {
            student.setLastUpdated(new Date());
        }
        return student;
    }

    private boolean isEmptyOrBlank(String name) {
        return name != null && (name.isEmpty() || isBlank(name));
    }

    private void handleBadParam(String messgae) {
        throw new IllegalArgumentException(messgae);
    }

    private boolean isBlank(String name) {
        return (name.trim().length() == 0);
    }

最佳答案

看来您正在验证您的对象。

我不会分享任何代码示例,我只会分享一个设计意见。顺便说一句,在设计应用程序时,您应该遵循设计原则。所以SOLID design principles是普遍接受的,您可以在设计应用程序时将这些原则应用到您的应用程序中。

您可以创建一个类似 StudentValidator 的类,因此它的工作必须只是验证 Student 对象。这样你就意识到了solid单一责任的首要原则。

而且 StudentValidator 类将具有您需要的验证方法。在完成所有这些实现之后,您可以为每个验证覆盖一个方法,或者您可以在需要时调用它们。

还有许多设计模式可以通过实现模式来避免 if-else 语句。像命令模式,使用枚举等。

关于java - 验证 DTO 中的字段时如何避免重复的 if-else?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55147428/

相关文章:

java - 如何在 Java 测试框架中隐藏页面对象初始化

java - getSupportFragmentManager() 在我的适配器类中不起作用?

Java 1.7,时钟格式不起作用

c# - LINQ to SQL where in(lambda语法)

c++ - 具有与 std::function 不同签名的 Lambda 函数

python - 被 sorted(..., key=lambda...) 搞糊涂了

c++ - 如何在自己的方法中使用 lambda 表达式

java关于处理字符异常

java - 网格线较粗的表格

c# - 具有 lambda 表达式的泛型