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:

IntelliSense utilizza icone diverse per Foo costante e Bar variabile


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:

IntelliSense che mostra "CanReadFile (ByVal path As String, outComment As String) As Boolean" quando la firma effettiva specifica outComment come esplicitamente passato per riferimento ("ByRef")

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 .



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow