Condividi tramite


Il presente articolo è stato tradotto automaticamente.

ALM Rangers

Sviluppo di software con i feature toggle

Bill Heys

Scaricare il codice di esempio

Attiva o Disattiva funzionalità come un concetto di sviluppo software consentono di perseguire lo sviluppo parallelo, simultanee caratteristica come alternativa alla diramazione per lo sviluppo parallelo (chiamato anche rami di caratteristica). Attiva la funzionalità è a volte chiamati flag di funzionalità, caratteristica interruttori, pinne di funzionalità o caratteristiche condizionali. Attiva la funzionalità consentono di integrare continuamente caratteristiche mentre sono in fase di sviluppo. È possibile utilizzare attiva la funzione per nascondere, disabilitare o abilitare caratteristiche individuali in fase di esecuzione.

Come con tutte le tecniche di sviluppo software, usereste caratteristica commuta in combinazione con il controllo di versione (ad esempio Microsoft Team Foundation Server). Utilizzando la funzione alterna da soli non implica eliminando tutti i rami da un piano di controllo della versione completa. Una distinzione di attiva la caratteristica è che tutte le modifiche vengono archiviate nel ramo principale (mainline) invece di un ramo di sviluppo.

Una caratteristica è disabilitata o nascosta da tutti gli utenti, fino a quando si avvia lo sviluppo di funzionalità. Durante lo sviluppo, potete attivare la funzionalità per lo sviluppo e unit test e disattivarla per tutti gli altri utenti. Tester di qualità Assurance (QA) possono anche attivare funzionalità che vogliono testare. Fino a quando la funzionalità è completa e pienamente testato secondo la definizione di fatto (DoD) e passa il test di qualità, sarà nascosto o disabilitato nel software rilasciato. È possibile modificare dinamicamente il valore di un funzione toggle senza creare e distribuire una nuova build.

A partire da un confronto tra i rami della caratteristica e attiva la funzione, io suggerisco tecniche alternative per l'implementazione attiva la funzione nel codice. Utilizzando un'applicazione di esempio Windows calculator, ti illustro come nascondere o mostrare caratteristiche in fase di esecuzione utilizzando la funzione attiva.

Continuous Integration

Utilizzando la funzione attiva, si può fare integrazione continua — tutto lavoro di sviluppo è controllato nel ramo principale e continuamente integrato con tutti gli altri codici in quel ramo. Ogni check-in, codice nel ramo principale è costruito e testato su un server di compilazione usando costruire verifica test automatizzati (BVT).

Come affermato in Microsoft patterns & libro di pratiche su erogazione continua ("Costruzione di una Pipeline di rilascio con Team Foundation Server 2012" [2013]), "Per erogazione continua, si intende che attraverso tecniche quali il controllo delle versioni, continua integrazione, automazione e gestione ambientale, sarete in grado di diminuire il tempo tra quando si prima un'idea e quando quell'idea è realizzato come un software che è in produzione" (bit.ly/1kFV0Kx).

È possibile utilizzare automatizzato di unit test per testare il codice prima di archiviarlo nel ramo principale. Se il check-in si rompe una build sul server di compilazione, dovrete risolvere il codice prima del check-in è consentito. Se una caratteristica della compilazione non passa il test QA, è possibile nasconderlo dalla distribuzione o rilasciare fino a che non lo fa.

Attiva la funzione darvi runtime isolamento di una funzionalità in fase di sviluppo fino a quando non è completo, testato e pronto per il rilascio. Utilizzando funzionalità alterna con integrazione continua, si lavora direttamente nel ramo principale. Codice è controllato al ramo principale, mantenendo questo ramo stabile per compilazioni e distribuzioni (Vedi Figura 1).

Feature Toggles Support Continuous Integration of Parallel Development
Figura 1 caratteristica cavicchi supportano l'integrazione continua di sviluppo parallelo

Attiva la funzione in uso

Figura 2 Mostra un esempio di funzione alterna al lavoro in un campione di calcolatrice di Windows Form. Ciò illustra anche le sfide dello sviluppo parallelo caratteristica simultanee.

