标签: featuretoggle

当工件是库且标志影响 C 或 C++ 标头时,功能标志/切换

关于功能标志/切换以及为什么要使用它们存在相当多的讨论,但大多数关于实现它们的讨论都围绕(网络或客户端)应用程序进行。如果您的产品/工件是 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
);
Run Code Online (Sandbox Code Playgroud)

您不会想运送这样的东西。

  • 您发布的库是针对特定功能标志组合构建的,客户端不需要#define相同的功能标志来使事情正常工作
  • 你的公共标头中的 ifdef 很难看
  • 最重要的是,如果您禁用标志,您不希望客户看到有关禁用功能的任何内容- 也许这是即将推出的内容,并且您不想在准备好之前展示您的内容

在文件上运行预处理器来获取要分发的标头实际上并不起作用,因为这不仅会作用于功能标志,还会执行预处理器执行的所有其他操作。

没有这些缺陷的技术解决方案是什么?

c c++ architecture software-design featuretoggle

6
推荐指数
1
解决办法
1778
查看次数

当新功能需要代码库中的大量更改时,如何处理功能切换?

功能切换非常适合新功能-在大多数情况下,功能应简单地被一些基于功能配置可见或不可见的UI容器包围。但是,如果一项新功能需要在现有代码库中进行大量更改,那么如何使用功能切换?我不能使用“复制和更改”,因为显然它比功能分支差得多-我不会遇到任何合并冲突。那么,满足这些要求的最佳实践是什么?

language-agnostic configuration featuretoggle

5
推荐指数
1
解决办法
227
查看次数

特色切换意大利面可以使用哪种设计模式?

我工作的公司已经深入研究了功能切换配置键,这些键可以根据特定条件打开/关闭特定行为。马丁·福勒(Martin Fowler)实际上将它们称为业务切换(http://martinfowler.com/bliki/FeatureToggle.html)。

我们有许多客户都在使用相同的服务,但是每个客户都希望行为有所不同。更糟糕的是,许多人希望其用户的某些子组看到不同的行为。因此,我们使用业务切换。切换开关已成为具有if / else逻辑的意大利面球,偶尔会有意外的交互。

是否有任何设计模式可用于管理此类情况?

干杯!

configuration design-patterns featuretoggle

5
推荐指数
1
解决办法
2330
查看次数

@Autowired Spring @Component 和 @ConditionalOnProperty

我可以使用@AutowiredSpring 4.x@Component来基于featuretoggles.properties文件选择功能@ConditionalOnProperty的实现吗?

public class Controller {
  @Autowired
  private Feature feature;
}

@Component
@ConditionalOnProperty(name = "b", havingValue = "off")
public class A implements Feature {
}

@Component
@ConditionalOnProperty(name = "b", havingValue = "on")
public class B implements Feature {
}

@Configuration
@PropertySource("classpath:featuretoggles.properties")
public class SomeRandomConfig {
}
Run Code Online (Sandbox Code Playgroud)

使用src/main/resources/featuretoggles.properties文件:

b = on
Run Code Online (Sandbox Code Playgroud)

(切换开关“b”的名称和类“B”的名称匹配是巧合;我的目标不是让它们相等,切换开关可以有任何名称。)

feature这无法在 中Controller自动装配UnsatisfiedDependencyException,表示“没有可用的‘Feature’类型的合格 bean:预计至少有 1 个有资格作为自动装配候选者的 bean”。

我知道我可以通过根据属性@Configuration选择 a 的类来实现这一点。@Bean但是,当我这样做时,每次添加功能切换时都必须添加一个新的配置类,并且这些配置类将非常相似:

@Configuration …
Run Code Online (Sandbox Code Playgroud)

spring autowired featuretoggle

5
推荐指数
1
解决办法
1万
查看次数

如何从头开始在Java中实现功能切换?

我需要在当前项目中实现功能切换。我不知道如何从头开始在Java中实现它。

我已经阅读了与该主题相关的各种文章中关于功能切换的理论,但是我还没有看到针对初学者详细描述此功能的实现教程或文档。

java featuretoggle

5
推荐指数
1
解决办法
2572
查看次数

将 .NET Core 环境传递给 React.JS 应用程序

使用 .NET Core,在 Startup.cs 中,您可以访问 IHostingEnvironment,您可以从中获取 EnvironmentName,它对应于在服务器上设置的 ASPNETCORE_ENVIRONMENT 环境变量的值。这对于打开/关闭各种功能以及使用特定于环境的配置非常有用。但是对于一个全是 React.JS 的前端,有没有办法向下传递这个值,以便前端也知道它的环境?我可以想到一些可能的方法来完成,但它们看起来有点笨拙。这方面的最佳做法是什么?

.net javascript reactjs asp.net-core featuretoggle

5
推荐指数
1
解决办法
2107
查看次数

如何在运行时跳过单元测试?

提前致谢!

我们有一些使用 selenium web 驱动程序的自动化测试,它们很棒,并且提供了一个非常好的回归包。

问题是现在我们的代码中有功能切换。所以我需要说忽略这些测试,除非该功能切换被打开/关闭。我找不到任何真正在 Google 上搜索的东西。

理想情况下,我不希望在功能测试的顶部使用“if”语句,但看起来它将成为主要方式。我最初的想法是在哪里创建自定义属性

public class IsFeatureFlagTurnedOn : Attribute
{
   public IsFeatureFlagTurnedOn(string featureToggleName)
   {
      FeatureToggleName = featureToggleName;
   }
   public string FeatureToggleName {get;}
}

public class MyTests 
{
   [TestMethod]
   [IsFeatureFlagTurnedOn("MyFeature1")]
   public void ItShould()
   {
      // only run if MyFeature1 is turned on
   }
}
Run Code Online (Sandbox Code Playgroud)

我有些需要挂钩到 MSTest 管道并说明是否存在此属性并且 MyFeature1 的逻辑已关闭,然后不要运行此测试 - 查看动态添加 [Ignore] 但没有运气。

这是通过 VSTS 运行的,我可以使用 [TestCategories] 但我必须不断更新我不想打开/关闭的功能的管道。

任何帮助或建议都会很棒!

c# unit-testing mstest featuretoggle

5
推荐指数
1
解决办法
1932
查看次数

在持续集成中运行的测试中应该如何设置功能切换?

使用功能切换时如何进行测试?您希望您的开发计算机尽可能接近生产。从我观看的视频来看,功能切换的实现方式允许某些人“使用”该功能(即,0 到 100% 的用户,或选定的用户等)。

为了正确地进行持续集成,在进行测试时,您是否必须使用与生产服务器相同的功能切换设置?或者更好的是,如果该功能未在生产中关闭,请确保在构建管道中运行自动化测试时该功能已开启?您最终是在测试代码中放置功能切换,还是在新文件中编写测试?新功能何时是系统测试必须进行的流程中的强制性步骤?

testing continuous-integration featuretoggle

4
推荐指数
1
解决办法
3220
查看次数