这个问题不是关于如何实际编写这样的功能标志本身。但主要是寻求有关此类系统的建议或提示。
这个想法很简单:
为了逐步推出/推出功能,我们需要分叉行为。
为此,我们创建了一个
featureDescriptionFlag
包含字符串数组的对象。如果存在则返回true
,否则false
但是,还必须考虑:
- 如果不存在标志对象,
false
则返回未触发翻转 - 理想的条件是最终删除所有标志
我指的是功能标志,这里描述的概念:
问题
我对实施的主要担忧如下:
- 使用全局对象来描述标志感觉不对
- 当条件语句存在时,我们是否应该缓存后续调用的结果(例如先执行 true,然后在某处编辑
featureDescriptionFlag
,然后下一个调用返回 false)
实现示例
这是我想出的第一个实现(另见 jsfiddle):
// WARNING: Requires underscore.js
function featureFlag(flagContainerName, elementKeyToCheck) {
//console.log('Feature flagging on '+flagContainerName+', with ' + elementKeyToCheck); // DEBUG
if (_.has(window.featureFlagDescriptor||{}, flagContainerName)) {
if(_.contains(window.featureFlagDescriptor[flagContainerName]||[], elementKeyToCheck)) {
//console.log('Disabled by '+flagContainerName+', matching ' + elementKeyToCheck); // DEBUG
return true;
}
}
return false;
}
然后,我们创建全局的标志描述对象
window.featureFlagDescriptor = {someFunction: ['example']};
我在这里担心的是,允许这种翻转可能很危险,我对如何利用它感到担忧。
稍后,在一个必须有两种行为的函数中,我们这样做:
function someFunction(){
// Code...
if(featureFlag('someFunction', 'example')) {
// Work only if flag exist
} else {
// Former behavior
}
}
结论
有什么建议、改进建议吗?
我已经创建了一个关于该主题的 jsfiddle,最终将制作一个完整的工作示例。