假设您想开发一个新功能,但是不确定用户是否会喜欢它,那么您需要一种可以轻松隐藏它的方法。 或者假设您正在开发一项新的重要功能,并且希望避免怪物犯下的罪行。 或者,您只想使网站的行为易于配置。 我该如何解决所有这些问题,请仔细阅读。
问题
想象一下,您的团队的开发周期持续了两个星期,而实施一项新功能将需要团队进行3个月的开发。 乍看之下,有两种可能的行动方案:
这两种方法都有其明显的优缺点:
使用功能切换器解决问题
这个问题在开发中很常见,并且有一个优雅的解决方案,使您可以从上述方法中最好地使用-
功能切换或
功能切换器 。
本质上,功能切换器是一个布尔标志,它存储在数据库中,并包含有关是否应启用功能的信息。 可以通过键从数据库中检索此标志的值。 使用功能切换器的方便之处在于,企业用户可以在运行时通过管理面板轻松更改功能切换器,而不必重新部署应用程序。
以下是在Java中使用功能切换的示例:
if (configurationManager.getParameter("is.some.functionality.enabled")) {
在上面的示例中,
configurationManager是一个类,该类使您可以通过其键从数据库中检索特定功能切换器的值。
另外,借助功能切换器,您可以在前端显示/隐藏某些元素。 为此,您需要将标志值放入Model并将其传递给View,如下所示:
@ModelAttribute("isSomeFunctionalityEnabled") public void isSomeFunctionalityEnabled() { return configurationManager.getParameter("is.some.functionality.enabled"); }
然后使用传递的值来呈现此或该HTML代码:
<c:choose> <c:when test="${isSomeFunctionalityEnabled}"> <!-- Render some stuff --> </c:when> <c:otherwise> <!-- Render some other stuff --> </c:otherwise> </c:choose>
功能切换器的类型
所描述的使用功能切换器的概念仅仅是一种可能的用例,这种功能切换器称为释放触发器。 总共可以区分3种不同类型的功能切换器:
- 发行切换 -允许您在开发过程中隐藏未完全实现的功能
- 实验开关-用于A / B测试的开关
- 许可切换 -各种用户组的开 /关功能
因此,使用功能切换器,可以使用不同的数据库和不同的功能切换器集,在同一代码库上构建站点的两个不同版本。 例如,在一个欧洲站点上,包括与GDPR相关的所有功能是有意义的,但是在俄语站点上,您不能这样做。

使用功能切换时出现问题
由于我从事的项目积极使用功能切换,因此除了使用它们的明显优势外,我开始注意到与之相关的问题:
- 测试复杂性 :发布新版本时,质量检查工程师会测试其中包含的所有功能,并尝试使用功能切换器将其打开和关闭。 这需要很多额外的时间,因为建议测试所有类型的标志组合
- 无效代码的出现 :许多功能切换的值不会长时间更改或完全不更改,因此为不同标志值编写的代码实际上变为“无效”
- 意外的站点故障 :许多过时的功能切换器具有不幸的特性,即在更改其值时会破坏某些内容(因为没有人长期以来一直在验证它们是否起作用)。 由于功能切换器存储在数据库中,并且可由业务用户从管理面板轻松更改,因此,由于其值的更改,经常会发生故障。 长期未使用的功能切换器的性能应首先在测试环境中进行检查
解决上述某些问题的方法
以下操作可以帮助解决上述问题:
- 可用功能切换器的文档:为了了解特定功能切换的效果以及通过什么键在数据库中搜索它,您应该创建描述所有功能切换器的详细文档。
- 定期修订功能切换器:为避免出现无效代码,请定期删除过时的功能切换器和相关代码
总结
功能切换器是一种非常简单且功能强大的机制,可让您避免使用巨大的提交,轻松更改应用程序行为或使用不同的功能切换配置在同一代码库上组装多个不同的应用程序。
但是,还应该记住,这种开发模式具有一些缺点,导致难以阅读和难以维护的代码,因此,应避免过度使用该模式,并定期记录功能切换器和修订版以删除未使用的功能切换器和修订版,结果,从“死”代码中清除项目。
有用的链接