Newsgroup: it.comp.lang.visual-basic
Titolo: [?] Prevenire eroori di programmazione

Riposto sperando in maggior fortuno!
Mi interessavano link a si ti o a documenti che raggruppano e descrivono 
le varie tipologie di errori in cui è possibile imbattersi durante la 
programmazione!
Ad esempio:
1)Divisione per zero.
2)Recordset che riportano valori nulli.
3)Istruzioni che tentano di leggere file o percorsi inesistenti.
...
Vorrei creare funzioni che limitano al massimo la presenz adi errori, 
per cui vorrei prima individuare la maggior parte di tali errori!
Di seguito elenco alcune funzioni che ho realizzato per gestire il 
problema del recodset che può resituire un valore nullo.
Grazie per l'attenzione
Ciao
Function Null2zeroSingle(ByVal sorgente As Variant, Optional ByVal 
Separatore As String) As Single
     Dim temptxt As String
     If IsNull(sorgente) = True Then
         temptxt = vbNullString
     Else
         temptxt = sorgente
     End If
     If Len(Trim$(temptxt)) = 0 Then
         Null2zeroSingle = 0
     Else
         If Len(Separatore) = 0 Then
             Separatore = Format$(0#, ".#")
         End If
         If Asc(Separatore) = 44 Then ' ","
             Null2zeroSingle = CSng(Replace(temptxt, ".", ",", 1))
         Else
             Null2zeroSingle = CSng(Replace(temptxt, ",", ".", 1))
         End If
     End If
End Function
Function Null2zeroInteger(ByVal temptxt As Variant) As Integer
     If IsNull(temptxt) Then
         Null2zeroInteger = 0
     Else
         Null2zeroInteger = Val(temptxt)
     End If
End Function
Function Null2zeroLong(ByVal temptxt As Variant) As Long
     If IsNull(temptxt) Then
         Null2zeroLong = 0
     Else
         Null2zeroLong = Val(temptxt)
     End If
End Function
Function Null2zeroText(ByVal temptxt As Variant) As String
     If IsNull(temptxt) = True Or Len(temptxt) = 0 Then
         Null2zeroText = 0
     Else
         Null2zeroText = temptxt
     End If
End Function

"Re: [?] Prevenire eroori di programmazione"
                    ^^^^^^
Prima tipologia: errori di battitura !!!

Se vuoi te ne segnalo un altro: cercare di leggere da recordset chiusi
(l'80% delle volte mi dimentico di aprirli)
Salutoni
Sergio

 Prima tipologia: errori di battitura !!!
LOL !
Scusa sarei curioso di sapere come vorresti utilizzare queste procedure ?
in pratica a ogni operazione fai una chiamata ?
a = campo di un array  = NULL
b = Intero =  1
al posto di fare
"b * a"
  fai
"b * null2zeroInteger(a)"  ?
e se poi nel tuo codice ti scordi di applicare il controllo e fai "B * A"
non generi lo stesso un errore ? Come ti comporti con le variabili che
cambiano valore molto velocemente ?

 in pratica a ogni operazione fai una chiamata ?
Quando leggo da un recordset e devo assegnare un valore ad una variabile 
intera faccio:
Dim i as integer
i = null2zerointeger(data1.recodset("quanti"))
Oppure
txtbox.text = null2zerotext(data1.recodset("quanti"))
ciao

 3)Istruzioni che tentano di leggere file o percorsi inesistenti.
Io mi scordo sempre di gestire le situazioni in cui per qualche motivo
le anagrafiche sono vuote.
Volevo chiederti, c'č un motivo particolare per il quale gli argomenti
delle tue funzioni li passi byval?
Perchč cosě al volo non capisco
PS: se vuoi un consiglio evita di usare i variant, sono piů lenti e
fanno del casino.

 fanno del casino.
    Conosco programmatori che fanno casino coi variant ma variant che fanno
casino... Uhm... Ehm... no, mi pare proprio di non conoscerne.
--
Ciao :-)
Maurizio
--------
?SPQR(C)
 X
--------

 fanno del casino.
Hai ragione i variant sono lenti e fra l'altro non saranno più gestiti 
in 
vb.net
 ma quando ho creato le funzioni non lo sapevo e comunque con i 
  variant posso gestire qualunque tipo di dato. probabilmente usando 
string funzionerebbe lo stesso!
ciao

 funzione piů veloce in esecuzione.
Ok, grazie, era la risposta che volevo.

 > 1) Perché all'interno della funzione non devo modificarli
    Aggiungerei che e' opportuno seguire questo stile di programmazione. Se
vuoi saperne di piu' cerca, per mezzo di google, i numerosi 3d di questo ng
sull'argomento.


 sull'argomento.
Tu pensa, quanto sono malato,
conosco la differenza tra byval e byref.
Ho sempre pensato che con il default byref, non dovendo copiare il
valore su un'altra variabile, ma passare semplicemente l'indirizzo in
memoria della variabile madre, fosse piů veloce.
Ciao

 memoria della variabile madre, fosse più veloce.
Non ti preoccupare, sei sano :-)
Il punto e' che, a meno di variabili particolarmente ingombranti (stringe o
UDT belli tosti) e/o di numerose chiamate ricorrenti, la differenza e'
trascurabile rispetto alla "serena programmazione" di cui parlava Maurizio
Ciao
--
Luca Dormio - 
luca....@tin.it
________________________________
"Marty, non stai ragionando in maniera quadridimensionale"
Dr. Emmett L. Brown

 memoria della variabile madre, fosse più veloce.
Infatti è così, anche se in realtà la differenza è pressochè irrilevante.
Il byval si usa solo per chiarezza (si è sicuri che se è dichiarato byval
era intenzione del programmatore non modificare il parametro) e per
sicurezza (chi usa la funzione non rischia di trovarsi dati sballati nelle
variabili passate, magari paciugate all'interno della funzione).
Per maggiori info ecco un interessante post di Maya:
http://makeashorterlink.com/?Y27322EC1
Interessante quanto l'intero trhead.
Ciao
--
' // Initialize the expression evaluator
Engines.Evaluator = CreateObject("
http://www.neodatatype.net
")
' // you can find resources for and from the NG here!
Me.SitoComune = "
http://www.it-lang-vb.net
"


Veramente interessantissimo, concludo che concordo pienamente soprattutto
per questo motivo
perché leggendo il codice
comprendi se la funzione modificherà il parametro o meno,
senza leggere il codice della funzione stessa.
Dovrò cambiare il modo di passaggio dei parametri a tutte le mie funzioni
nei vari prog..
:-(
Ahia!