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, retournez true, sinon false

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:

  1. En utilisant un objet pour décrire le drapeau se sent mal
  2. 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.

Author: Community, 2013-07-18