Sample Windows Calculator Showing Three New Features
Figura 2 esempio calcolatrice di Windows mostrando tre nuove funzionalità

Questo esempio confronta gestione sviluppo parallelo utilizzando rami caratteristica a utilizzando la funzione attiva. Ci sono tre nuove funzionalità (tastiera, funzioni avanzate e funzioni di memoria) sviluppato in parallelo come la calcolatrice di base viene distribuita.

Funzione pattern Toggle

Ci sono molti modelli di utilizzo in cui è possibile utilizzare funzionalità attiva per consentire l'integrazione continua di tutto il codice, includendo il codice in sospeso o incompleta. Utilizzando la funzione attiva può aumentare velocità di un team sviluppo riducendo o eliminando la necessità di rami di sviluppo parallelo e il conseguente diramazione e Unione dei compiti, che possono essere estremamente che richiede tempo e soggetto a errori.

Ecco un elenco dei tipici scenari dove si poteva considerare attiva la funzionalità:

  • Nascondere o disabilitare nuove funzionalità nell'interfaccia utente
  • Nascondere o disabilitare nuovi componenti dell'applicazione
  • Controllo delle versioni, un'interfaccia
  • Estendere un'interfaccia
  • Supporto di più versioni di un componente
  • Aggiunta una nuova funzionalità a un'applicazione esistente
  • Migliorare una funzionalità esistente in un'applicazione esistente

Diramazione per isolamento di caratteristica

Con una strategia di ramificazione di funzionalità, il team può isolare simultaneo o parallelo sviluppo delle specificità — o gruppi di caratteristiche — in rami separati caratteristica. Caratteristica rami darvi notevole flessibilità in termini di quando a spostare un rilascio in produzione. Non devi aspettare fino a quando tutte le funzionalità sono pronte per fare una distribuzione completa.

È facilmente possibile unire caratteristiche individuali o gruppi di funzioni nel ramo principale quando sono completi secondo il Ministero della difesa. È possibile creare nuovi rami della caratteristica, come necessario e cancellarli una volta completata la funzionalità. Caratteristiche non sono unite al ramo principale fino a quando incontrano il DoD. Seguendo l'esempio, Figura 3 presenta tre nuovi rami caratteristica che fornisce isolamento durante lo sviluppo parallelo.

Branching for Feature Isolation
Figura 3 la diramazione per isolamento di caratteristica

Per ulteriori istruzioni su vari scenari ramificati caratteristica, è possibile consultare l'e-book di ALM Rangers su strategie di ramificazione a aka.ms/vsarsolutions.

Caratteristica cavicchi vs. Caratteristica rami

Utilizzando la funzione alterna consente e team perseguire integrazione continua, distribuzione continua e pratiche di rilascio continuo. Queste pratiche permettono una caratteristica più frequente integrazione di codice come stai sviluppate in parallelo rispetto ai rami della caratteristica. Allo stesso tempo, funzione attiva e disattiva anche il supporto runtime isolamento delle funzionalità in fase di sviluppo e non è pronto per il rilascio.

Con attiva la funzione, tutte le modifiche in sospeso vengono controllate nel ramo principale. Ogni check-in è preceduto fino a un processo di compilazione automatizzata costruisce tutto il codice dal ramo principale su un server di compilazione, e con successo funzionamenti automatizzati BVT. Questo è il processo noto come integrazione continua.

In fase di esecuzione, attiva la funzione nasconde o ignorare le caratteristiche che sono nella compilazione, ma non è pronto per il rilascio. A seconda di come si prevede di implementare una funzionalità, lo sforzo di utilizzare funzionalità attiva può a volte essere eccessivamente complesso. D'altra parte, nascondendo le funzionalità dell'interfaccia utente può essere semplice.

Quando si utilizzano i rami della caratteristica, tutto lo sviluppo è controllato nel ramo funzionalità associato e isolato dal codice nel ramo principale o di altri rami della caratteristica. Non è possibile unire una funzionalità nuova o migliorata con il ramo principale o di altri rami della caratteristica fino a quando la funzionalità è completa di codice, passa il test di qualità richiesti o incontra il DoD. Solo a quel punto è la funzionalità integrata (fuse) con il ramo principale. Pertanto, isolamento del codice e l'integrazione continua sono presso un po' estremi opposti dello spettro"integrazione".

