logging - 日志记录是否应该驻留在主要目的不是日志记录的类中?

标签 logging decorator single-responsibility-principle decoupling solid-principles

这更多的是一个理论问题。日志记录是否应该驻留在主要目的不是日志记录的类中?

这是一个简单的界面,可以对数字进行计算。

public interface ICalculation { 
    public int calculate(int number); 
}

这里是 ICalculation 接口(interface)的实现,它执行计算并进行一些日志记录。我认为这是一个非常务实的做法。除了构造函数接受我们通常不希望在计算域中看到的内容之外,内联日志记录可以说是非侵入性的。

public class ReallyIntenseCalculation : ICalculation {
    private readonly ILogger log;

    public ReallyIntenseCalculation() : this(new DefaultLogger()) {
    }

    public ReallyIntenseCalculation(ILogger log) {
        this.log = log;
        log.Debug("Instantiated a ReallyIntenseCalculation.");
    }

    public int calculate(int number) {
        log.Debug("Some debug logging.")
        var answer = DoTheDirtyWork(number);
        log.Info(number + " resulted in " + answer);
        return answer;
    }

    private int DoTheDirtyWork(int number) {
        // crazy math happens here
        log.Debug("A little bit of granular logging sprinkled in here.");
    }
}

从ReallyIntenseCalculation中删除所有日志记录代码后,该代码现在看起来具有明确的单一职责

public class ReallyIntenseCalculation : ICalculation {

    public int calculate(int number) {
        return DoTheDirtyWork(number);
    }

    private int DoTheDirtyWork(int number) {
        // crazy math happens here
    }
}

好的,我们已经删除了ReallyIntenseCalculation 记录其内部的功能。我们如何找到一种方法来具体化该功能。输入装饰器模式。

通过创建一个装饰 ICalculation 的类,我们可以将日志记录重新添加到混合中,但这样做会损害在 RealIntenseCalculation 的私有(private)方法中发生的一些更细粒度的日志记录。

public class CalculationLoggingDecorator : ICalculation {
    private readonly ICalculation calculation;
    private readonly ILogger log;

    public CalculationLoggingDecorator(ICalculation calculation, ILogger log) {
        this.calculation = calculation;
        this.log = log;
        log.Debug("Instantiated a CalculationLoggingDecorator using " + calculation.ToString());
    }

    public int calculate(int number) {
        log.Debug("Some debug logging.")
        var answer = calculation.calculate(number);
        log.Info(number + " resulted in " + answer);
    }
}

使用日志装饰器还有哪些其他可能的优点和缺点?

最佳答案

我认为这是有争议的。可以证明日志记录是单一职责的一部分。

也就是说,我认为您正在考虑 cross-cutting concerns ,这是aspect-oriented programming处理。事实上,日志记录代码是 AOP 的典型示例。您可能需要考虑像 aspect# 这样的 AOP 框架.

这样做的优点当然是可分解性、重用性和关注点分离。

关于logging - 日志记录是否应该驻留在主要目的不是日志记录的类中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1798624/

相关文章:

php - 使用 md5 散列密码

hadoop - 如何以破坏Flume中的目录路径的方式访问远程主机中的文件夹

javascript - 带有 AOT 的类型提供者中的 Angular 条件

java - 在 3 层 Entity-Repository-Service 应用程序中应该在哪里进行验证?

logging - 使用 grep 过滤命令输出

php - 如何在 PHP 中查看 AWS Worker 的登录信息?

java - super 函数在java中是如何工作的?

类属性的python全局装饰器

javascript - 如果功能在主要目的之上记录错误,是否违反了 SRP?

oop - 了解简洁代码示例中的单一责任主体 SRP