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);
}
}
}
您没有减少耦合。提取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)。
我强烈建议您将实际的、完整的、可工作的代码交给代码评审,以便在您的代码按预期工作后进行富有成效的同行评审。