Consentendo una nuova caratteristica di una distribuzione è relativamente facile e rischio gratis. Semplicemente attivare la funzionalità associato cavicchi a visibili e attivati. Il tentativo di rilasciare una nuova funzionalità utilizzando rami di funzionalità è molto più complicato. Devi unire la funzionalità nel ramo principale. Questo è spesso un tempo -­consumando e impegnativo processo.

Rimozione di una caratteristica

In alcuni progetti, dovrete rimuovere o arretra caratteristiche incomplete. Rollback singoli insiemi di modifiche per ripristinare una funzionalità (cherry picking cambiamenti) è anche complicato, laborioso e potrebbe richiedere una rilavorazione Codice significativo.

È indispensabile per isolare le caratteristiche dal ramo principale fino a quando si decide di rilasciare tali caratteristiche. In ogni caso, tirarsi indietro una caratteristica da un comunicato, appena prima che il rilascio è previsto è rischioso ed error-prone. Utilizzando la funzione attiva e disattiva, si controlla tutto il codice per tutte le caratteristiche nel ramo principale. Attiva la funzione semplicemente nasconde o disabilita le funzionalità selezionate dal runtime o rilascio.

Scelte di implementazione

Ci sono molteplici approcci alla persistenza dello stato di attiva la funzionalità di un'applicazione. Qui ci sono due approcci abbastanza semplice:

  1. Utilizzare le impostazioni dell'applicazione per definire attiva la funzionalità (distribuito nel file di configurazione dell'applicazione XML quando l'applicazione viene compilata).
  2. Attiva o Disattiva funzionalità di archivio come righe in una tabella di database.

Definire la funzione attiva o disattiva non solo è più facile definire attiva la funzionalità nel file di configurazione utilizzando le impostazioni di progettazione, ma non devi fare nulla nell'applicazione per salvare lo stato della funzione attiva/disattiva quando l'applicazione termina. Il file di impostazioni di esempio illustrato nel Figura 4 definisce la caratteristica cavicchi.

This Sample ConfigSettings File Stores Feature Toggle State for the Windows Calculator
Nella figura 4 questo stato campione ConfigSettings File negozi caratteristica Toggle per la calcolatrice di Windows

Memorizzare la funzione alterna come righe del Database per utilizzare una tabella di database funzione toggle per memorizzare lo stato di attivazione/disattivazione di funzionalità, l'applicazione richiederà due file di impostazioni. Il file di impostazioni di CommonSettings definisce le opzioni utilizzate dall'applicazione. Le impostazioni DatabaseSettings del file controlli se attiva la funzione è definite e mantenute in una tabella di database (se vero) o in un file di impostazioni (quando è False). Il file di FeatureToggleSettings fornisce i nomi per ogni i cavicchi caratteristica potrai archiviare nel database (vedere Figura 5).

Feature Toggle Names Stored in the Database Table As Rows
Figura 5 funzione Toggle nomi memorizzati nella tabella del Database come righe

L'approccio utilizzato nell'esempio calcolatrice di Windows è quello di creare dinamicamente funzione toggle righe. Quando l'applicazione viene eseguita per la prima volta, la tabella sarà vuota. In fase di esecuzione, tutti i nomi di funzione toggle sono controllati per vedere se essi sei abilitati. Se uno qualsiasi non già nella tabella, l'applicazione li aggiungerà alla tabella. La tabella di esempio FeatureToggle in Figura 6 spettacoli tutte presentano righe toggle aggiunti.

FeatureToggle Table After Initial Run
Figura 6 FeatureToggle tabella dopo esecuzione iniziale

Indipendente dall'implementazione concetti

Quando si utilizza un commutatore di funzione per disattivare una funzionalità, codice nell'applicazione nasconde o disattiva i controlli sulla base del valore del cavicchio caratteristica (True/False) connesso con tale caratteristica. È possibile scegliere di nascondere la caratteristica completamente dall'interfaccia utente per le funzionalità in fase di sviluppo, o per mostrare la caratteristica come disabilitato. Quando si rilascia la caratteristica, saranno visibili e attivati.

