Questo è un po 'soggettivo, ma una buona regola generale è di rimuovere la maggior complessità possibile. Per complessità, intendo il numero di operazioni che è necessario eseguire al fine di ottenere il risultato desiderato.
In questo senso, !a && !b è peggiore di !(a || b) perché in un caso stai annullando a e b, quindi esegui l'operatore and risultante in 3 operazioni, mentre in quest'ultimo caso, stai solo eseguendo 2. Ovviamente questo è vacuo quando parli di due condizioni, ma quando hai a che fare con molti, questo può fare una grande differenza.
Idealmente, la forma delle tue condizioni sarebbe nella forma a || b || c o a && b && c , aggiungendo parentesi se necessario. Cerca di evitare forme come !(a && b) || (b && (c || d || !a)) in quanto è molto difficile decifrare il significato senza creare una tabella di verità.
Inoltre, è generalmente una buona idea evitare "non" nelle variabili che contengono le condizioni, anche se aggiunge complessità.
In altre parole, è meglio vedere isWet = raining && !hasUmbrella && !isInside che avere isNotWet = !raining || hasUmbrella || isInside , perché è più facile razionalizzare il significato della variabile isWet rispetto a isNotWet . Puoi sempre annullare isWet per ottenere lo stesso valore di isNotWet .