【问题标题】:C# Decoupling Logging from ClassC# 将日志从类中解耦
【发布时间】:2016-03-12 15:50:03
【问题描述】:

我正在使用 Unity 游戏引擎,但这应该没什么区别。 目前我的 Armory 类正在调用记录器,我已经通过将我的异常处理 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);
        }
    }
}

【问题讨论】:

  • @JamesHogle 对于 Codereview.se 来说太假设了。我们不喜欢 //Do other stuff 之类的东西
  • 当你问这是否“好”时,你是否正在寻找关于你所做的事情是否有意义的意见?因为,不,它没有。这应该是一个简单的“如果”,而且很复杂。

标签: c# logging unity3d exception-handling


【解决方案1】:

你没有减少耦合。您通过提取 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() 返回了一个布尔值,你正在丢弃返回值......不确定你会在那个@987654337 中捕获除ArgumentNullException 之外的任何东西@块(见MSDN)。


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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-28
    • 2011-09-19
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多