En sanningstabell listar varje möjlig kombination av indata till ett logiskt uttryck, tillsammans med det resulterande utfallet. De ser enkla ut, men de är ett av de mest tillförlitliga felsökningsverktygen du har när ett villkor inte beter sig som du förväntar dig.
Att bygga en från grunden
Anta att du har detta villkor som skyddar åtkomsten till en funktion:
const canAccess = isSubscribed && (isAdmin || !isSuspended);
För att bygga en sanningstabell listar du varje kombination av de tre indata, och går sedan igenom uttrycket steg för steg.
| isSubscribed | isAdmin | isSuspended | isAdmin || !isSuspended | canAccess |
|---|---|---|---|---|
| true | true | true | true | true |
| true | true | false | true | true |
| true | false | true | false | false |
| true | false | false | true | true |
| false | true | true | true | false |
| false | true | false | true | false |
| false | false | true | false | false |
| false | false | false | true | false |
Lägg märke till hur tabellen omedelbart avslöjar ett specialfall: en avstängd administratör (isAdmin = true, isSuspended = true) som är prenumerant får fortfarande åtkomst, eftersom OR låter administratörsflaggan åsidosätta avstängningen. Om det inte var avsikten har sanningstabellen precis hittat din bugg innan dina användare gjorde det.
Hur många rader behöver du?
Antalet rader i en fullständig sanningstabell är 2^n, där n är antalet oberoende booleska indata. Tre indata innebär 8 rader; fyra indata innebär 16. Detta är också en bra påminnelse om att hålla dina villkor små — så snart du passerar 3 eller 4 variabler i ett enda uttryck är det oftast ett tecken på att du bör extrahera namngivna mellanliggande variabler.
// Istället för detta:
if (isSubscribed && (isAdmin || !isSuspended) && !isTrialExpired) { ... }
// Överväg att namnge delarna:
const hasValidStanding = isAdmin || !isSuspended;
const hasActiveAccess = isSubscribed && hasValidStanding && !isTrialExpired;
if (hasActiveAccess) { ... }
När du bör ta till en sanningstabell
- När en buggrapport säger "det fungerar ibland men inte andra gånger"
- Innan du omstrukturerar ett villkor du inte helt litar på
- När du granskar någon annans nästlade
if/else-logik i en pull request - När du skriver enhetstester — varje rad i tabellen är ett testfall som väntar på att skrivas