01 · Problem
Wofür braucht man das?
Viele kleine Ja/Nein-Zustände können kompakt gespeichert und sehr schnell kombiniert werden, wenn jeder Zustand genau ein Bit besitzt.
02 · Denkmodell
Das mentale Modell
Jede erlaubte Flag ist eine Zweierpotenz. OR setzt Bits, AND mit invertierter Maske löscht Bits und AND prüft eine einzelne oder kombinierte Maske.
Verwaltet validierte unabhängige Feature-Bits über eine öffentliche API. Number-Bitoperationen unterstützen positive Einzelbits bis Bit 30. Breitere Masken benötigen BigInt.
03 · Kontrollfluss
Was passiert in welcher Reihenfolge?
- Jeder Feature-ID genau eine Zweierpotenz zuweisen.
- Angeforderte Flags gegen eine erlaubte Menge validieren.
- Maske mit OR setzen oder mit AND-NOT löschen.
- Bei Abfrage alle angeforderten Bits vergleichen.
04 · Bauteile
Die entscheidenden Verträge
BitwiseFeatureFlagsVerwaltet unabhängige deklarierte Feature-Bits.enableFlag / disableFlag / isFlagEnabledValidiert und verändert ein deklariertes Einzelbit.05 · Selbst bauen
Selbst implementieren
Validiere das Datenmodell beim Erzeugen; ungültige Flags sollten später nicht nur geloggt werden.
- Akzeptiere nur positive einzelne Zweierpotenzen als Basisflags.
- Wirf bei unbekannten Flags einen definierten Fehler.
- Nutze bigint, sobald mehr als 31 unabhängige Bits benötigt werden.
class Flags {
private mask = 0;
constructor(private allowed: ReadonlySet<number>) {}
private check(flag: number) {
if (!this.allowed.has(flag)) throw new RangeError("Unknown flag");
}
enable(flag: number) { this.check(flag); this.mask |= flag; }
disable(flag: number) { this.check(flag); this.mask &= ~flag; }
has(flag: number) { this.check(flag); return (this.mask & flag) === flag; }
value() { return this.mask; }
}06 · Verifizieren
Was solltest du testen?
- Jedes erlaubte Bit lässt sich unabhängig setzen und löschen.
- Kombinierte Abfragen bestehen nur, wenn alle enthaltenen Bits gesetzt sind.
- Null, Nicht-Zweierpotenzen, unbekannte und zu große Flags werden abgelehnt.
Selbst ausprobieren
Formuliere die erste Prüfaussage als fehlschlagenden Test, implementiere die kleinste Korrektur und ergänze einen Grenzfall.
Jedes erlaubte Bit lässt sich unabhängig setzen und löschen.
Ansatz vergleichen
Dein Test sollte beim gezielten Verletzen der Invariante fehlschlagen und nach der Korrektur wieder bestehen. Halte den Aufbau deterministisch und prüfe ein beobachtbares Ergebnis.
07 · Grenzen
Kompromisse und Stolperfallen
- Number-Bitoperatoren arbeiten als signed 32-bit Integer.
- Bitmasken sind kompakt, aber ohne Symboltabelle schlecht lesbar und migrationsanfällig.
Number-Bitoperationen unterstützen positive Einzelbits bis Bit 30. Breitere Masken benötigen BigInt.
08 · Weiterdenken
Quellcode und verwandte Ideen
yarn tsx packages/bit-mask/examples/basic.ts