【发布时间】:2011-08-18 04:18:01
【问题描述】:
有谁知道是否有可能有一个像记录器这样的类而没有:
使用单例或全局(例如 std::cout)
将实例/指针/引用传递给每个需要它的方法
我以记录器类为例,但我的应用程序中有一些类可以从中受益(例如,撤消管理器)。
每个解决方案都有几个问题:
使用单例对测试来说是有问题的(以及许多原因,使用单例通常不是一个好主意)。全局也是一样。此外,没有什么能保证应用程序中只有一个实例,甚至不是必需的(例如,为什么没有 2 个记录器?)
将它传递给每个对象构造函数(依赖注入)会导致大量样板代码,并且可能容易出错,因为您必须多次复制/粘贴相同的代码。可以认真考虑在每个类的构造函数中都有一个指向 Logger 的指针吗??????
所以我想知道是否有第三种替代方案,在 C++ 中,我从未听说过? 对我来说,这听起来像是需要一些黑魔法,但我对我在堆栈溢出中学到的一些我在谷歌中找不到的技术感到惊喜,所以我知道这里有一些真正的大师;)
令人惊讶的是,我发现很多关于如何设计单例,或者为什么不应该使用单例的讨论,但我找不到解决我的问题的帖子...
【问题讨论】:
-
我见过一个日志类,它只会在每次将语句写入日志时打开日志文件,并且日志名称是硬编码的(如果你想写入不同的文件,可以选择传入) )。没有全局变量、单例或将对象传递给每个方法,但不完全是您正在寻找的黑魔法解决方案。事实上,我仍在努力从产品中删除该日志类:)
-
如果记录器类存在,那么您可以去编辑每个方法吗?如果是这样,那么我可以提出一些建议。
-
@iammilind:你的意思是记录器类的每个方法吗?是的,有可能,我迫不及待地想听听你的建议 :) @DXM : ))))
-
对不起,我可能误解了你的问题。我以为您想记录在整个代码流中被调用的所有函数。看到下面的答案后,您似乎想要一些不同的东西。或者可能是我还没有很好地理解,你的问题到底是什么。 :)
-
看看Hypodermic。看起来不是很漂亮,但我认为这可能是一个解决方案。
标签: c++ logging dependency-injection singleton