【问题标题】:Do C++ logging frameworks sacrifice reusability?C++ 日志框架会牺牲可重用性吗?
【发布时间】:2010-09-07 13:07:38
【问题描述】:

在 C++ 中,没有事实上的标准日志记录工具。以我的经验,商店自己推出。然而,当试图创建可重用的软件组件时,这会产生一些问题。如果您系统中的所有内容都依赖于日志组件,这会降低软件的可重用性,基本上会迫使任何下游项目将您的日志框架与他们真正想要的组件一起使用。

IOC(依赖注入)并不能真正解决这个问题,因为您的组件需要依赖于日志抽象。日志组件本身可以添加对文件 I/O、触发机制和其他可能不需要的依赖项的依赖项。

向您的专有日志记录框架添加依赖项是否会牺牲组件的可重用性?

【问题讨论】:

    标签: c++ logging code-reuse


    【解决方案1】:

    如果您希望构建不会重新编译的库,但希望提供日志接口,那么也许一个好方法是允许(库的)用户提供回调。

    在使用您的库初始化日志记录时,他们需要指定回调,然后胶水代码由他们决定,以使其与他们拥有的任何东西都能很好地配合。

    如果您可以使回调的签名看起来像他们可能始终可用的标准函数,那么如果他们实际上没有记录器,它会为他们提供一个简单的默认选项。

    此外,调用者可能多次从库中实例化组件,并且对于资源争用或线程问题,希望为每个组件提供不同的记录器回调。

    【讨论】:

      【解决方案2】:

      是的,门德尔特是对的。我们的产品正是这样做的。一切都依赖于 ILogger 抽象接口,但它不依赖于其他任何东西。通常,可执行文件或高级 DLL 将用于构建实际实现的 Logger 接口并将其注入。

      【讨论】:

        【解决方案3】:

        是的。但在这种情况下,依赖注入会有所帮助。

        您可以创建一个抽象的日志记录基类,并为您要使用的日志记录框架创建实现。您的组件仅依赖于抽象基类。然后根据需要注入实现及其所有依赖项。

        【讨论】:

        • +1,我自己也处于这种情况,我的项目的主要实现有一个抽象的日志框架,可以记录我想要的其他信息......但它使用的库也有(不同的)日志框架,但幸运的是,他们还希望传入一个封装框架的对象......所以我构建了一个对象,根据我当前的日志框架实现它,然后我走了!
        猜你喜欢
        • 1970-01-01
        • 2011-04-20
        • 1970-01-01
        • 1970-01-01
        • 2017-03-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-06
        相关资源
        最近更新 更多