Newsgroup: it.comp.lang.visual-basic
Titolo: [Sostituire gli IF]

Salve,
ho ereditato questo codice e,mi chiedevo se
secondo voi, č possibile migliorarlo, allegerendo il codice rendendolo
piů snello ?
Grazie a tutti
R.Zanni
    If SceltaAmbFIP = 1 Then    'AMBIENTE FIP
        If CercaStoria = False Then
            If frmCerca.ckhFamiglia = 0 Then
                If frmCerca.chkCatalogo = 0 Then
                    Set rst = ....
                Else
                    Set rst = ....
                End If
            Else
                If frmCerca.chkCatalogo = 0 Then
                    Set rst = ....
                Else
                    Set rst = ....
                End If
            End If
        Else    'else Ricerca nello Storico
            If frmCerca.ckhFamiglia = 0 Then
                If frmCerca.chkCatalogo = 0 Then
                    Set rst = ....
                Else
                    Set rst = ....
                End If
            Else
                If frmCerca.chkCatalogo = 0 Then
                    Set rst = ....
                Else
                    Set rst = ....
                End If
 
            End If
        End If  'endif Storia
    End If  'FIP
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG


Più che sulla struttura (che potrebbe anche dipendere dalla necessità di non 
testare una cosa se non è vera la precedente, e quindi potrebbe non essere 
possibile usare degli AND), io punterei alla leggibilità.
L'uso delle proprietà predefinite (ad esempio per i checkbox), e il non 
utilizzo delle costanti (quel '=0' dei checkbox è un vero e proprio pugno in 
un occhio...), rende questa cosa assolutamente illeggibile ed 
'indebuggabile'.
Ciao
Alberto
-- 
E tutto mi sembrava andasse bene... 

 piů snello ?
Per darti una risposta sensata sarebbe meglio sapere anche quali dei vari
Set rst = ....
sono coincidenti, oppure, se tutti quanti sono diversi tra loro, in che cosa 
cambiano (immagino siano recordset: cambia solo lo statement SQL? cambia la 
connessione?)
Ciao
-- 
Luca Dormio - 
luca....@tin.it
________________________________
"Marty, non stai ragionando in maniera quadridimensionale"
Dr. Emmett L. Brown 

 illeggibile ed 'indebuggabile'.
Figlioli, ogni tanto siete terribilmente pignoli, e detto da me e' grave ;-)
Va bene evitare le proprieta' predefinite, e va bene l'uso di costanti, ma 
se prendi 100 programmatori dal dilettante al super 
architect-evangelist-gran_figl_di_putt, sono convinto che il 100% capisce al 
volo il significato di quei checkbox
Quello che invece puo' rendere illegibile e indebuggabile il codice per 
tutti e 100 e' la riga 'SceltaAmbFIP = 1'; se proprio vogliamo cominciare a 
correggere qualcosa il tal senso, questo si che e' un "magic number" da 
evitare, mentre tanti bei '.Value = vbUnchecked', seppur consigliabili, non 
cambiano molto la faccenda.


 "magic number" da evitare
Beh, davo per scontato che SceltaAmbFIP non sia un boolean, ma un enum o un 
qualche indice integer o long.
Se fosse booleano, sarebbe troppo.



Mi č capitata una roba del genere in questi giorni.
Sono riuscito a eliminare quasi tutti gli if e quel paio che č rimasto ora
sono if "lineari" e non "a coda di rondine" (ricordo un vecchio collega che
"nidificava" anche una decina di If in modo che servivano 3 video affiancati
per visualizzarli).
Per risolvere casi del genere č sufficiente parametrare la query in questo
modo:
sql = "SELECT campi FROM @Tabella WHERE @CondizioneFamiglia AND
@CondizioneCatalogo"
If CercaStoria = False Then
    sql = Replace(sql, "@Tabella", "Storico")
    If frmCerca.ckhFamiglia.Checked Then
        sql = Replace(sql, "@CondizioneFamiglia", "FlagFamiglia = True")
    else
        sql = Replace(sql, "@CondizioneFamiglia", "FlagFamiglia = False")
    end if
    If frmCerca.chkCatalogo.Checked Then
        sql = Replace(sql, "@CondizioneCatalogo", "FlagCatalogo= True")
    else
        sql = Replace(sql, "@CondizioneCatalogo", "FlagCatalogo= False")
    End if
    set ret = ...sql...
