构建轻量级功能标记系统

借助基于枚举的功能标记系统,可以放心地将代码交付生产

在构建应用程序时,通常有必要将代码运送到App Store,但是您不希望用户使用它,因为它尚未准备好投入生产或打算在特定日期投入使用。 您问为什么还没有准备好代码时将其运送到App Store? 如果您的团队遵循持续的交付流程,通常就是这种情况。 所有新代码都没有功能分支,而是合并到开发分支中并开始构建。 在团队中有多个成员时,您仅需要在功能完整,经过全面质量检查并准备就绪后才能发布功能🐯

让我们谈谈代码👨🏼‍🚀

 枚举FeatureFlag:字符串,CaseIterable { 
案例功能1
}
扩展FeatureFlag {var isEnabled:Bool {
切换自我{
case .featureOne:
如果isRunningInAppStore(){
返回假
}
返回featureFlagValue()
}
}
私用var键:字串{
返回“ com.companyname.featureflag”。 + rawValue
}
私有功能featureFlagValue()-> Bool {
返回UserDefaults.standard.bool(forKey:key)
}
func enable(){
UserDefaults.standard.set(true,forKey:键)
}
func disable(){
UserDefaults.standard.set(false,forKey:key)
}
}

这里 查看完整的要点

通过使用快速枚举,我们有了一个非常好的API。 在我们的代码库中的任何地方使用它都很容易。

FeatureFlag.  featureOne .isEnabled //检查是否启用了功能 
FeatureFlag. featureOne .enable() //启用功能
FeatureFlag. featureOne .disable() //禁用功能

对于此特定示例,我们使用UserDefaults保留功能标志。 完全不必如此。 一些标志可以轻松地检查您捆绑的plist,第三方服务或您自己的远程服务器。 这给了我们很大的灵活性。 我们不必将自己耦合到特定的持久性策略🤓

作为奖励,我们总是可以为枚举添加额外的属性。 通常情况是,您希望在应用程序中的某个位置找到调试菜单,在其中可以轻松切换菜单中的每个功能标志。 然后可以使用一些属性扩展我们的FeatureFlag枚举

  var showInSettingsMenu:布尔{ 
切换自我{
case .featureOne:返回true
case .featureTwo:返回true
case .featureThree:返回true
}
}
var settingsMenuCellTitle:字符串{
切换自我{
case .featureOne:返回“启用功能一”
case .featureTwo:返回“📁启用功能二”
case .featureThree:返回“启用功能三”
}
}

只需将所需的属性添加到枚举即可。 简单

好吧,还没有。 我们需要100%确保在我们实际上不准备发布它们时,在生产中将我们的功能标志不会意外地设置为true。 因此,让我们做点负责任的事情,并首先编写一些测试。

 导入XCTest 
类FeatureFlagTests:XCTestCase {

func setup(){
super.setUp()
AppConfiguration.🔥alwaysReturnAppStoreEnvironment🔥= true
}

覆盖func tearDown(){
super.tearDown()
AppConfiguration.🔥alwaysReturnAppStoreEnvironment🔥=否
标记FeatureFlag.allCases {
flag.disable()
}
}

func testThatFeatureOneFlagIsOff(){
XCTAssertFalse(FeatureFlag.featureOne.isEnabled)
}
}

请注意此博客文章中未涉及的AppConfiguration.🔥alwaysReturnAppStoreEnvironment🔥。 它允许我们模仿AppStore环境进行测试。 根据您的特定功能标志,您很可能需要编写一些额外的测试。 例如,检查调试设置菜单是否在生产环境和其他与UI相关的检查中隐藏。 因此,在此处编写足够的测试,以给您足够的信心进行发货。


希望这对您有所帮助,并且您今天学到了一些新知识。 如果您喜欢阅读本文,请务必双手合十拍掌。 随时在Instagram和Twitter😄上跟踪我。

我们为团队提供的职位空缺越来越多。 如果您想了解有关在Over工作的更多信息,请查看我们的职业页面!

Interesting Posts