Feature Toggle — основе, врсте прекидача и примена

Аутор: IT Sectr Објављено: 2026-04-13 Време читања: 8 мин

Feature Toggle је механизам пребацивања функционалности апликације током извршавања, који омогућава програмерима да управљају доступношћу могућности без промене кода и поновног постављања. За разлику од условне компилације (ifdef), toggle ради на нивоу рунтајма и може се динамички мењати. Према Martin Fowler (2024), feature toggles су кључни елемент trunk-based развоја и непрекидне испоруке. Feature toggle даје тимовима флексибилност у управљању издањима и експериментима.

Главно

  • Feature Toggle — динамички прекидач који управља понашањем апликације кроз конфигурацију
  • Основни типови: business toggles, release toggles, experiment toggles и infrastructure toggles
  • Feature Toggle vs Flag — toggle се чешће односи на једноставне бинарне прекидаче, flag — на потпуне платформе
  • Интеграција са CI/CD омогућава аутоматско проверавање и тестирање toggles на свакој етапи пајплајна
  • Главни проблем — нагомилавање stale toggles које је потребно редовно аудитирати и уклањати

Шта је Feature Toggle

Feature Toggle (прекидач функционалности) — техника у којој се код нове функције обавија условном конструкцијом која проверава вредност конфигурационог параметра. Ако је параметар true — нова функционалност је активна, ако је false — извршава се стари код. Кључна разлика од feature flag је у томе што је toggle бинарни прекидач који ради по принципу „укључено/искључено“, без сложених правила циљања и дистрибуције саобраћаја.

Дефиниција и принцип рада

Feature toggle се имплементира као обична if-конструкција око нове функционалности. Вредност toggle се чува у конфигурацији апликације — променљивама окружења, JSON датотеци или бази података. При покретању, апликација учитава конфигурацију и користи је за доношење одлука о видљивости функција. У најједноставнијем случају, промена вредности toggle захтева поновно покретање апликације, али у production системима toggles обично подржавају вруће поновно учитавање (hot reload) преко спољашњег конфиг-сервера или API-ја.

Пример једноставног toggle

Размотримо имплементацију feature toggle у JavaScript (Node.js). Прекидач се чува у JSON конфигу и учитава се при покретању сервера. Middleware проверава вредност toggle пре него што усмери захтев ка новом или старом handler-у. Оваква имплементација омогућава додавање нове функционалности у главну грану кода без нарушавања рада тренутне верзије API-ја.

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

Врсте feature toggles

Пит Хоџсон из ThoughtWorks-а издваја три основна типа feature toggles, класификујући их према времену живота и сврси коришћења. Правилно одређивање типа toggle помаже у избору одговарајућег механизма складиштења и процеса управљања. Размотримо сваки тип у контексту мобилног развоја.

Business и Release toggles

Business toggles — најдуговечнији прекидачи. Они управљају пословним правилима доступним само одређеним категоријама корисника (премиум функције, регионалне карактеристике). Такви toggles могу трајати годинама и обично имају сложенију логику од бинарног укључивања/искључивања. Release toggles — привремени прекидачи за скривање незавршене функционалности. Њихов животни циклус траје од неколико дана до неколико недеља. Након завршетка функционалности, release toggle се уклања из кода. Ови toggles су основа trunk-based развоја, омогућавајући програмерима да комитују у главну грану без чекања на завршетак целе функционалности.

Experiment и Infrastructure toggles

Experiment toggles се користе за A/B тестове и постепено издавање. За разлику од release toggles, experiment toggles подржавају процентуалну дистрибуцију корисника и интеграцију са системима аналитике. Они могу трајати дуже од release toggles (до неколико месеци), али се морају уклонити након завршетка експеримента. Infrastructure toggles — прекидачи за управљање инфраструктурним променама: миграција база података, прелазак на новог API провајдера, промена алгоритама кеширања. Ови toggles захтевају посебну пажњу при тестирању јер њихово пребацивање утиче на стабилност целог сервиса.

