Feature Toggle är en mekanism för att växla applikationsfunktionalitet under körning, vilket gör det möjligt för utvecklare att hantera tillgängligheten av funktioner utan att ändra kod och omdistribuera. Till skillnad från villkorlig kompilering (ifdef) fungerar toggle på runtime-nivå och kan ändras dynamiskt. Enligt Martin Fowler (2024) är feature toggles en nyckelkomponent inom trunk-based development och kontinuerlig leverans. Feature toggle ger team flexibilitet i hanteringen av releaser och experiment.
Huvudpunkter
Feature Toggle (funktionsväxel) — är en teknik där koden för en ny funktion omsluts av en villkorlig konstruktion som kontrollerar värdet av en konfigurationsparameter. Om parametern är true — är den nya funktionaliteten aktiv, om false — utförs den gamla koden. Den viktigaste skillnaden från feature flag är att toggle är en binär växel som fungerar enligt principen „på/av”, utan komplexa regler för målgruppsanpassning och trafikdistribution.
Feature toggle implementeras som en vanlig if-konstruktion runt den nya funktionaliteten. Toggle-värdet lagras i applikationskonfigurationen — miljövariabler, JSON-fil eller databas. Vid start laddar applikationen konfigurationen och använder den för att fatta beslut om funktionernas synlighet. I det enklaste fallet kräver ändring av toggle-värdet omstart av applikationen, men i produktionssystem stöder toggles vanligtvis hot reload via en extern konfigurationsserver eller API.
Låt oss titta på implementeringen av feature toggle i JavaScript (Node.js). Växeln lagras i JSON-konfiguration och laddas vid serverstart. Middleware kontrollerar toggle-värdet innan begäran dirigeras till den nya eller gamla handlern. En sådan implementering gör det möjligt att lägga till ny funktionalitet i huvudgrenen av koden utan att störa den aktuella API-versionens funktion.
const config = require("./config.json");
const toggles = {
get(name) {
return config.features[name] ?? false;
},
isEnabled(name, context) {
const toggle = config.features[name];
if (!toggle) return false;
if (toggle.enabled === true) return true;
if (toggle.percentage && context.userId) {
return hashCode(context.userId) % 100 < toggle.percentage;
}
return false;
}
};
const app = express();
app.use("/api/checkout", (req, res, next) => {
if (toggles.isEnabled("new_checkout", req)) {
return newCheckoutHandler(req, res);
}
return legacyCheckoutHandler(req, res);
});
Pete Hodgson från ThoughtWorks identifierar tre huvudtyper av feature toggles, klassificerade efter livslängd och användningssyfte. Korrekt bestämning av toggle-typ hjälper till att välja lämplig lagringsmekanism och hanteringsprocess. Låt oss titta på varje typ i context av mobilutveckling.
Business toggles — de längst levande växlarna. De hanterar affärsregler som endast är tillgängliga för vissa användarkategorier (premiumfunktioner, regionala egenskaper). Sådana toggles kan leva i åratal och har vanligtvis mer komplex logik än binär på/av. Release toggles — temporära växlar för att dölja ofullbordad funktionalitet. Deras livscykel sträcker sig från några dagar till några veckor. Efter att funktionaliteten är färdigställd tas release toggle bort från koden. Dessa toggles är grunden för trunk-based development, vilket gör det möjligt för utvecklare att committa till huvudgrenen utan att vänta på att hela funktionaliteten ska bli klar.
Experiment toggles används för A/B-tester och gradvis utrullning. Till skillnad från release toggles stöder experiment toggles procentuell distribution av användare och integration med analyssystem. De kan leva längre än release toggles (upp till flera månader), men måste också tas bort efter att experimentet är slutfört. Infrastructure toggles — växlar för hantering av infrastrukturförändringar: databasmigrering, övergång till ny API-leverantör, ändring av cachelagringsalgoritmer. Dessa toggles kräver särskild uppmärksamhet vid testning eftersom deras växling påverkar stabiliteten för hela tjänsten.
| Toggle-typ | Varaktighet | Målgrupp | Exempel |
|---|---|---|---|
| Business | Månader-år | Per roll/region | Premiumfunktioner |
| Release | Dagar-veckor | Utvecklare/QA | Ofullbordad skärm |
| Experiment | Veckor-månader | % användare | A/B-test gränssnitt |
| Infrastructure | Dagar-veckor | Intern | DB-migrering |
Även om termerna „feature toggle” och „feature flag” ofta används utbytbart, finns det konceptuella skillnader mellan dem. Att förstå dessa skillnader hjälper till att välja rätt verktyg för en specifik uppgift och undvika förvirring i teamet. Låt oss titta på de viktigaste skillnaderna och tillämpningsområdena för varje metod.
Feature toggle — är i första hand en teknisk mekanism: en binär växel inbäddad i applikationskoden. Toggle hanteras via konfiguration och kräver ingen extern infrastruktur. Feature flag — är ett bredare koncept som omfattar en hanteringsplattform: UI för konfiguration, SDK för integration, användningsövervakning, analys och granskning. Flaggor stöder komplexa målgruppsregler (per region, version, enhet), A/B-experiment och automatisk borttagning. Man kan säga att feature flag är en evolution av feature toggle: teamet börjar med enkla konfigurationsväxlar och övergår när det växer till en specialiserad plattform.
För små team och projekt med en tjänst eller monolit räcker enkla konfigurationstoggles helt och hållet. Om du har 5–10 utvecklare och 1–2 aktiva toggles samtidigt — kommer en extern plattform att vara överflödig. Feature flag-plattformar (LaunchDarkly, Unleash) blir nödvändiga när antalet aktiva flaggor överstiger 20–30, teamet har 20+ utvecklare, eller noggrann åtkomsthantering till funktioner för olika användarsegment krävs. För mobilapplikationer, där klientuppdatering tar dagar, ger feature flag-plattformar en extra fördel — möjligheten att ändra applikationens beteende utan att publicera en ny version.
Valet av verktyg för hantering av feature toggles beror på teamets storlek, teknologisk stack och säkerhetskrav. Låt oss titta på alternativen från enkla konfigurationsfiler till industriella hanteringsplattformar, inklusive open-source-alternativ.
Feature toggles bör vara förstklassiga medborgare i CI/CD-pipelinen. I byggfasen kontrollerar pipelinen att alla release toggles som planerats för borttagning i den aktuella sprinten verkligen har tagits bort från koden. I testfasen körs matristester med olika kombinationer av toggles. I distributionsfasen synkroniserar systemet automatiskt toggle-konfigurationen med produktionsmiljön. Integration med PagerDuty eller Opsgenie gör det möjligt att skapa varningar vid upptäckt av stale toggles eller när det tillåtna antalet aktiva toggles överskrids.
För enkla scenarier räcker JSON-konfiguration i Git med kodgranskning vid ändringar. Ett mer avancerat alternativ — Togglz (Java) eller Gofeature (Go) — bibliotek som lägger till ett minimalt UI för hantering av toggles. För produktionssystem rekommenderas Unleash (open-source) med SDK för alla språk och stöd för aktiveringsstrategier, eller Flagsmith med inbyggt A/B-testning. LaunchDarkly förblir standarden för enterprise-projekt med höga krav på granskning och efterlevnad. För mobilapplikationer erbjuder alla lösningar inbyggt SDK med cachelagring och offline-läge.
Feature toggles är ett tveeggat svärd. Utan hanteringsdisciplin förvandlas de till teknisk skuld som saktar ner utvecklingen och ökar kodens komplexitet. Enligt forskning från CodeScene (2024) innehåller 35–50% av kodbaserna stale toggles — växlar som stannar kvar i koden efter att utrullningen är slutförd. Låt oss titta på strategier för att förebygga och ta bort sådan skuld.
Processen för att ta bort en feature toggle består av fyra steg. Första: se till att togglen är påslagen för 100% av publiken eller avstängd för 0% (beroende på vilken kodgren som ska finnas kvar). Andra: ta bort alla villkorliga toggle-kontroller från koden och lämna endast den gren som ska vara produktionsbeteendet. Tredje: ta bort toggle-definitionen från lagringssystemet (konfiguration, databas eller plattform). Fjärde: kör testerna för att bekräfta att borttagningen inte har brutit funktionaliteten. Varje toggle bör ha en ägare och ett planerat borttagningsdatum, fastställt vid skapandet av växeln.
Manuell granskning av toggles är ineffektiv i skala över 50 växlar. Automatisering bygger på tre principer: CI-kontroll (förekomst av stale toggles blockerar merge), övervakning (dashboard med ålder för varje toggle och dess status), varningar (meddelande till ägaren om togglen inte har ändrats på N dagar). Statiska kodanalysverktyg (SonarQube, ESLint plugin) kan upptäcka toggles som alltid är på eller alltid av i koden — ett tydligt tecken på stale toggle. Slutlig kontroll — kodgranskning, där granskaren måste försäkra sig om att den nya togglen verkligen behövs och att den gamla kodgrenen kommer att tas bort.
package toggles
type Toggle struct {
Name string
Enabled bool
Owner string
CreatedAt time.Time
TTL time.Duration
}
type ToggleManager struct {
store map[string]*Toggle
}
func NewToggleManager() *ToggleManager {
return &ToggleManager{store: make(map[string]*Toggle)}
}
func (m *ToggleManager) IsEnabled(name string) bool {
t, ok := m.store[name]
if !ok {
return false
}
return t.Enabled
}
func (m *ToggleManager) GetStaleToggles() []string {
var stale []string
for name, t := range m.store {
if t.Enabled && time.Since(t.CreatedAt) > t.TTL {
stale = append(stale, name)
}
}
return stale
}
Vanliga frågor
Termerna används ofta utbytbart, men tekniskt är feature toggle en binär växel i koden (if-villkor som kontrollerar konfigurationen). Feature flag är ett bredare koncept som omfattar en hanteringsplattform med UI, SDK, analys och komplexa målgruppsregler. Toggle kräver ingen extern infrastruktur, flag — vanligtvis ja.
Release toggles bör tas bort inom 1–2 veckor efter att utrullningen är slutförd. Experiment toggles — omedelbart efter att A/B-testet är klart. Business toggles kräver regelbunden granskning (en gång i kvartalet). Det rekommenderas att ställa in en CI-kontroll som blockerar merge om en PR lägger till en ny toggle utan borttagningsuppgift i task trackern.
Ja, feature toggles används aktivt inom mobilutveckling. Huvudverktyget — Firebase Remote Config, som möjliggör dynamisk hantering av växlar utan att publicera en ny version av applikationen. Alternativ: LaunchDarkly SDK för iOS/Android, Unleash SDK, egen toggle-server med REST API. Det är viktigt att implementera cachelagring av värden för offline-läge.
Huvudmetoden — matristestning: körning av alla tester med påslagen och avstängd toggle. För N toggles kräver fullständig matristestning 2^n körningar, därför väljs i praktiken kritiska kombinationer. Enhetstester bör mocka toggle-värdet. Integrationstester kontrollerar specifika scenarier. I CI läggs ett steg till som kör tester med en slumpmässig kombination av toggles för att upptäcka oväntade interaktioner.
Huvudrisker: 1) stale toggles — kod med båda grenarna (på/av) blir komplex och svår att underhålla; 2) kombinatorisk komplexitet vid testning — varje toggle fördubblar antalet tillstånd; 3) dead code — den gamla grenen stannar kvar i koden efter att togglen permanent slagits på; 4) säkerhet — växlar som styr åtkomst skapar sårbarheter vid felaktig konfiguration. Alla risker är hanterbara med disciplin och automatisering.
Sammanfattning
Vi utvecklar en mobil applikation nyckelfärdigt
IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.
Läs också