Partager via


Cet article a fait l'objet d'une traduction automatique.

ALM Rangers

Développement de logiciel avec mécanisme « Feature Toggle »

Bill Heys

Télécharger l'exemple de code

Fonction bascule comme un concept de développement de logiciels vous permettre de poursuivre le développement de la fonctionnalité parallèles et simultanées comme alternative au branchement du développement parallèle (également appelé branches caractéristique). Fonction bascule est parfois appelés indicateurs de fonctionnalité, commutateurs de fonctionnalité, palmes caractéristique ou caractéristiques conditionnelles. Fonction bascule vous permettre d'intégrer en permanence pendant qu'ils sont en cours d'élaboration. Vous pouvez utiliser la fonction bascule pour masquer, de désactiver ou d'activer des fonctionnalités individuelles pendant l'exécution.

Comme toutes les techniques de développement de logiciel, vous utiliseriez fonctionnalité bascule en conjonction avec le contrôle de version (par exemple Microsoft Team Foundation Server). À l'aide de la fonctionnalité bascule par eux-mêmes ne revient pas à éliminer toutes les branches d'un régime de contrôle de version complète. Une distinction de fonction bascule, c'est que toutes les modifications sont archivées dans la branche principale (voie principale) au lieu d'une branche de développement.

Une fonctionnalité est désactivée ou cachée de tous les utilisateurs, jusqu'à ce que vous commencez le développement de la fonctionnalité. Au cours du développement, vous pouvez activer la fonctionnalité de développement et de tests unitaires et le désactiver pour tous les autres utilisateurs. Testeurs de qualité Assurance (QA) peuvent également activer des fonctionnalités qu'ils veulent tester. Jusqu'à ce que la fonctionnalité est complet et entièrement testé selon la définition de fait (DoD) et passe les tests de qualité, il sera caché ou désactivée dans le logiciel publié. Vous pouvez modifier dynamiquement la valeur d'une fonction bascule sans créer et déployer une nouvelle version.

Commençant par une comparaison des branches de la fonction et la fonction bascule, je vais suggérer des techniques alternatives pour implémenter la fonctionnalité bascule dans le code. À l'aide d'un exemple d'application Calculatrice Windows, J'illustrerai comment masquer ou afficher les fonctionnalités en cours d'exécution à l'aide de la fonctionnalité bascule.

Intégration continue

En utilisant la fonction bascule, effectuez l'intégration continue, tous les travaux de développement sont archivé dans la branche principale et continuellement intégré avec tout autre code dans cette branche. Sur chaque check-in Express, le code de la branche principale est construit et testé sur un serveur de build à l'aide de Tests de vérification automatisée Build (BVT).