Тип toggleТрајањеПубликаПример
BusinessМесеци-годинеПо улогама/регионимаПремиум функције
ReleaseДани-недељеПрограмери/QAНезавршен екран
ExperimentНедеље-месеци% корисникаA/B тест интерфејса
InfrastructureДани-недељеУнутрашњаМиграција БП

Feature Toggle vs Feature Flag

Иако се термини „feature toggle“ и „feature flag“ често користе као заменљиви, између њих постоје концептуалне разлике. Разумевање ових разлика помаже у избору правог алата за одређени задатак и избегавању забуне у тиму. Размотримо кључне разлике и области примене сваког приступа.

Разлике у приступу

Feature toggle — пре свега технички механизам: бинарни прекидач уграђен у код апликације. Toggle се управља кроз конфигурацију и не захтева спољашњу инфраструктуру. Feature flag — шири концепт који укључује платформу за управљање: UI за конфигурацију, SDK за интеграцију, праћење коришћења, аналитику и аудит. Флагови подржавају сложена правила циљања (по региону, верзији, уређају), A/B експерименте и аутоматско уклањање. Може се рећи да је feature flag еволуција feature toggle-а: тим почиње са једноставним конфигурационим прекидачима, а како расте, прелази на специјализовану платформу.

Када је toggle довољан

За мале тимове и пројекте са једним сервисом или монолитом, једноставни конфигурациони toggles су сасвим довољни. Ако имате 5–10 програмера и 1–2 активна toggles истовремено — спољашња платформа ће бити сувишна. Feature flag платформе (LaunchDarkly, Unleash) постају неопходне када број активних флагова премаши 20–30, у тиму је 20+ програмера или је потребно прецизно управљање приступом функцијама за различите сегменте корисника. За мобилне апликације, где ажурирање клијента траје данима, feature flag платформе пружају додатну предност — могућност промене понашања апликације без објављивања нове верзије.

Алати за управљање

Избор алата за управљање feature toggles зависи од величине тима, технолошког стека и безбедносних захтева. Размотримо опције од једноставних конфигурационих датотека до индустријских платформи за управљање, укључујући open-source алтернативе.

Уграђивање у CI/CD

Feature toggles би требало да буду првокласни грађани CI/CD пајплајна. У фази изградње, пајплајн проверава да ли су сви release toggles планирани за уклањање у текућем спринту стварно уклоњени из кода. У фази тестирања, покрећу се матрични тестови са различитим комбинацијама toggles. У фази постављања, систем аутоматски синхронизује конфигурацију toggles са production окружењем. Интеграција са PagerDuty или Opsgenie омогућава креирање упозорења при откривању stale toggles или при прекорачењу дозвољеног броја активних toggles.

Популарна решења

За једноставне сценарије довољан је JSON конфиг у Git-у са code review-ем на измене. Напреднија опција — Togglz (Java) или Gofeature (Go) — библиотеке које додају минимални UI за управљање toggles. За production системе препоручују се Unleash (open-source) са SDK-јем за све језике и подршком за стратегије активације, или Flagsmith са уграђеним A/B тестирањем. LaunchDarkly остаје стандард за enterprise пројекте са високим захтевима за аудит и усклађеност. За мобилне апликације, сва решења пружају native SDK са кеширањем и офлајн режимом.

Технички дуг и отклањање

Feature toggles су оруђе са две оштрице. Без дисциплине управљања, они се претварају у технички дуг који успорава развој и повећава сложеност кода. Према истраживању CodeScene (2024), 35–50% кодних база садржи stale toggles — прекидаче који остају у коду након завршетка издавања. Размотримо стратегије превенције и отклањања таквог дуга.

Уклањање toggles

