Comment implémenteriez-vous efficacement un retournement de fonctionnalité (ou un indicateur de fonctionnalité) en Javascript?
Cette question n'est pas sur la façon d'écrire réellement un tel indicateur de fonctionnalité en soi. Mais surtout pour rechercher des recommandations ou des conseils sur un tel système.
L'idée est simple:
Afin de déployer progressivement/dans les fonctionnalités, nous devons fork behaviors.
Pour ce faire, nous créons un objet
featureDescriptionFlag
qui contient des tableaux de chaînes. S'il existe, retourneztrue
, sinonfalse
Mais, aussi, doit considérer:
- Si aucun objet flag n'existe, retourne
false
comme dans aucun flip n'a déclenché ben - La condition idéale est de supprimer éventuellement tous les drapeaux
Je me réfère à feature flag, concepts comme décrit ici:
La question
Mes principales préoccupations concernant ma mise en œuvre sont les suivantes:
- En utilisant un objet pour décrire le drapeau se sent mal
- Lorsqu'une instruction conditionnelle existe, devrions-nous mettre en cache le résultat pour les appels suivants (par exemple, exécute true en premier, puis quelque part modifie le
featureDescriptionFlag
, puis next calls renvoie false)
Exemple d'implémentation
C'est la première implémentation que j'ai trouvée (voir aussi sur 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;
}
Ensuite, un objet de description de drapeau que nous créons global
window.featureFlagDescriptor = {someFunction: ['example']};
Ma préoccupation ici est qu'Il peut être dangereux pour permettre un tel retournement, j'ai des alarmes dans mon esprit sur la façon dont cela pourrait être exploité.
Plus tard, dans une fonction qui doit avoir deux comportements, nous faisons:
function someFunction(){
// Code...
if(featureFlag('someFunction', 'example')) {
// Work only if flag exist
} else {
// Former behavior
}
}
Conclusion
Des recommandations, des propositions d'amélioration?
J'ai créé un jsfiddle sur le sujet et finira par faire un travail complet de l'échantillon.