在我的应用程序中,需要记录应用程序中发生的各种事件。 例如,我需要记录从服务器下载文件的事件,并指定下载时间,服务器IP地址等。 从结构上讲,所有数据都分布在应用程序的各个类中。
我的解决方案是创建一个单例类,将其命名为“ ApplicationEvents ”,并在其中处理应用程序事件。对于 例如:
void OnFileDownloaded() {
...
ApplicationEvents::Instance()->FileDownloaded(fileId_);
}
但这看起来像代码中的混乱,几乎不可能测试。
替代解决方案是在main函数中创建 ApplicationEvent ,并将其作为参数传递给类构造函数。 为避免代码混乱,可以使用装饰器或代理模式。
例如:' FileDownloader '并装饰类' LoggingFileDownloader '。 但是应用程序的结构会更复杂,许多类只会将指向 ApplicationEvents 的指针传递给其他类,并且可能在我的情况下是过度的。
哪种解决方案最好?
答案 0 :(得分:1)
我不明白为什么这不可能测试。您应该在应用程序之外测试您的日志记录模块,并在验证后立即使用它。您不必与应用程序一起测试 。此外,它接收普通代码,使用Singleton只是对您的代码进行一次调用。一种替代方法是使用发布/订阅(或观察者)来发布消费事件但是它将更加抽象并且难以遵循冷却调试我会认为它仅适用于其他类型的场景,例如,许多订阅者感兴趣在某些事件上。其他更激进的方法是使用AOP,因为日志记录是交叉问题的更常见的例子,但是冷杉C ++只有少数经验库冷杉AOP。
答案 1 :(得分:1)
对于这个问题,我已经创建了一个用于记录的类,并且我在我的主程序中分配它然后我在我的类中使用它。因为我不希望通过记录来减慢我的应用程序,所以记录器在Cpp11下的另一个线程中运行 但我必须改进它以捕获标准输出。