Chi ha paura dell'operatore ternario?

Credo che ogni programmatore VB bi-partizan (ossia quelli avvezzi anche ai linguaggi C-like) abbia prima o poi sentito la mancanza dell'operatore ternario. Giusto per capirci, di quel "robo" che permette di scrivere codice del tipo:

int y = a>b ? 1 : 2;

E vedere assegnati alla variabile y i valori 1 o 2 rispettivamente in caso di verità o falsità della espressione (a>b); ebbene, io lo trovo molto comodo, soprattutto quando si riesce a non esagerare con la complessità delle espressioni in gioco (altrimenti il codice risulterà illeggibile anche all'autore dopo poco tempo). La domanda che nasce spontanea è: ma non puoi usare (in VB), la funzione IIf? Certo, e lo farei se... fosse tipizzata. Il "problema" consiste nel fatto che IIf definisce di tipo object il proprio valore di ritorno, rendendo quindi spesso obbligatorio l'(ab)uso del cast:

Dim i As Integer = DirectCast(IIf(a>b, 1, 2), Integer)

In poche parole, mi ritrovo con codice più pesante sia da leggere sia da gestire (di fatto, quel cast è inutile). Ricorrendo a VB2005 ed ai generics, però, possiamo implementare una soluzione che, per quanto quick'n'dirty, (infatti non mi fa impazzire) mi appare sicuramente più decente di quella built-in (e inoltre permette di fare piazza pulita nel codice pregresso con estrema facilità). Aggiungete un modulo al progetto, e definite come segue la "nuova" funzione IIf:

Function IIf(Of T)(ByVal expression As Boolean, ByVal truepart As T, ByVal falsepart As T) As T
    If expression Then
        Return truepart
    Else
        Return falsepart
    End If
End Function

E spieghiamo al codice pregresso l'avvenuto cambiamento:

Dim i As Integer = IIf(Of Integer)(a>b, 1, 2)

A me sembra meglio... O no?

P.S.: A nessun namespace Microsoft.VisualBasic è stato fatto del male durante l'eliminazione della funzione IIf :-)

posted @ domenica 29 maggio 2005 15:55

Print

Comments on this entry:

No comments posted yet.

Your comment:



 (will not be displayed)


 
 
 
Please add 1 and 6 and type the answer here:
 

Live Comment Preview:

 
«ottobre»
domlunmarmergiovensab
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456