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/