giovedì 14 agosto 2014

L'ARTE DEGLI "IF CONTRATTI"

Dedico questo post ad un amico che ogni volta che trova una forma di "if contratto" spegne il computer e va a farsi una passeggiata dalla rabbia che gli sale. Vediamo di spiegare meglio questa tecnica che ritengo molto elegante ed utile.


Un "if contratto" è una forma particolare del costrutto if-else che, invece di essere distribuito su più righe viene appunto contratto in una sola. Questa particolarità può essere applicata a tutti i linguaggi derivati dal C come l'ANSI C, C++, C#, Java, ecc... per questo motivo mi limiterò ad inserire un solo esempio comune a tutti i linguaggi.

Vediamo come si presenta: nella colonna di sinistra abbiamo la forma IF tradizionale mentre in quella di destra quella contratta.
int x,y;
x=3;
if(x>2){
   y=1;
}else{
   y=0;
}
int x,y;
x=3;
y=(x>2)?1:0;




A livello di esecuzione questi due codici sono equivalenti. C'è da dire però che questa forma di IF è utilizzabile esclusivamente per l'assegnazione infatti non può essere utilizzata per:
int x;
x=1;
if(x>1){
   doSomething();
}else{
   return;
}
int x;
x=1;
//WRONG!!!
(x==1)?doSomething():return;
//WRONG!!!


Questo perchè il carattere (?) è un operatore condizionale ternario di assegnazione, la definizione è dunque "una istruzione che restituisce un valore a seconda di una condizione booleana".


Conclusione

Molti programmatori definiscono l'utilizzo di questa tecnica "UCAS" (ufficio complicazione affari semplici) ma io credo che renda il codice molto più elegante e semplice, ti permette di focalizzarti sui reali if e non su una assegnazione pilotata da una condizioneNaturalmente, come tutte le cose, c'è sempre chi esagera:
int percentage = 80;
String output = (((percentage > 50) ? "first half" : "second half") == "first half") ? ((percentage > 25) ? "second quarter" : "first quarter") : ((percentage > 75) ? "fourth quarter" : "third quarter");

Nessun commento:

Posta un commento