C#将日志记录从类中解耦

本文关键字:解耦 记录 日志 | 更新日期: 2023-09-27 18:26:11

我使用的是游戏引擎Unity,但这应该没有什么区别。目前,我的Armoury类正在调用记录器,我已经通过将异常处理try-catch放在另一个类中来解耦它,这可以吗?或者有没有方法可以进一步解耦日志?

public class Armoury : MonoBehaviour
{
    private Logging logger;
    public void Buy(int unitId)
    {
         logger.OutOfRange("unitId not present in list", unitId, PurchasbleUnits);
         //Do other stuff
    }
}
public class Logging
{
    public void OutOfRange(string error, int id, IList list)
    {
        try
        {
            list.Contains(id);
        }
        catch (Exception ex)
        {
            Debug.Log(ex + " Custom: " + error);
        }
    }
}

C#将日志记录从类中解耦

您没有减少耦合。提取Logging类所做的是减少Armoury类的责任的数量,这很好,但不够好以减少耦合。

public class Armoury : MonoBehaviour
{
    private Logging logger;
    public void Buy(int unitId)
    {
         logger.OutOfRange("unitId not present in list", unitId, PurchasbleUnits);
         //Do other stuff
    }
}

为了减少Armoury类和Logging类的具体实现之间的耦合,您需要引入一个接口,依赖于该接口,而不是依赖于具体实现:

private readonly ILogger;
public Armoury(ILogger logger)
{
    _logger = logger;
}

通过依赖于抽象,您不再与ILogger的具体实现绑定,并且通过将其注入构造函数中,您现在可以从外部控制相关性

现在,一个接口不应该被设计成可以更改的——现在ILogger看起来像这样:

public interface ILogger
{
    void OutOfRange(string error, int id, IList list);
}

这不是记录器通常所做的(人们会期望像Info(string)Warn(string)Error(string,Exception)这样的方法),并且每当您需要寻找新的东西时,该接口就会发生变化——实现是泄漏到抽象中,这是另一种设计味道。至于实现,我怀疑它是否按预期工作,上次我检查IEnumerable<T>.Contains()返回了一个布尔值,而您正在丢弃返回值。。。不确定您是否会在catch块中捕获到除ArgumentNullException之外的任何内容(请参阅MSDN)。


我强烈建议您将实际的、完整的、可工作的代码交给代码评审,以便在您的代码按预期工作后进行富有成效的同行评审。