【发布时间】:2019-01-10 10:52:56
【问题描述】:
关于feature flags/toggles 和why you would use them 的讨论很多,但大多数关于实现它们的讨论都围绕(网络或客户端)应用程序进行。如果您的产品/工件是 C 或 C++ 库,并且您的公共标头受标志影响,您将如何实现它们?
“幼稚”的做法并不真正奏效:
/// Does something
/**
* Does something really cool
#ifdef FEATURE_FOO
* @param fooParam describe param for foo
#endif
*/
void doSomethingCool(
#ifdef FEATURE_FOO
int fooParam = 42
#endif
);
你不会想运送这样的东西。
- 您发布的库是为特定功能标志组合构建的,客户不需要
#define相同的功能标志来使事情正常工作 - 公共标头中的 ifdef 很丑
- 最重要的是,如果您禁用标志,您不希望客户看到有关禁用功能的任何信息 - 也许这是即将发生的事情,您不想展示您的东西,直到准备好了
在文件上运行预处理器以获取用于分发的标头实际上并不起作用,因为这不仅会作用于功能标志,还会执行预处理器所做的所有其他事情。
没有这些缺陷的技术解决方案是什么?
【问题讨论】:
-
“如果你禁用你的标志,你不希望客户看到任何关于它的东西——也许它是即将发生的事情,你不想在它准备好之前展示你的东西” 这不应该是一个真正的问题:只是不要将未完成的功能从开发分支合并到发布分支与您的版本控制。
-
这是“长期存在的功能分支”方法,有些人更喜欢这种方法,其他人建议尽早合并并禁用功能切换功能尚未准备好迎接黄金时间的功能 - 这些讨论在链接中提到问题。
-
旁白:从 C 的角度来看,显式的
void应该存在于声明参数列表中:void doSomethingCool(#ifdef FEATURE_FOO int fooParam = 42 #else void #endif );。这使 OP 发布的 C 风格变得复杂。 -
在 C 中没有默认参数,所以这将是一个完全不同的野兽。
-
我真的不明白你的问题。您的函数可能有也可能没有参数,具体取决于月相?你怎么能指望任何人都能使用它?
标签: c++ c architecture software-design featuretoggle