VBA
Convenzioni di denominazione
Ricerca…
Nomi variabili
Le variabili contengono dati. Assegnagli un nome dopo quello per cui sono stati usati, non dopo il loro tipo di dati o ambito, usando un nome . Se ti senti obbligato a numerare le tue variabili (es. thing1, thing2, thing3
), allora considera di usare una struttura dati appropriata (per esempio una matrice, una Collection
o un Dictionary
).
I nomi di variabili che rappresentano un insieme di valori iterabile, ad esempio un array, una Collection
, un Dictionary
o un Range
di celle, dovrebbero essere plurali.
Alcune convenzioni di denominazione VBA comuni vanno così:
Per variabili a livello di procedura :
camelCase
Public Sub ExampleNaming(ByVal inputValue As Long, ByRef inputVariable As Long)
Dim procedureVariable As Long
Dim someOtherVariable As String
End Sub
Per variabili a livello di modulo:
PascalCase
Public GlobalVariable As Long
Private ModuleVariable As String
Per costanti:
SHOUTY_SNAKE_CASE
è comunemente usato per differenziare le costanti dalle variabili:
Public Const GLOBAL_CONSTANT As String = "Project Version #1.000.000.001"
Private Const MODULE_CONSTANT As String = "Something relevant to this Module"
Public Sub SomeProcedure()
Const PROCEDURE_CONSTANT As Long = 10
End Sub
Tuttavia, i nomi PascalCase
rendono il codice più pulito e sono altrettanto validi, dato che IntelliSense utilizza icone diverse per variabili e costanti:
Notazione ungherese
Assegnagli un nome dopo quello per cui sono utilizzati, non dopo il tipo di dati o l'ambito.
"Notazione ungherese rende più facile vedere quale sia il tipo di variabile"
Se scrivi il tuo codice, come le procedure, aderisci al Principio di Responsabilità Unica (come dovrebbe), non dovresti mai guardare una schermata di dichiarazioni variabili nella parte superiore di qualsiasi procedura; dichiarare le variabili il più vicino possibile al loro primo utilizzo e il loro tipo di dati sarà sempre in bella vista se le dichiarate con un tipo esplicito. La scorciatoia Ctrl + i del VBE può essere usata anche per mostrare il tipo di una variabile in un suggerimento.
L'uso di una variabile è molto più utile del suo tipo di dati, specialmente in un linguaggio come VBA che converte felicemente e implicitamente un tipo in un altro secondo necessità.
Considera iFile
e strFile
in questo esempio:
Function bReadFile(ByVal strFile As String, ByRef strData As String) As Boolean
Dim bRetVal As Boolean
Dim iFile As Integer
On Error GoTo CleanFail
iFile = FreeFile
Open strFile For Input As #iFile
Input #iFile, strData
bRetVal = True
CleanExit:
Close #iFile
bReadFile = bRetVal
Exit Function
CleanFail:
bRetVal = False
Resume CleanExit
End Function
Confrontare con:
Function CanReadFile(ByVal path As String, ByRef outContent As String) As Boolean
On Error GoTo CleanFail
Dim handle As Integer
handle = FreeFile
Open path For Input As #handle
Input #handle, outContent
Dim result As Boolean
result = True
CleanExit:
Close #handle
CanReadFile = result
Exit Function
CleanFail:
result = False
Resume CleanExit
End Function
strData
è passato da ByRef
nell'esempio in alto, ma accanto al fatto che siamo abbastanza fortunati da vedere che è passato esplicitamente come tale, non c'è alcuna indicazione che strData
sia effettivamente restituito dalla funzione.
L'esempio in basso lo outContent
; questo prefisso out
è quello per cui è stata inventata la notazione ungherese: per aiutare a chiarire a cosa serve una variabile , in questo caso identificarla chiaramente come un parametro "out".
Questo è utile, perché IntelliSense di per sé non visualizza ByRef
, anche quando il parametro è passato esplicitamente per riferimento:
Che porta a...
Ungherese fatto bene
La notazione ungherese in origine non aveva nulla a che fare con i tipi variabili . In effetti, la notazione ungherese fatta correttamente è effettivamente utile. Considera questo piccolo esempio ( ByVal
e As Integer
rimossi per brevità):
Public Sub Copy(iX1, iY1, iX2, iY2)
End Sub
Confrontare con:
Public Sub Copy(srcColumn, srcRow, dstColumn, dstRow)
End Sub
src
e dst
sono i prefissi della notazione ungherese qui e trasmettono informazioni utili che non possono altrimenti essere dedotte dai nomi dei parametri o IntelliSense che ci mostra il tipo dichiarato.
Ovviamente c'è un modo migliore per trasmettere tutto, usando un'astrazione appropriata e parole reali che possono essere pronunciate a voce alta e avere un senso - come esempio forzato:
Type Coordinate
RowIndex As Long
ColumnIndex As Long
End Type
Sub Copy(source As Coordinate, destination As Coordinate)
End Sub
Nomi delle procedure
Le procedure fanno qualcosa . Chiamali dopo quello che stanno facendo, usando un verbo . Se non è possibile nominare con precisione una procedura, è probabile che la procedura stia facendo troppe cose e debba essere suddivisa in procedure più piccole e più specializzate.
Alcune convenzioni di denominazione VBA comuni vanno così:
Per tutte le procedure:
PascalCase
Public Sub DoThing()
End Sub
Private Function ReturnSomeValue() As [DataType]
End Function
Per le procedure del gestore di eventi:
ObjectName_EventName
Public Sub Workbook_Open()
End Sub
Public Sub Button1_Click()
End Sub
I gestori di eventi sono di solito nominati automaticamente dal VBE; rinominandole senza rinominare l'oggetto e / o l'evento gestito interromperà il codice: il codice verrà eseguito e compilato, ma la procedura del gestore sarà orfana e non verrà mai eseguita.
Membri booleani
Considera una funzione di ritorno booleano:
Function bReadFile(ByVal strFile As String, ByRef strData As String) As Boolean
End Function
Confrontare con:
Function CanReadFile(ByVal path As String, ByRef outContent As String) As Boolean
End Function
Il prefisso Can
ha lo stesso scopo del prefisso b
: identifica il valore di ritorno della funzione come Boolean
. Ma Can
leggere meglio di b
:
If CanReadFile(path, content) Then
Rispetto a:
If bReadFile(strFile, strData) Then
Prendi in considerazione l'uso di prefissi come Can
, Is
o Has
davanti ai membri di ritorno booleani (funzioni e proprietà), ma solo quando aggiunge valore. Questo è conforme alle attuali linee guida per la denominazione di Microsoft .