Un breve post è dedicato a tutti gli appassionati di Star Wars e Java/JavaRush in onore del 40° anniversario dell'uscita dell'Episodio V della saga stellare! A volte puoi trovare molte cose interessanti su Internet e l'altro giorno mi sono imbattuto in una pratica di programmazione piuttosto divertente a prima vista chiamata Condizioni Yoda . In breve, le condizioni Yoda (anche notazione Yoda) sono uno stile di programmazione in cui le due parti dell'espressione di confronto familiare nelle istruzioni condizionali sono invertite:
le nove e sei parti della Saga, noi, senza dormire, ci siamo seduti per scrivere del codice per il nostro progetto preferito e abbiamo scritto quanto segue:
if (5 == a) {
// do something
}
Questo stile può essere utilizzato in linguaggi con sintassi simile al C, molto spesso in espressioni con if
e while
.
if (0 == variable) {
// do something
}
while (false == endingCondition) {
// do something
}
Perché spostare l'espressione costante sul lato sinistro dell'operatore di confronto? Assumiamo una situazione ipotetica in cui, dopo una maratona di visione di tutte void checkNumber(int a)
{
if (a = 13) // Здесь-то и появляется так называемый unexpected behavior!
{
printf("Number is 13");
}
}
In questo caso, ogni volta che eseguirai il programma, riceverai la stringa Number is 13"
, indipendentemente dall'argomento passato а
al metodo checkNumber(int a)
. Questo non è quello che ci aspettavamo! Gli errori logici possono verificarsi abbastanza spesso tra i programmatori alle prime armi (credetemi, lo so). Ma in fase di compilazione, un codice come 13 = a produrrà un errore, che certamente non trascureremo, poiché il valore intero è costante e, di conseguenza, non può cambiare (trasformarsi in “a”).
Ci sono sia pro che contro nell'usare le condizioni di Yoda.
Lato chiaro:
-
Prevenire l'assegnazione a una variabile quando il nostro obiettivo è il confronto.
-
Risolvere il problema del "comportamento nullo" non sicuro (
NullPointerException
) // esempi da Wikipedia
Senza Yoda:
String myString = null;
if (myString.equals("foobar")) { /* ... */ }
// This causes a NullPointerException in Java
Con Yoda:
String myString = null;
if ( "foobar".equals(myString) ) { // Результат - Ложь
/* не выполняется */
}
Lato oscuro:
- La leggibilità del codice per le persone che guarderanno il tuo codice diventa più complessa, aumentando il carico sulla percezione del codice.
- Ambito ristretto, viene utilizzato solo il confronto per l'uguaglianza o il confronto con una costante, controllando se è nullo.
- Molti compilatori già “vedono” errori di questo tipo e avvertono in anticipo della presenza di un potenziale errore.
GO TO FULL VERSION