c++ - 针对特定于客户的定制的条件编译与运行时检查?

标签 c++ conditional-compilation maintainability

作为供应商,我们需要向许多客户交付应用程序,有时我们需要为特定客户定制应用程序,例如启用或禁用某些功能,或为该客户设置适当的默认值。

我看到在一些开源项目中,这是用这种模式完成的:

#define ENABLE_FEATURE_XYZ 0

#if ENABLE_FEATURE_XYZ
void featureXyzImpl()
{
    ...
}
#endif

void main()
{
#if ENABLE_FEATURE_XYZ
    featureXyzImpl();
#endif
}

在这里,您可以通过将 ENABLE_FEATURE_XYZ 定义为 0 或 1 来打开或关闭该功能。好处是不需要的代码不存在。

但一些同事认为,在现实世界中,您需要在运行时通过查看配置文件或注册表设置来执行自定义,而不是使用此模式:

void featureXyzImpl()
{
    ...
}

void main()
{
    if (configFileValue("Enable Feature XYZ") == true) {
        featureXyzImpl();
    }
}

他们的理由是这样可以更轻松地维护和测试软件,因为您不需要重新编译来启用或禁用某个功能,您不需要保留库或可执行文件的多个版本,而且您可以只向测试人员发送一个版本,然后测试人员可以在运行时启用或禁用功能。

是否有指南或方法来决定哪种方法更适合特定情况?或者我们应该只是通过掷硬币在它们之间做出选择,还是出于个人喜好?

最佳答案

我认为这取决于“有时”有多少。 如果您通过为每个客户构建单独的版本来启用/禁用功能,那么您需要仔细跟踪您已交付给哪个客户的内容,因为您需要支持应用程序的特殊版本。 当使用配置文件时,聪明的客户可能有机会启用他没有付费的功能,但维护对您来说要容易得多。 我会尽可能长时间地使用配置文件,因为它们更易于维护。

关于c++ - 针对特定于客户的定制的条件编译与运行时检查?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18975441/

相关文章:

c++ - 使用c/c++打开随机命名文件夹中的文件

Delphi {$IFDEF CONSOLE} 问题

c - 为什么要在 .c 文件中避免使用#ifdef?

r - 使用 knit 有条件地显示 Markdown 文本 block

maintainability - 编码实践: What are your thoughts on a 1. 700万LOC项目?

c++ - C++中的指针和删除

c++ - 为什么提取运算符不起作用?

c++ - 是否可以使用 QMaemo5ListPickSelector 将图像显示为项目?

wpf - WPF 中的上下文菜单继承

选择器的 jQuery 设计模式可以提高代码可维护性?