Comme indiqué dans les Microsoft patterns & livre de pratiques sur la distribution en continu (« Construction d'un Pipeline de libération avec Team Foundation Server 2012 » [2013]), « Par débit continu, nous entendons que par le biais de techniques telles que la gestion des versions, intégration continue, automatisation et gestion de l'environnement, vous serez en mesure de réduire le délai entre la quand vous avez tout d'abord une idée et quand cette idée est réalisée comme un logiciel qui est en production » (bit.ly/1kFV0Kx).

Vous pouvez utiliser des tests unitaires automatisés pour tester votre code avant de le vérifier dans la branche principale. Si un check-in casse une build sur le serveur de build, vous devrez corriger le code avant le check-in est autorisé. Si une fonctionnalité dans la build ne passe pas tests d'assurance qualité, vous pouvez cacher à déploiement ou libérer jusqu'à ce qu'il fait.

Fonction bascule vous donne exécution d'isolement d'une fonctionnalité en cours d'élaboration jusqu'à ce qu'il soit complet, testé et prêt pour la libération. En utilisant la fonction bascule avec intégration continue, vous travaillez directement dans la branche principale. Code est archivé à la branche principale, tout en gardant cette branche stable pendant des générations et des déploiements (voir Figure 1).

Feature Toggles Support Continuous Integration of Parallel Development
Figure 1 dispositif cabillots charge l'intégration continue du développement parallèle

Fonction bascule dans l'utilisation

La figure 2 montre un exemple de fonction bascule à le œuvre dans un échantillon de la calculatrice de Windows Form. Cela illustre également les défis du développement parallèle de fonctionnalité simultanées.

Sample Windows Calculator Showing Three New Features
Figure 2 exemple Windows calculatrice montrant trois nouvelles fonctionnalités

Cet exemple compare gestion développement parallèle à l'aide de branches de fonctionnalité à l'utilisation de fonction bascule. Il y a trois nouveautés (clavier, fonctions avancées et des fonctions de mémoire) en cours d'élaboration en parallèle que la calculatrice de base est déployée.

Fonction bascule Patterns

Il existe de nombreux modèles d'utilisation dans lequel vous pouvez utiliser la fonction bascule permettant l'intégration continue de l'ensemble du code, y compris le code incomplet ou en attente. À l'aide de la fonctionnalité bascule peut augmenter la vitesse de développement de l'équipe en réduisant ou éliminant la nécessité pour les branches de développement parallèle et la ramification qui s'ensuivit et fusion des tâches qui peuvent être extrêmement fastidieux et source d'erreurs.

Voici une liste de scénarios typiques où vous pourriez envisager la fonction bascule :

  • Le masquage ou la désactivation de nouvelles fonctionnalités dans l'interface utilisateur
  • Masquage ou désactivation des nouveaux composants dans l'application
  • Gestion des versions une interface
  • Étendre une interface
  • Supportant plusieurs versions d'un composant
  • Ajouter un nouvel élément à une application existante
  • Améliorer une fonctionnalité existante dans une application existante

Branchement pour l'isolement de la fonctionnalité

Avec une stratégie de ramification de fonctionnalité, votre équipe peut isoler le développement simultané ou parallèle des caractéristiques — ou groupes de caractéristiques — en branches de fonctionnalité séparés. Branches de fonctionnalité vous donnent une grande flexibilité en termes de passer d'une version en production. Il ne faut pas attendre que toutes les fonctionnalités sont prêtes pour faire un déploiement complet.

Vous pouvez facilement fusionner des caractéristiques individuelles ou groupes de caractéristiques dans la branche principale quand ils sont complets selon le DoD. Vous pouvez créer de nouvelles branches de fonction selon les besoins, puis supprimez-les lorsque la fonction est terminée. Les fonctions ne sont pas fusionnées à la branche principale jusqu'à ce qu'ils rencontrent le DoD. Suivant l'exemple, Figure 3 montre trois nouvelles branches de fonction fournissant l'isolement durant le développement parallèle.

Branching for Feature Isolation
Figure 3 Branchement pour caractéristique d'Isolation

Pour obtenir des directives sur les divers scénarios à embranchements fonctionnalité, vous pouvez consulter le e-book ALM Rangers sur les stratégies de ramifications à aka.ms/vsarsolutions.

Fonction bascule vs. Branches de la fonction

À l'aide de la fonctionnalité bascule vous permet et votre équipe de poursuivre l'intégration continue, le déploiement continu et pratiques de rejet constant. Ces pratiques permettent plus fréquente intégration de code de fonction car ils sont élaborés en parallèle par rapport aux branches de la fonction. Dans le même temps, fonction bascule prennent également en charge le runtime isolement des fonctionnalités en cours de développement et n'est pas prêt pour la libération.

Avec la fonction bascule, toutes les modifications en attente sont archivés dans la branche principale. Chaque check-in est suspens jusqu'à ce qu'un processus de génération automatisés s'appuie tout le code de la branche principale sur un serveur de builds, et avec succès les pistes automatisé BVTs. C'est le processus dit d'intégration continue.

Au moment de l'exécution, fonction bascule cache ou contourner les fonctionnalités qui sont dans la build, mais n'est pas prêt pour la libération. Selon comment vous envisagez d'implémenter une fonctionnalité, l'effort d'utiliser la fonction bascule peut parfois être trop complexe. En revanche, se cachant des fonctionnalités de l'interface utilisateur peut être simple.

Lorsque vous utilisez des branches de la fonctionnalité, tout développement est archivé dans la branche de fonctionnalités associé et isolée à partir de code dans la branche principale ou d'autres branches de la fonction. Vous ne pouvez pas fusionner une fonctionnalité nouvelle ou améliorée avec la branche principale ou d'autres branches de la fonction jusqu'à ce que la fonction Code terminée, passe des tests de qualité requise ou rencontre le DoD. Seulement à ce moment-là est la fonctionnalité intégrée (fusionnés) avec la branche principale. Par conséquent, isolement du code et l'intégration continue sont à un peu les extrémités opposées du spectre « intégration. »

Permettant une nouvelle fonctionnalité dans un déploiement est relativement facile et gratuite des risques. Simplement activer les cabillots de fonctionnalités associé à visibles et activés. L'effort de sortir une nouvelle fonctionnalité à l'aide de branches de fonctionnalité est beaucoup plus compliqué. Vous devez fusionner la fonctionnalité dans la branche principale. C'est souvent un temps -­consommant et difficile processus.

Suppression d'une fonction

Dans certains projets, vous devrez supprimer ou sauvegarder les fonctionnalités incomplètes. Restauration d'ensembles de modifications individuelles pour faire reculer une fonctionnalité (changements de cueillette cerise) est aussi compliqué, beaucoup de travail et peut-être nécessiter la retravailler de code significative.

Il est impératif d'isoler les caractéristiques de la branche principale jusqu'à ce que vous décidez de publier ces fonctionnalités. En tout état de cause, régularisez une fonctionnalité d'après un communiqué juste avant la sortie est prévue, c'est risqué et sujette aux erreurs. À l'aide de la fonctionnalité Active/désactive, vous examinez tout le code pour toutes les fonctions dans la branche principale. Fonction bascule simplement masquer ou désactiver des fonctionnalités de runtime ou version.

Choix d'implémentation

Il existe plusieurs approches pour persistant l'état de la bascule de fonctionnalité de l'application. Voici deux approches assez simples :

  1. Paramètres de l'Application permet de définir les cabillots de fonctionnalité (déployés dans le fichier de Configuration XML de l'Application lorsque l'application est générée).
  2. Fonction mise en mémoire active/désactive par des lignes dans une table de base de données.

Définir la fonction bascule non seulement il est plus facile de définir la fonction bascule dans le fichier de configuration en utilisant le concepteur de paramètres, mais vous n'avez pas besoin de faire quoi que ce soit dans votre application pour enregistrer l'état de la fonction bascule lorsque l'application se termine. L'exemple de fichier de paramètres montré Figure 4 définit la fonction bascule.

This Sample ConfigSettings File Stores Feature Toggle State for the Windows Calculator
Figure 4 cet échantillon ConfigSettings fichier magasins Feature Toggle État pour la calculatrice de Windows

Stocker les cabillots fonctionnalité comme lignes de base de données pour utiliser une table de base de données bascule caractéristique pour stocker l'état bascule de fonctionnalité, l'application nécessitera deux fichiers de paramètres. Le fichier de paramètres CommonSettings définit les options utilisées par l'application. Les paramètres de DatabaseSettings du fichier contrôles si caractéristique cabillots sont définies et conservées dans une table de base de données (quand il est vrai) ou dans un fichier de paramètres (si la valeur False). Le fichier FeatureToggleSettings fournit les noms pour chacun des cabillots de fonctionnalité vous pourrez stocker dans la base de données (voir Figure 5).

Feature Toggle Names Stored in the Database Table As Rows
Figure 5 fonction bascule noms stockés dans la Table de base de données comme lignes

L'approche utilisée dans l'exemple de la calculatrice de Windows est à créer dynamiquement des fonctionnalité bascule lignes. Lorsque l'application s'exécute pour la première fois, la table sera vide. Au moment de l'exécution, tous les noms de fonction bascule sont vérifiées pour voir si elles sont activées. Si tous ne sont pas déjà dans la table, l'application l'ajouterons à la table. L'exemple de table de FeatureToggle dans Figure 6 spectacles dotées de lignes bascule ajoutées.

FeatureToggle Table After Initial Run
Figure 6 FeatureToggle tableau après la course initiale

Indépendant de l'implémentation des Concepts

Une bascule de fonctionnalité vous permet de désactiver une fonctionnalité, le code de l'application masque ou désactive les contrôles basés sur la valeur de la fonction bascule (True/False) associée à cette fonctionnalité. Vous pouvez choisir de cacher la fonctionnalité complètement à partir de l'interface utilisateur des fonctionnalités en cours d'élaboration, ou affiche la fonction comme étant désactivé. Lorsque vous relâchez la fonction, il sera visible et actif.

La figure 7 montre la calculatrice de Windows avec uniquement la fonctionnalité de clavier visibles et activés. Les fonctions de mémoire et des fonctions avancées sont visibles, mais handicapé.

Windows Calculator with Keypad Feature Visible and Enabled, and the Memory and Advanced Functions Features Visible and Disabled
Figure 7 Windows calculatrice avec fonctionnalité de clavier Visible et active et la mémoire et les fonctions avancées caractéristiques visibles et les personnes handicapées

La première étape de cet exemple d'application crée une nouvelle base de données FeatureToggleDemo, suivie de la création d'une table simple de FeatureToggle. Lorsque vous téléchargez l'exemple d'application, vous trouverez trois fichiers SQL pour : Création de la base de données FeatureToggle, création de la FeatureToggle Table et la création les deux procédures stockées utilisées par l'application pour charger les valeurs d'et des enregistrer à la table des FeatureToggle.

Après avoir créé la table de FeatureToggle, il n'y a pas besoin d'ajouter des lignes de FeatureToggle avant d'exécuter l'application pour la première fois. L'application utilise une bibliothèque de classe FeatureToggle pour encapsuler la logique de l'application pour accéder à tous et mise à jour de la fonctionnalité Active/désactive.

Le code suivant illustre les champs privés pour maintenir l'état de la bascule de fonctionnalité :

private Boolean _IsKeyPadFeatureEnabled = false;
private Boolean _IsKeyPadFeatureVisible = false;
private Boolean _IsMemoryFeatureEnabled = false;
private Boolean _IsMemoryFeatureVisible = false;
private Boolean _IsAdvancedFeatureVisible = false;
private Boolean _IsAdvancedFeatureEnabled = false;

Le code dans Figure 8 montre comment définir les champs privés de fonctionnalité activer/désactiver des valeurs stockées dans un fichier ConfigSettings.

Figure 8 fonction bascule valeurs stockées dans un fichier ConfigSettings

private void GetFeatureTogglesFromSettings()
{  
  _IsKeyPadFeatureEnabled = 
    Properties.ConfigSettings.Default.KeyPadFeatureEnabled;
  _IsKeyPadFeatureVisible = 
    Properties.ConfigSettings.Default.KeyPadFeatureVisible;
  _IsMemoryFeatureEnabled = 
    Properties.ConfigSettings.Default.MemoryFeatureEnabled;        
  _IsMemoryFeatureVisible = 
    Properties.ConfigSettings.Default.MemoryFeatureVisible;
  _IsAdvancedFeatureEnabled = 
    Properties.ConfigSettings.Default.AdvancedFeatureEnabled;
  _IsAdvancedFeatureVisible = 
    Properties.ConfigSettings.Default.AdvancedFeatureVisible;
  tbMode.Text = Constants.configSettings;
}

Le code dans Figure 9 montre comment définir les champs privés de fonctionnalité activer/désactiver des valeurs stockées dans la table de base de données FeatureToggle.

Figure 9 la valeur privé champs de fonction stockée activer/désactiver des valeurs stockées dans une Table de base de données

private void GetFeatureTogglesFromStore()
{
  _IsKeyPadFeatureEnabled = FeatureToggles.FeatureToggles.IsEnabled(
    Properties.FeatureToggleSettings.Default.KeyPadFeatureEnabled);
  _IsKeyPadFeatureVisible = FeatureToggles.FeatureToggles.IsEnabled(
    Properties.FeatureToggleSettings.Default.KeyPadFeatureVisible);
  _IsMemoryFeatureEnabled = FeatureToggles.FeatureToggles.IsEnabled(
    Properties.FeatureToggleSettings.Default.MemoryFeatureEnabled);
  _IsMemoryFeatureVisible = FeatureToggles.FeatureToggles.IsEnabled(
Properties.FeatureToggleSettings.Default.MemoryFeatureVisible);
  _IsAdvancedFeatureEnabled = FeatureToggles.FeatureToggles.IsEnabled(
    Properties.FeatureToggleSettings.Default.AdvancedFeatureEnabled);
  _IsAdvancedFeatureVisible = FeatureToggles.FeatureToggles.IsEnabled(
    Properties.FeatureToggleSettings.Default.AdvancedFeatureVisible);
  tbMode.Text = Constants.databaseSettings;
}

Le code dans Figure 10 montre comment l'application évalue fonction bascule et définit les propriétés Visible et Enabled de la fonction de la calculatrice de Windows à l'aide de méthodes de wrapper.

Figure 10 utilisation de méthodes de Wrapper pour définir les propriétés Visible et activées de la calculatrice de Windows

private void EvaluateFeatureToggles()
  {
    this.tbVersion.Text = Properties.CommonSettings.Default.Version;
    if (Properties.CommonSettings.Default.DatabaseSettings)
    {
      GetFeatureTogglesFromStore();
    }
    else
    {
      GetFeatureTogglesFeatureToggleFromSettings();
    }
    if (_IsAdvancedFeatureEnabled)
    {
      _IsAdvancedFeatureVisible = true;
    }
    SetAdvancedFeatureEnabled(_IsAdvancedFeatureEnabled);
    SetAdvancedFeatureVisible(_IsAdvancedFeatureVisible);
  }

Le code suivant montre une fonction wrapper pour masquer ou afficher les éléments d'interface utilisateur associés à la fonctionnalité de fonctions avancées :

private void SetAdvancedFeatureVisible(bool state)
{
  this.btnBkspc.Visible = state;           
  this.btnSqrt.Visible = state;
  this.btnPercent.Visible = state;
  this.btnReciprocal.Visible = state;
  this.btnPlusMinus.Visible = state;
}

La calculatrice de Windows tire parti d'une bibliothèque de classes réutilisable pour encapsuler tout le traitement associé à la table FeatureToggle. En utilisant cette bibliothèque de classes, le code qui utilise le fichier ConfigSettings est presque identique au code à l'aide d'une table de base de données FeatureToggle.

Synthèse

L'avantage de la fonction bascule est que les fonctionnalités nouvelles ou améliorées sont archivées dans la branche principale, donc ils peuvent être continuellement intégrés et testés avec l'existant base de code à la compilation. Auparavant, code de fonctionnalités nouvelles ou améliorées n'était généralement pas intégré avec le code de base jusqu'au plus proche de la date limite de libération, qui est risquée, difficile et lourde de périls. Fonction bascule tant fonctionnalité branches sont des approches viables, que vous pouvez utiliser pour réaliser une version stable avec seulement les fonctions dûment remplies qui ont passé les tests nécessaires de QA. Le choix d'utiliser un ou l'autre dépend de vos besoins et à vos processus de développement en place.

Bill Heys est consultant senior avec les processus de conception et Solutions ALM. Il a été consultant ALM senior chez Microsoft. Il est membre de la Microsoft Visual Studio ALM Rangers, développeur en chef sur la branche de Rangers et des conseils de fusion et un contributeur à la sortie de la direction du contrôle de Version des Rangers. Le contacter au bill.heys@live.com.

Remercie les experts techniques suivants d'avoir relu cet article : Michael Fourie (consultant indépendant), Micheal Learned (Microsoft), Matthew Mitrik (Microsoft) et Willy -Peter Schaub (Microsoft)