【问题标题】:How to refactor logging statements in sibling classes?如何重构兄弟类中的日志记录语句?
【发布时间】:2018-04-09 15:01:18
【问题描述】:

随着系统的发展,日志语句将被更改以满足新的需求,理想情况下,具有相同或非常相似上下文的日志语句应该一致地更改。但在许多情况下,开发人员很难记住所有这些人的存在。那么他们可能只改变其中的一部分,而忘记始终如一地改变其他的。

以这段Java代码sn-p为例,有两个兄弟类(ChildClassA,ChildClassB)都扩展了同一个超类(ParentClass),它们有一对相似的方法,功能相似,包含相同记录语句。

public class ChildClassA implements ParentClass{
  public void processShellCommand(){
  ...
  logger.error("Error initializing command, field " + field.getName() + " is not accessible.");
  ...
 }

public class ChildClassB implements ParentClass{
  public void processNetworkCommand(){
  ...
  logger.error("Error initializing command, field " + field.getName() + " is not accessible.");
  ...
 }

是否有解决方案,例如工具,或一些文档等,可以帮助它们进行一致的更改?

【问题讨论】:

  • 一般的方法称为重构。您可能会考虑在父类中添加一个为该情况生成错误字符串的方法:logger.error( notAccessible( field.getName() ) );

标签: java logging


【解决方案1】:

当涉及到日志记录时,我认为您确实应该尽量避免将详细信息放入日志中。[whatever_leve].([message_text]] 语句(至少在出现错误时),而是要创建自己的异常类并将消息详细信息放入其中。使用过滤器/拦截器来处理意外异常的日志记录也是一个好习惯。

所以在你的代码示例中,子类抛出​​了一个类型化的异常,我们称之为 InitializingException(...)。然后由调用者或过滤器处理并记录它。

您希望像处理业务逻辑代码一样关心代码库的日志记录部分(有人可能会说它是其中的一部分),所以向 DRY 致敬(不要重复自己) .

同样的逻辑也适用于 Debug 和 Trace 语句,您不希望在整个系统中复制粘贴相同的消息。所以应该应用一般的重构来避免它。但我通常认为调试或跟踪消息可能会改变(这取决于开发人员)。

【讨论】:

    猜你喜欢
    • 2018-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-15
    • 2018-11-08
    • 2012-03-12
    • 1970-01-01
    • 2021-03-19
    相关资源
    最近更新 更多