Lógica de feature flags: combinar flags sin sorpresas
Los feature flags combinan una audiencia, un interruptor maestro y un interruptor de emergencia, y las sorpresas vienen de cómo se combinan. (beta_user OR internal) AND flag_on AND NOT kill_switch es el patrón: cuatro condiciones, dieciséis filas, y un interruptor de emergencia que debe ganar siempre.
La audiencia es un OR de grupos (beta_user OR internal), el interruptor maestro es un AND (flag_on), y el interruptor de emergencia es un AND NOT. Las comprobaciones de la página muestran la regla contingente con el testigo internal = VERDADERO, flag_on = VERDADERO, el resto FALSO, como una fila en la que la función está activada. El interruptor de emergencia es correcto porque está en el nivel superior: ninguna combinación de las otras tres puede activar la función mientras está puesto, cosa que la tabla de verdad muestra como ocho filas FALSAS en las que kill_switch es VERDADERO.
Las sorpresas son estructurales. Un interruptor de emergencia colocado dentro del paréntesis de la audiencia, (beta_user OR (internal AND NOT kill_switch)) AND flag_on, apaga la función solo para los usuarios internos. Dos flags combinados con OR cuando se quería AND convierten «los dos flags deben estar activos» en «basta con cualquiera». Un flag que vale VERDADERO por defecto cuando no está fijado, en un sistema en el que un valor sin fijar no es FALSO, activa la función para todo el mundo durante un despliegue. Cada uno de estos casos está a una fila de la regla prevista, y el comprobador de equivalencia encuentra esa fila.
La lógica de flags también cambia a menudo, lo que la convierte en el hogar natural del método de regresión: compara la regla nueva con la antigua, revisa las filas que difieren contra la petición de cambio, y conserva los contraejemplos. Los pares de independencia dan las cuatro pruebas que muestran que cada flag importa, y la lista de revisión de reglas tiene una línea para la posición del interruptor de emergencia.
Ejemplo
enabled := (beta_user OR internal) AND flag_on AND NOT kill_switch · salida
Comprobaciones exactas
Tabla de verdad (16 filas)
| # | beta_user | internal | flag_on | kill_switch | enabled |
|---|---|---|---|---|---|
| 0 | FALSO | FALSO | FALSO | FALSO | FALSO |
| 1 | FALSO | FALSO | FALSO | VERDADERO | FALSO |
| 2 | FALSO | FALSO | VERDADERO | FALSO | FALSO |
| 3 | FALSO | FALSO | VERDADERO | VERDADERO | FALSO |
| 4 | FALSO | VERDADERO | FALSO | FALSO | FALSO |
| 5 | FALSO | VERDADERO | FALSO | VERDADERO | FALSO |
| 6 | FALSO | VERDADERO | VERDADERO | FALSO | VERDADERO |
| 7 | FALSO | VERDADERO | VERDADERO | VERDADERO | FALSO |
| 8 | VERDADERO | FALSO | FALSO | FALSO | FALSO |
| 9 | VERDADERO | FALSO | FALSO | VERDADERO | FALSO |
| 10 | VERDADERO | FALSO | VERDADERO | FALSO | VERDADERO |
| 11 | VERDADERO | FALSO | VERDADERO | VERDADERO | FALSO |
| 12 | VERDADERO | VERDADERO | FALSO | FALSO | FALSO |
| 13 | VERDADERO | VERDADERO | FALSO | VERDADERO | FALSO |
| 14 | VERDADERO | VERDADERO | VERDADERO | FALSO | VERDADERO |
| 15 | VERDADERO | VERDADERO | VERDADERO | VERDADERO | FALSO |
Lectura en lenguaje claro
Principianteenabled es verdadero exactamente cuando se cumplen todas las condiciones siguientes:
1. al menos uno entre beta_user e internal es verdadero (pueden serlo ambos)
2. flag_on es verdadero
3. kill_switch es falso
En todos los demás casos, enabled es falso.
Sobre los operadores:
- AND (Y) solo es verdadero cuando todas sus partes son verdaderas.
- OR (O) es inclusivo: es verdadero en cuanto al menos una parte es verdadera, también cuando lo son varias.
- NOT (NO) invierte un valor: lo verdadero pasa a ser falso y lo falso, verdadero.
Intermedioenabled es verdadero exactamente cuando se cumplen todas las condiciones siguientes:
1. al menos uno entre beta_user e internal es verdadero (pueden serlo ambos)
2. flag_on es verdadero
3. kill_switch es falso
En todos los demás casos, enabled es falso.
Avanzadoenabled es verdadero exactamente cuando se cumplen todas las condiciones siguientes [conjunción ∧]:
1. al menos uno entre beta_user e internal es verdadero (pueden serlo ambos) [disyunción inclusiva ∨]
2. flag_on es verdadero
3. kill_switch es falso [negación ¬]
En todos los demás casos, enabled es falso.
Notación formal: (beta_user ∨ internal) ∧ flag_on ∧ ¬kill_switch
Diagrama lógico
El error habitual
Poner el interruptor de emergencia dentro de un paréntesis. (beta_user OR (internal AND NOT kill_switch)) AND flag_on sigue entregando la función a los usuarios beta después de accionar el interruptor. Un interruptor de emergencia es AND NOT kill_switch alrededor de toda la regla, y la tabla de dieciséis filas muestra las ocho filas que debe poner a cero.
Preguntas
¿Cómo combino dos funciones que necesitan estar las dos activas?
Con AND: feature_a AND feature_b. OR significa que basta con cualquiera. El comprobador de equivalencia muestra las filas en las que las dos combinaciones difieren, que son aquellas en las que exactamente un flag está activo.
¿Y los despliegues por porcentaje?
Un cubo de porcentaje es una condición booleana una vez decidida (in_rollout_bucket), y la regla la combina como cualquier otra. La decisión de qué usuarios caen en el cubo vive fuera de la regla, en la descripción del glosario.
Relacionado
Véase también
- Regla de feature flag: (beta OR interno) AND flag_activo AND NOT interruptor
- Reglas de control de acceso: roles, excepciones y el error del usuario vetado
- Pruebas de regresión para reglas de decisión que cambian
- Una entrada sin asignar no es FALSO: asignaciones incompletas
- «A o B y C»: la ambigüedad de agrupación y cómo resolverla
- Pares de independencia MC/DC, ejemplo resuelto con el informe de cobertura del motor
- Lista de revisión de reglas de decisión (para analistas y revisores)
Pruebas y reglas
Generado a partir del motor de Tangibool, semántica tangibool-semantics/1, motor 1.0.0, compilación . Cada tabla, mapa, simplificación y veredicto de estas páginas lo calculó el motor de Tangibool al compilar el sitio, y cada afirmación la volvió a comprobar el mismo verificador exacto que usa la app. Los límites se indican donde aplican. © 2026 Foreranger LTD.