Figura 7 illustrato la calcolatrice di Windows con la funzione di tastiera visibili e attivati. Le funzioni di memoria e caratteristiche avanzate funzioni sono visibili, ma disabili.

Windows Calculator with Keypad Feature Visible and Enabled, and the Memory and Advanced Functions Features Visible and Disabled
Figura 7 calcolatrice di Windows con funzione tastierino visibile e abilitato e la memoria e le funzioni avanzate caratteristiche visibili e disabili

Il primo passo in questa applicazione di esempio crea un nuovo database di FeatureToggleDemo, seguito dalla creazione di una semplice tabella di FeatureToggle. Quando si scarica l'applicazione di esempio, troverete tre file SQL per: Creazione del FeatureToggle Database, creando la tabella FeatureToggle e creando le due stored procedure utilizzate dall'applicazione per caricare i valori da e salvarli alla tabella FeatureToggle.

Dopo aver creato la tabella FeatureToggle, non è necessario aggiungere delle righe di FeatureToggle prima di eseguire l'applicazione per la prima volta. L'applicazione utilizza una libreria di classe FeatureToggle per incapsulare tutta la logica di applicazione per l'accesso e la funzionalità di aggiornamento attiva o disattiva.

Il codice seguente Mostra campi privati utilizzati per contenere lo stato dell'attiva la funzionalità:

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

Il codice in Figura 8 illustra come impostare i campi privati dalla caratteristica toggle valori memorizzati in un file ConfigSettings.

Figura 8 funzione Toggle valori memorizzati in un File 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;
}

Il codice in Figura 9 illustra come impostare i campi privati dalla funzione toggle valori memorizzati nella tabella del database FeatureToggle.

Figura 9 impostare campi privati da Stored funzione Toggle valori memorizzati in una tabella di Database

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;
}

Il codice in Figura 10 Mostra come l'applicazione valuta caratteristica cavicchi e imposta la proprietà Visible e attivato la funzione di calcolatrice di Windows utilizzando metodi wrapper.

Figura 10 utilizzando metodi Wrapper per impostare la proprietà visibile e abilitata della calcolatrice di 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);
  }

Il codice seguente mostra una funzione wrapper per nascondere o visualizzare gli elementi di interfaccia utente connessi con la funzionalità avanzate funzioni:

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 calcolatrice di Windows si avvale di una libreria di classi riutilizzabili per incapsulare l'elaborazione di tutti gli associati alla tabella FeatureToggle. Utilizzando questa libreria, il codice che utilizza il file ConfigSettings è quasi identico al codice utilizzando una tabella di database FeatureToggle.

Conclusioni

Il vantaggio della funzione attiva è che funzionalità nuove o migliorate sono archiviati per il ramo principale, quindi possono essere continuamente integrati e testati con l'esistente codice in fase di compilazione. In precedenza, codice da funzionalità nuove o migliorate era generalmente non integrata con il codebase fino al più vicino alla scadenza per il rilascio che è rischioso, impegnativo ed irto di pericolo. Attiva o Disattiva funzionalità sia caratteristica rami sono possibili approcci che è possibile utilizzare per ottenere un rilascio stabile con solo completate caratteristiche che hanno superato i necessari test QA. La scelta di utilizzare uno o l'altro dipende dalla vostre esigenze e i processi di sviluppo in atto.

Bill Heys è un consulente senior di ALM con processo di Design e soluzioni. In precedenza era un consulente senior di ALM con Microsoft. Egli è un membro di Microsoft Visual Studio ALM Rangers, capo sviluppatore del ramo di Rangers e Merge di orientamento e un contributo per il rilascio della guida controllo versione Rangers. Contattarlo al bill.heys@live.com.

Grazie ai seguenti esperti tecnici per la revisione di questo articolo: Michael Fourie (consulente indipendente), Micheal Learned (Microsoft), Matthew Mitrik (Microsoft) e Willy-Peter Schaub (Microsoft)