我正在开发一个应用程序,试图遵循六边形架构和干净架构的建议。将应用程序划分为层:基础设施、应用程序和模型。所有这一切都在关注我导入的包,并且在基础设施层中只存在与框架的依赖关系。
怀疑来自模型中的实现。大多数情况下,如果您验证字符串的最大大小或最大值和数字,您可以使用常量,如果在构造函数中不满足条件,则会引发异常:
@Value
public class UserName {
String value;
public UserName(String value) {
validate(value);
this.value = value;
}
private void validate(String value) {
if (value.length() > 100) {
throw new IllegalArgumentException();
}
}
}
问题是,如果我想参数化这些验证的最大值,或者在属性或数据库文件中,例如。该机制将与加载应用程序框架使用的数据的方式相结合。什么时候应该验证?
通过属性服务加载用例(应用层)中的值。例如:
public class CreateUser() {
private PropertiesService propertiesService;
public User create(String nameValue) {
UserName userName = new UserName(nameValue, propertiesService.getMaxNameLegth());
//...
}
}
@Value
public class UserName {
String value;
public UserName(String value, int maxValue) {
validate(value);
this.value = value;
}
private void validate(String value) {
if (value.length() > maxValue) {
throw new IllegalArgumentException();
}
}
}
或者创建一个验证器,将类传递给该验证器并验证其所有属性:
@Value
public class UserName {
String value;
public UserName(String value, int maxValue) {
this.value = value;
}
}
public interface UserNameValidator {
void validate(UserName userName);
}
public class UserNameValidatorImpl {
private PropertiesService propertiesService;
public void validate(UserName userName); {
if (userName.getValue().length() > propertiesService.getMaxNameLegth()) {
throw new IllegalArgumentException();
}
// validate all atributes
}
}
public class CreateUser() {
private UserNameValidator userNameValidator;
public User create(String nameValue) {
UserName userName = new UserName(nameValue);
userNameValidator.validate(userName);
//...
}
}
什么是最好的解决方案?最干净的?其他更好的可能性?谢谢。