【问题标题】:avoid using if clause避免使用 if 子句
【发布时间】:2015-07-10 20:14:10
【问题描述】:

我正在尝试在我的系统中记录信息。每当记录时,我都会检查状态是否有效,然后才记录该信息。

//doing this logging all over the place in my code base. 
if(checkIsValid){
  Object obj =new Object(string1,Integer2,........String10);
  log(obj);
}

这里的问题是如何重构我的代码,这样我就不必到处重复这段代码来记录日志了。

其中一个解决方案是我可以写一个这样的补充方法。

 method(String1,Integer2,......String10){
  if(checkIsValid){
  Object obj =new Object(string1,Integer2,.........String10);
  log(obj);
  }
}

但缺点是我必须将一些字符串作为参数传递给我的方法,这看起来一点也不干净。

【问题讨论】:

  • 为什么不在log() 方法中验证?
  • 如果不想传10个参数,应该考虑传List<String>
  • 但是我每次都会创建一个对象并在检查失败时丢弃它,这仍然不是一个好的优化!
  • 这可能是一个混合字符串和整数参数,请参阅编辑!
  • 不完全重复,但很有帮助:stackoverflow.com/questions/31121513/…

标签: java design-patterns refactoring


【解决方案1】:

如果您使用 log4j 进行日志记录,您可以扩展 logger 类并使用您自己的验证覆盖日志、调试、错误 .... 等方法。

如果没有,你可以照你说的做:创建一个新方法如下:

  public void validateAndLog(Object obj){
       if(checkIsValid){
          log(obj);
       }
  }

 public void validateAndLog(String... strs){
           if(checkIsValid){
              log(Arrays.toString(strs));
           }
      }

【讨论】:

  • 请注意第二个示例如何使用可变参数 - 这允许您将任意数量的字符串传递给方法,作为方法的单个参数,并将其视为方法内的数组。
【解决方案2】:

您可以为您的对象使用工厂函数,类似于

public Object createObjChecked(String1,......String10){
    Object obj = null;
    if(checkIsValid(String1, ..., String10)){
        obj = new Object(string1,.........String10);
        log(obj);
    }
    return obj;
}

然后您可以检查该对象是否实际上是在使用位置创建的。

【讨论】:

    【解决方案3】:

    你的解决方案很好。 您只缺少传递可变参数:

    void myLogMethod(String format, Object args){
      if(checkIsValid){
        Object obj = new Object(format, args);
        log(obj);
      }
    }
    

    这是 slf4j 采用的一种方法。见http://www.slf4j.org/apidocs/org/slf4j/Logger.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-19
      • 1970-01-01
      • 1970-01-01
      • 2011-02-01
      • 2011-04-17
      • 2013-05-28
      • 1970-01-01
      相关资源
      最近更新 更多