Java 伐木深度应该有多深? 为绘制场景,考虑以下逻辑省略服务

Java 伐木深度应该有多深? 为绘制场景,考虑以下逻辑省略服务,java,validation,logging,i18n,Java,Validation,Logging,I18n,问题是只有Validor本身知道验证失败的原因。我认为只有两种可行的方法可以利用这个理由。验证程序 记录故障条件本身 返回一个复杂对象,该对象包含一个字符串原因,布尔值为有效值 前者很好,但会让服务对是否实际执行日志记录一无所知,而后者则引入了恼人的冗余和更复杂的用法 还是有更好的方法?您必须问自己一个问题:您的客户是否关心验证失败的原因?答案是:视情况而定。在许多情况下,您希望准确地告知最终用户验证失败的原因。在这种情况下,返回“复杂”的验证结果对象(这里不要使用异常!),本质上是包装字符

问题是只有
Validor
本身知道验证失败的原因。我认为只有两种可行的方法可以利用这个理由。
验证程序

  • 记录故障条件本身
  • 返回一个复杂对象,该对象包含一个字符串原因,布尔值为有效值
前者很好,但会让
服务
对是否实际执行日志记录一无所知,而后者则引入了恼人的冗余和更复杂的用法


还是有更好的方法?

您必须问自己一个问题:您的客户是否关心验证失败的原因?答案是:视情况而定。在许多情况下,您希望准确地告知最终用户验证失败的原因。在这种情况下,返回“复杂”的验证结果对象(这里不要使用异常!),本质上是包装字符串或代码的集合(以允许)。
ValidationResult
对象将是一个业务对象,而不是一些二级助手

在其他情况下,您只需要根据对象是否有效来做出决定。调用代码(客户端)不能不关心验证的内部逻辑。它要么有效,要么无效。然后选择直线
boolean
方法。出于调试目的,在验证方法中添加日志记录。根据您的愿望打开/关闭它们

你知道最好的部分是什么吗?您可以有两种方法,并使用更适合客户端代码的方法。显然,较不复杂的
boolean
方法只会委托给更复杂的方法,并提供更简单的视图:


有见地的回答。特别是,服务是否需要传递原因。
public class Service {
   private Validator validator;

   public void submit(Foo foo) {
      if (!validator.isValid(foo)) {
         log.warn("invalid foo");
      } ...
   }
}
public interface Validator {
   boolean isValid(Foo foo);
}
boolean isValid(Foo foo) {
    validate(foo).isValid();
}

ValidationResult validate(Foo foo) {
    //logging and "real" validation
}