建议需要删除重复的类,而不更改 #define 取决于该类静态对象

问题描述 投票:0回答:1

两个使用 C++ 的项目中存在重复的类实现。当我尝试将两者的细微差别合并到一个类中时,我遇到了一个障碍,因为类中的 #define 直接依赖于两个项目中从该类创建的静态对象,如下所示。

来自项目1

enum severity_type
{
    debug = 1,
    error,
    warning
};


template< typename T >
class logger
{
public:
    logger(const std::string& name);

};

#define LOGGING_LEVEL_1
static logger< file_log_policy > log_inst(GetAppDataPath()+ "\\Logs\\backup.log");
#ifdef LOGGING_LEVEL_1
#define LOG log_inst.print< severity_type::debug >
#define LOG_ERR log_inst.print< severity_type::error >
#define LOG_WARN log_inst.print< severity_type::warning >
#else
#define LOG(...) 
#define LOG_ERR(...)
#define LOG_WARN(...)
#endif

#ifdef LOGGING_LEVEL_2
#define ELOG log_inst.print< severity_type::debug >
#define ELOG_ERR log_inst.print< severity_type::error >
#define ELOG_WARN log_inst.print< severity_type::warning >
#else
#define ELOG(...) 
#define ELOG_ERR(...)
#define ELOG_WARN(...)
#endif

来自项目2

enum severity_type
{
    debug = 1,
    error,
    warning
};


template< typename T >
class logger
{
public:
    logger(const std::string& name);

};

#define LOGGING_LEVEL_1
static logger< file_log_policy > log_inst(GetAppDataPath()+ "\\Logs\\restore.log");
#ifdef LOGGING_LEVEL_1
#define LOG log_inst.print< severity_type::debug >
#define LOG_ERR log_inst.print< severity_type::error >
#define LOG_WARN log_inst.print< severity_type::warning >
#else
#define LOG(...) 
#define LOG_ERR(...)
#define LOG_WARN(...)
#endif

#ifdef LOGGING_LEVEL_2
#define ELOG log_inst.print< severity_type::debug >
#define ELOG_ERR log_inst.print< severity_type::error >
#define ELOG_WARN log_inst.print< severity_type::warning >
#else
#define ELOG(...) 
#define ELOG_ERR(...)
#define ELOG_WARN(...)
#endif

在这里,您可以观察到我们有来自两个项目的两个静态对象。

我想在程序运行时拥有这些静态对象。但是当我尝试合并这些文件时,主要的瓶颈是 #define 的 项目1

#define LOGGING_LEVEL_1
static logger< file_log_policy > log_inst(GetAppDataPath()+ "\\Logs\\backup.log");
#ifdef LOGGING_LEVEL_1
#define LOG log_inst.print< severity_type::debug >
#define LOG_ERR log_inst.print< severity_type::error >
#define LOG_WARN log_inst.print< severity_type::warning >
#else
#define LOG(...) 
#define LOG_ERR(...)
#define LOG_WARN(...)
#endif

和项目2

#define LOGGING_LEVEL_1
static logger< file_log_policy > log_inst(GetAppDataPath()+ "\\Logs\\restore.log");
#ifdef LOGGING_LEVEL_1
#define LOG log_inst.print< severity_type::debug >
#define LOG_ERR log_inst.print< severity_type::error >
#define LOG_WARN log_inst.print< severity_type::warning >
#else
#define LOG(...) 
#define LOG_ERR(...)
#define LOG_WARN(...)
#endif

这些#define(如 LOG、LOG_ERR)在代码中的数千处使用。 您能否在这里建议一种更好的方法,无需修改#define,我可以合并这些类并为两个项目使用单个类。

我希望 #define 保持不变,并将重复的类合并为一个,并且静态对象也应该存在。

有人可以建议一种更好的方法,我可以在不触及 #define 的情况下重构此代码吗

c++ design-patterns refactoring code-duplication
1个回答
0
投票

重申问题以确保我理解:您有两个单独的代码库(称为

backup
restore
),其中您的 cpp 文件有一个
#include "logger.h"
,这是您上面显示的代码。您现在想要将两个代码库合并为一个代码库。

然后,通过构造,每个 .cpp 文件只能是其中一个

#include
logger.h
。此外,每个 .cpp 文件都会有自己的
log_inst
副本,因为您在标头中将其声明为
static
变量。

我建议将所有

static
变量提取到
logger-common.h
中。

然后您可以拥有包含以下内容的

logger-backup.h

#include "logger-common.h"
static logger< file_log_policy > log_inst(GetAppDataPath()+ "\\Logs\\backup.log");

反之亦然

logger-restore.h

这仍然意味着您需要修改代码库的

#include
,但这比更改每个
LOG
调用要少一个数量级。

如果你真的不想这样做,我想你可以调整每个代码库中文件的包含目录的顺序,以确保它们首先看到“他们的”logger.h,但这会让你的 IDE 感到非常困惑,同事们。

© www.soinside.com 2019 - 2024. All rights reserved.