功能切换(功能开关或功能标志)与功能分支

功能分支

如果您使用的是分支机构,则不是在进行持续集成/部署/交付

您可能具有很好的单元测试 代码覆盖率 ,可能正在执行TDD ,可能已经以BDD格式编写了功能和集成测试,并且可能在每次提交存储库时都运行了所有测试。 但是,如果您有分支机构,则集成会延迟到它们合并之前,这意味着没有连续的集成。


人们倾向于喜欢功能分支。 它们提供了决定发布什么以及何时发布的灵活性。 所有要做的就是合并将发布到主分支中并部署到生产中的功能。 这种方法的问题是延迟。 集成被延迟到合并。 在合并完成并且运行所有单元,功能,集成和手动测试之前,我们不知道所有这些单独开发的功能是否可以很好地协同工作。 最重要的是,存在合并本身带来的痛苦所导致的问题。 几天,几周甚至几个月的工作突然合并到主分支,然后从那里合并到所有尚未发布的分支。 持续集成的思想是尽快发现问题。 发现问题之前的最小延迟。

缓解此问题的最常见方法是使特征分支小且寿命短。 一两天后就可以将它们合并到主分支中。 但是,在许多情况下,这根本不可能。 功能可能太大,无法在短短几天内开发出来。 业务可能要求我们仅与其他功能一起发布它。

换句话说,功能分支非常适合让我们决定发布什么以及何时发布。 它们为我们提供了灵活性,但阻止了我们进行持续集成。 如果只有一个分支,我们可以进行持续集成,但是使用功能分支解决的发布问题将再次困扰我们。

功能切换

功能切换(有时称为功能开关或功能标志)应解决仅部署一个选定的功能集而仅保留一个(主)分支的需求。 有了它们,我们就可以在一个分支中完成所有工作,可以进行持续集成以维护我们的代码质量,并可以使用标志来关闭功能,直到可以发布它们为止。 我们可以享受持续集成的所有好处,同时还可以灵活地选择哪些功能可用和哪些功能可以隐藏。 而且,这是朝着持续部署迈出的一步。 如果我们确实具有令人满意的自动化测试覆盖范围并且可以打开和关闭功能,则没有什么真正阻止我们将通过所有验证的每个提交部署到生产中的。 即使某些错误潜入产品中,使用Feature Toggles还是很容易将其关闭,直到修复为止。

基本思想是拥有一个配置文件,该文件为待完全释放的功能定义切换。 替代配置文件的可以是数据库表。 应用程序应使用这些切换按钮来决定是否使某些功能对用户可用。 它们甚至可以用于根据用户的角色,地理位置或随机样本向部分用户显示某些功能。

遵循的规则很少:

  • 仅在完全部署并证明其有效之前,才使用切换开关。 否则,您可能会得到“意大利面条代码”,其中充满了if / else语句,其中包含不再使用的旧切换。
  • 不要花太多时间测试切换。 在大多数情况下,足以确认某个新功能的入口点不可见。 例如,可以链接到该新功能。
  • 请勿过度使用切换键。 不需要它们时,请勿使用它们。 例如,您可能正在开发一个新屏幕,可通过主页中的链接访问该屏幕。 如果在该链接的末尾添加了该链接,则可能不需要使它隐藏的切换。

例子

有许多库为功能切换提供解决方案。 但是,实现它们非常容易,您可以选择自己做。

以下是“功能切换”的可能实现的一些示例。 他们使用AngularJS,但其背后的逻辑可以应用于任何其他语言或框架。

[带有功能切换的JSON]

{
  "feature1": {
    "displayed": false
  },
  "feature2": {
    "displayed": true
  },
  "feature3": {
    "displayed": false
  }
}

我倾向于在JSON切换中包含更多值。 其中一些功能为禁用,描述,allowed_users等。上面的示例只是最基本的解决方案。

接下来,在此示例中,我们应将JSON加载到AngularJS范围中。

[将功能切换加载到范围的AngularJS]

$http.get('/api/v1/data/features').then(function(response) {
  $scope.features = response.data;
});

一旦功能切换进入范围,其余的操作就很容易了。 以下AngularJS示例在显示设置为false时隐藏了功能。

[隐藏某些元素的AngularJS HTML]

<div ng-show="features.feature1.displayed">
  <!--Feature HTML-->
</div>

在某些情况下,您可能正在使用全新的屏幕来代替旧屏幕。 在这种情况下,以下解决方案可能是解决方案。

[根据功能切换返回URL的AngularJS]

$scope.getMyUrl = function() {
  if($scope.features.feature2.displayed) {
    return 'myNewUrl';
  } else {
    return 'myOldUrl';
  }
}

然后,从HTML中,将类似于以下示例。

[切换URL的AngularJS HTML]

<a href="{{getMyUrl()}}">
  This link leads somewhere
</a>

在某些其他情况下,更改可能在服务器上。 按照REST API最佳实践 ,您将创建一个新的API版本并使用Feature Toggle决定要使用哪个版本。 代码可能像下面这样。

[执行依赖于功能切换的请求的AngularJS]

var apiUrl;
if($scope.features.feature2.displayed) {
  apiUrl = '/api/v2/myFancyFeature';
} else {
  apiUrl = '/api/v1/myFancyFeature';
}
$http.get(apiUrl).then(function(response) {
  // Do something with the response
});

应用于前端的相同逻辑可以应用于后端或任何其他类型的应用程序。 在大多数情况下,它可以归结为简单的if / else语句。

翻译自: https://www.javacodegeeks.com/2014/08/feature-toggles-feature-switches-or-feature-flags-vs-feature-branches.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值