Qual è la migliore pratica intorno alla legge di De Morgan [chiuso]

6

Sappiamo tutti le leggi di De Morgan

!(a && b) === (!a || !b)
!(a || b) === (!a && !b)

Esiste un consenso della comunità attorno al quale una di queste rappresentazioni è più facile da ragionare (e quindi) produce un codice più gestibile? Se non c'è, qual è l'opinione di questa comunità?

    
posta Abraham P 31.07.2017 - 15:04
fonte

3 risposte

10

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 .

    
risposta data 31.07.2017 - 15:18
fonte
8

Con tali rappresentazioni, la leggibilità e la comprensibilità del codice e del significato sono di primaria importanza.

Non c'è consenso su quale delle due sia migliore, perché dipende molto dal bit effettivo del codice: convenzioni di denominazione e così via.

Ma - in generale, è meglio evitare più negativi in una sola espressione: è più facile per le persone ragionare sugli aspetti positivi invece che negativi (anche se gli esempi hanno lo stesso riguardo ai negativi in essi).

Durante la codifica: guarda entrambe le espressioni e vedi quale migliore è il flusso, qual'è il significato migliore. A volte, è meglio estrarre un'espressione booleana complessa (ad esempio ciascun lato di === ) nella sua piccola funzione denominata espressamente, che rende il risultato finale molto leggibile.

    
risposta data 31.07.2017 - 15:14
fonte
0

Dal punto di vista logico, le affermazioni su ciascun lato del segno == sono equivalenti, quindi non fa assolutamente alcuna differenza quale viene utilizzato.

Dal punto di vista della leggibilità del codice, una regola empirica che mi piace usare è quella di scegliere l'espressione booleana che ha più senso quando viene pronunciata ad alta voce. Ad esempio, la prima legge può essere tradotta come:

Se almeno uno non è vero

Questo può essere detto come:

  • se non è il caso che entrambi lo sono,

o

  • se uno di questi non lo è o l'altro non è

La seconda legge può essere tradotta come:

Se nessuno dei due è vero

Questo può essere detto come:

  • se non è il caso che almeno uno sia,

o

  • se uno di essi non lo è e l'altro non è né

Quale scegliere nel caso particolare dipende da quale frase ha più senso per te. Logicamente, sono completamente equivalenti.

    
risposta data 31.07.2017 - 15:31
fonte

Leggi altre domande sui tag