end if
Ciao

Queso codice è con i rst completi:
    If SceltaAmbFIP = 1 Then    'AMBIENTE FIP
        If CercaStoria = False Then
            If frmCerca.ckhFamiglia = 0 Then
                If frmCerca.chkCatalogo = 0 Then
                    Set rst = dbs.OpenRecordset("SELECT * from
T01Disegni WHERE(T01Codice Like '*" & Trim(frmCerca.txtCerca.Text) & "*'
OR T01Dis1 Like '*" & Trim(frmCerca.txtCerca.Text) & "*' Or T01Dis2 Like
'*" & Trim(frmCerca.txtCerca.Text) & "*' Or T01Dis3 Like '*" &
Trim(frmCerca.txtCerca.Text) & "*' Or T01Stampo Like '*" &
Trim(frmCerca.txtCerca.Text) & "*' Or T01Descrizione Like '*" &
Trim(frmCerca.txtCerca.Text) & "*') And T01Annullato = 0 And T01Ditta =
1 And T01Catalogo = 0")
                Else
                    Set rst = dbs.OpenRecordset("SELECT * from
T01Disegni WHERE(T01Codice Like '*" & Trim(frmCerca.txtCerca.Text) & "*'
OR T01Dis1 Like '*" & Trim(frmCerca.txtCerca.Text) & "*' Or T01Dis2 Like
'*" & Trim(frmCerca.txtCerca.Text) & "*' Or T01Dis3 Like '*" &
Trim(frmCerca.txtCerca.Text) & "*' Or T01Stampo Like '*" &
Trim(frmCerca.txtCerca.Text) & "*' Or T01Descrizione Like '*" &
Trim(frmCerca.txtCerca.Text) & "*') And T01Annullato = 0 And T01Ditta =
1 And T01Catalogo = 1")
                End If
            Else
                If frmCerca.chkCatalogo = 0 Then
                    Set rst = dbs.OpenRecordset("SELECT * from
T01Disegni WHERE (T01Famiglia1 = '" & Trim(frmCerca.txtCerca.Text) & "'
OR T01Famiglia2 = '" & Trim(frmCerca.txtCerca.Text) & "' OR T01Famiglia3
= '" & Trim(frmCerca.txtCerca.Text) & "' OR T01Famiglia4 = '" &
Trim(frmCerca.txtCerca.Text) & "' OR T01Famiglia5 = '" &
Trim(frmCerca.txtCerca.Text) & "' OR T01Famiglia6 = '" &
Trim(frmCerca.txtCerca.Text) & "' OR T01Famiglia7 = '" &
Trim(frmCerca.txtCerca.Text) & "' OR T01Famiglia8 = '" &
Trim(frmCerca.txtCerca.Text) & "' OR T01Famiglia9 = '" &
Trim(frmCerca.txtCerca.Text) & "' OR T01Famiglia10 = '" &
Trim(frmCerca.txtCerca.Text) & "')" & "And T01Catalogo = 0")
                Else
                    Set rst = dbs.OpenRecordset("SELECT * from
T01Disegni WHERE (T01Famiglia1 = '" & Trim(frmCerca.txtCerca.Text) & "'
OR T01Famiglia2 = '" & Trim(frmCerca.txtCerca.Text) & "' OR T01Famiglia3
= '" & Trim(frmCerca.txtCerca.Text) & "' OR T01Famiglia4 = '" &
Trim(frmCerca.txtCerca.Text) & "' OR T01Famiglia5 = '" &
Trim(frmCerca.txtCerca.Text) & "' OR T01Famiglia6 = '" &
Trim(frmCerca.txtCerca.Text) & "' OR T01Famiglia7 = '" &
Trim(frmCerca.txtCerca.Text) & "' OR T01Famiglia8 = '" &
Trim(frmCerca.txtCerca.Text) & "' OR T01Famiglia9 = '" &
Trim(frmCerca.txtCerca.Text) & "' OR T01Famiglia10 = '" &
Trim(frmCerca.txtCerca.Text) & "')" & "And T01Catalogo = 1")
                End If
            End If
        Else    'else Ricerca nello Storico
            If frmCerca.ckhFamiglia = 0 Then
                If frmCerca.chkCatalogo = 0 Then
                    Set rst = dbs.OpenRecordset("SELECT * from
T01StoricoDisegni WHERE(T01Codice Like '*" &
Trim(frmCerca.txtCerca.Text) & "*' OR T01Dis1 Like '*" &
Trim(frmCerca.txtCerca.Text) & "*' Or T01Dis2 Like '*" &
Trim(frmCerca.txtCerca.Text) & "*' Or T01Dis3 Like '*" &
Trim(frmCerca.txtCerca.Text) & "*' Or T01Stampo Like '*" &
Trim(frmCerca.txtCerca.Text) & "*' Or T01Descrizione Like '*" &
Trim(frmCerca.txtCerca.Text) & "*') And T01Annullato = 0 And T01Ditta =
1 And T01Catalogo = 0")
                Else
                    Set rst = dbs.OpenRecordset("SELECT * from
T01StoricoDisegni WHERE(T01Codice Like '*" &
Trim(frmCerca.txtCerca.Text) & "*' OR T01Dis1 Like '*" &
Trim(frmCerca.txtCerca.Text) & "*' Or T01Dis2 Like '*" &
Trim(frmCerca.txtCerca.Text) & "*' Or T01Dis3 Like '*" &
Trim(frmCerca.txtCerca.Text) & "*' Or T01Stampo Like '*" &
Trim(frmCerca.txtCerca.Text) & "*' Or T01Descrizione Like '*" &
Trim(frmCerca.txtCerca.Text) & "*') And T01Annullato = 0 And T01Ditta =
1 And T01Catalogo = 1")
                End If
            Else
                If frmCerca.chkCatalogo = 0 Then
                    Set rst = dbs.OpenRecordset("SELECT * from
T01StoricoDisegni WHERE (T01Famiglia1 = '" &
Trim(frmCerca.txtCerca.Text) & "' OR T01Famiglia2 = '" &
Trim(frmCerca.txtCerca.Text) & "' OR T01Famiglia3 = '" &
Trim(frmCerca.txtCerca.Text) & "' OR T01Famiglia4 = '" &
Trim(frmCerca.txtCerca.Text) & "' OR T01Famiglia5 = '" &
Trim(frmCerca.txtCerca.Text) & "' OR T01Famiglia6 = '" &
Trim(frmCerca.txtCerca.Text) & "' OR T01Famiglia7 = '" &
Trim(frmCerca.txtCerca.Text) & "' OR T01Famiglia8 = '" &
Trim(frmCerca.txtCerca.Text) & "' OR T01Famiglia9 = '" &
Trim(frmCerca.txtCerca.Text) & "' OR T01Famiglia10 = '" &
Trim(frmCerca.txtCerca.Text) & "')" & "And T01Catalogo = 0")
                Else
                    Set rst = dbs.OpenRecordset("SELECT * from
T01StoricoDisegni WHERE (T01Famiglia1 = '" &
Trim(frmCerca.txtCerca.Text) & "' OR T01Famiglia2 = '" &
Trim(frmCerca.txtCerca.Text) & "' OR T01Famiglia3 = '" &
Trim(frmCerca.txtCerca.Text) & "' OR T01Famiglia4 = '" &
Trim(frmCerca.txtCerca.Text) & "' OR T01Famiglia5 = '" &
Trim(frmCerca.txtCerca.Text) & "' OR T01Famiglia6 = '" &
Trim(frmCerca.txtCerca.Text) & "' OR T01Famiglia7 = '" &
Trim(frmCerca.txtCerca.Text) & "' OR T01Famiglia8 = '" &
Trim(frmCerca.txtCerca.Text) & "' OR T01Famiglia9 = '" &
Trim(frmCerca.txtCerca.Text) & "' OR T01Famiglia10 = '" &
Trim(frmCerca.txtCerca.Text) & "')" & "And T01Catalogo = 1")
                End If
 
            End If
        End If  'endif Storia
    End If  'FIP
Grazie
R.Zanni


 WHERE(T01Codice Like '*" & Trim(frmCerca.txtCerca.Text) & "*' OR...
Ecco, magari anche una duplicazione degli apicini...


 Queso codice è con i rst completi:
Mi sembra di vedere il codice scritto da una scimmia.
Purtroppo ci sono in libertà orde di "code-monkey" :( e lo sto verificando
proprio in questo momento.
--
Qualunque mentecatto può scrivere codice che un computer possa capire.
I buoni programmatori scrivono codice che gli uomini possano capire.
[Martin Fowler]

Grazie cmq per l'interssamento,vedrò di cestinare il tutto
ripartendo da capo.
Grazie
R.Zanni


 Se fosse booleano, sarebbe troppo.
E' proprio questo il punto... sopra, una volta accertato il tipo (CheckBox), 
sei tranquillo sul significato della IF, ma qui anche se avesse riportato la 
dichiarazione della variabile, che cosa significa pero' "=1"?!?
Qui si che sarebbe indispensabile una costante, tanto e' vero che il codice 
cita:
If SceltaAmbFIP = 1 Then    'AMBIENTE FIP
dove e' il commento a fare il lavoro della costante


 ripartendo da capo.
Mi sembra una bella idea ;-)
Oltre ad adottare il criterio suggerito da Zanna, ti suggerirei anche, onde 
prevenire distacchi della retina e, perche' no?, aumentare leggermente le 
prestazioni, di effettuare *un unica istruzione*
Trim(frmCerca.txtCerca.Text)
da salvare all'inizio in una variabile locale.


 end if
(Zanna, solo qualche aggiunta, e non sono nemmeno al mio pc per provarla,
comunque dovrebbe andare...)
sql = "SELECT campi FROM @Tabella WHERE @CondizioneFamiglia AND
@CondizioneCatalogo"
If Not CercaStoria Then
    sql = Replace(sql, "@Tabella", "Storico")
    sql = Replace(sql, "@CondizioneFamiglia", "FlagFamiglia = " _
        & CStr(CBool(frmCerca.ckhFamiglia.Checked)))
    sql = Replace(sql, "@CondizioneCatalogo", "FlagCatalogo= " _
        & CStr(CBool(frmCerca.chkCatalogo.Checked)))
    set ret = ...sql...
end if
Per quanto riguarda il codice completo, sarebbe meglio tenere la stringa SQL
in una variabile stringa, e modificarne solo la parte che va modificata
durante la verifica delle condizioni. Questo renderebbe il codice più
leggibile (ma è già stato detto, noh?)
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

        & CStr(CBool(frmCerca.ckhFamiglia.Checked)))
Ma per carità...
CStr è una funzione localizzata...


 evitare
Quoto.
Bye, G.

 1 And T01Catalogo = 0")
ARGH...
Fatti una bella sub o function, in cui metti dentro 'sta roba, e la
richiami con parametri (usando una Enum, direi):
Set rst = dbs.OpenRecordset(TipoRicerca(CercaInBlaBla))
E nella funzione, decodifica una tantum le cose ripetute:
TstRic=Trim(frmCerca.txtCerca.Text) ' testo della ricerca
Bye, G.