Процес уклањања feature toggle састоји се од четири корака. Први: уверите се да је toggle укључен за 100% публике или искључен за 0% (у зависности од тога која грана кода треба да остане). Други: уклоните све условне провере toggle из кода, остављајући само ону грану која треба да буде production понашање. Трећи: уклоните дефиницију toggle из система за складиштење (конфиг, БП или платформа). Четврти: покрените тестове да потврдите да уклањање није покварило функционалност. Сваки toggle треба да има власника и датум планираног уклањања, утврђене при креирању прекидача.

Аутоматизација аудита

Ручни аудит toggles је неефикасан при скали већој од 50 прекидача. Аутоматизација се заснива на три принципа: CI провера (присуство stale toggles блокира merge), надгледање (контролна табла са старошћу сваког toggle и његовим статусом), упозорења (обавештење власнику ако се toggle није мењао N дана). Алати за статичку анализу кода (SonarQube, ESLint plugin) могу детектовати toggles који су увек укључени или увек искључени у коду — очигледан знак stale toggle. Коначна провера — code review, при којем рецензент мора да се увери да је нови toggle стварно потребан и да ће стара грана кода бити уклоњена.

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

Често постављана питања

Чим се feature toggle разликује од feature flag?

Термини су често заменљиви, али технички feature toggle је бинарни прекидач у коду (if-услов који проверава конфиг). Feature flag је шири концепт који укључује платформу за управљање са UI-јем, SDK-јем, аналитиком и сложеним правилима циљања. Toggle не захтева спољашњу инфраструктуру, flag — обично да.

Колико често треба уклањати старе toggles?

Release toggles треба уклонити у року од 1–2 недеље након завршетка издавања. Experiment toggles — одмах након завршетка A/B теста. Business toggles захтевају редовни аудит (једном квартално). Препоручује се подешавање CI провере која блокира merge ако се у PR додаје нови toggle без задатка за уклањање у task tracker-у.

Могу ли се toggles користити за мобилне апликације?

Да, feature toggles се активно користе у мобилном развоју. Главни алат — Firebase Remote Config, који омогућава динамичко управљање прекидачима без објављивања нове верзије апликације. Алтернативе: LaunchDarkly SDK за iOS/Android, Unleash SDK, сопствени toggle сервер са REST API-јем. Важно је имплементирати кеширање вредности за рад у офлајн режиму.

Како тестирати код са feature toggles?

Основни метод — матрично тестирање: покретање свих тестова са укљученим и искљученим toggle. За N toggles, потпуно матрично тестирање захтева 2^n покретања, па се у пракси бирају критичне комбинације. Јединични тестови треба да mock-ују вредност toggle. Интеграциони тестови проверавају специфичне сценарије. У CI се додаје корак који покреће тестове са насумичном комбинацијом toggles за откривање неочекиваних интеракција.

Који су ризици feature toggles?

Главни ризици: 1) stale toggles — код са обе гране (укључено/искључено) постаје сложен и тешко одржив; 2) комбинаторна сложеност тестирања — сваки toggle удвостручује број стања; 3) dead code — стара грана остаје у коду након што је toggle трајно укључен; 4) безбедност — прекидачи који контролишу приступ стварају рањивости при неправилној конфигурацији. Сви ризици су управљиви уз дисциплину и аутоматизацију.

Резиме

  • Feature Toggle — бинарни прекидач функционалности којим се управља кроз конфигурацију апликације
  • Основни типови: business (месеци-године), release (дани-недеље), experiment (недеље-месеци), infrastructure (дани-недеље)
  • Feature Toggle vs Flag — toggle је једноставнији (if + конфиг), flag укључује потпуну платформу управљања
  • CI/CD интеграција је обавезна: провера stale toggles, матрични тестови, синхронизација конфигурације
  • Stale toggles — главни ризик: 35–50% кодних база садржи неискоришћене прекидаче
  • Уклањање toggle захтева процес: потврди стање, уклони код, уклони конфиг, покрени тестове
  • Аутоматизација аудита кроз CI, контролне табле и статичку анализу кода спречава нагомилавање техничког дуга

Развићемо мобилну апликацију под кључ

IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође