sì
Dovresti sempre usare le parentesi ... non controlli l'ordine di precedenza ... fa lo sviluppatore del compilatore. Ecco una storia che mi è successa sul non uso delle parentesi. Ciò ha interessato centinaia di persone in un periodo di due settimane.
La ragione del mondo reale
Ho ereditato un'applicazione del frame principale. Un giorno, di punto in bianco, ha smesso di funzionare. È tutto ... ma è appena finito.
Il mio compito era farlo funzionare il più velocemente possibile. Il codice sorgente non era stato modificato per due anni, ma all'improvviso si è fermato. Ho provato a compilare il codice e si è rotto sulla linea XX. Ho guardato la linea XX e non riuscivo a capire cosa avrebbe interrotto la linea XX. Ho chiesto le specifiche dettagliate per questa applicazione e non ce ne sono state. La linea XX non era il colpevole.
Ho stampato il codice e ho iniziato a esaminarlo dall'alto verso il basso. Ho iniziato a creare un diagramma di flusso di ciò che stava succedendo. Il codice era così contorto che non riuscivo nemmeno a capirlo. Ho rinunciato a provare a disegnarlo. Avevo paura di apportare modifiche senza sapere come avrebbe influito sul resto del processo, soprattutto perché non avevo dettagli su cosa facesse l'applicazione o su dove si trovasse nella catena delle dipendenze.
Quindi, ho deciso di iniziare nella parte superiore del codice sorgente e aggiungere whitespce e freni di linea per rendere il codice più leggibile. Ho notato, in alcuni casi, che c'erano delle condizioni che si combinavano AND
e OR
che non era chiaramente distinguibile tra quali dati venivano modificati AND
e quali dati venivano modificati OR
. Così ho iniziato a mettere tra parentesi le condizioni AND
e OR
per renderle più leggibili.
Mentre procedevo lentamente pulendola, salvavo periodicamente il mio lavoro. A un certo punto ho provato a compilare il codice e una cosa strana è accaduta. L'errore era passato oltre la riga di codice originale e ora era più in basso. Così ho continuato, speparando le condizioni AND
e OR
con le parentesi. Quando ho finito di pulirlo ha funzionato. Vai a capire.
Ho quindi deciso di visitare il negozio operativo e chiedere loro se avevano recentemente installato nuovi componenti sul telaio principale. Hanno detto di sì, abbiamo recentemente aggiornato il compilatore. Hmmmm.
Si scopre che il vecchio compilatore ha valutato l'espressione da sinistra a destra, indipendentemente. La nuova versione del compilatore ha anche valutato le espressioni da sinistra a destra ma il codice ambiguo, il che significa che la combinazione poco chiara di AND
e OR
non poteva essere risolta.
Lezione che ho imparato da questo ... SEMPRE, SEMPRE, SEMPRE usare i genitori per separare le AND
condizioni e le OR
condizioni quando vengono usati in congiunzione tra loro.
Esempio semplificato
IF Product = 191 OR Product = 193 AND Model = "ABC" OR Product = 201 OR Product = 202 AND Model = "DEF" ...
(codice disseminato di molti di questi)
Questa è una versione semplificata di ciò che ho incontrato. Vi erano anche altre condizioni con le dichiarazioni logiche booleane composte.
Ricordo di averlo insegnato a:
IF ((Product = 191 OR Product = 193) AND Model = "ABC") OR ((Product = 201 OR Product = 202) AND Model = "DEF") ...
Non ho potuto riscriverlo perché non c'erano specifiche. L'autore originale era scomparso da tempo. Ricordo un'intensa pressione. Un'intera nave mercantile rimase bloccata in porto e non poté essere scaricata perché questo piccolo programma non funzionava. Nessun avvertimento Nessuna modifica al codice sorgente. Mi è venuto in mente di chiedere alle Operazioni di rete se hanno modificato qualcosa dopo che ho notato che l'aggiunta di parentesi ha spostato gli errori.