Поиск…


Переменные имена

Переменные содержат данные. Назовите их после того, для чего они используются, а не после их типа или области данных, используя существительное . Если вы вынуждены пронумеровать переменные (например , thing1, thing2, thing3 ), а затем рассмотреть вопрос об использовании соответствующей структуры данных вместо (например , массива, в Collection , или Dictionary ).

Имена переменных, которые представляют собой итеративный набор значений - например, массив, Collection , Dictionary или Range ячеек, должны быть множественными.

Некоторые общие соглашения об именах VBA:


Для переменных уровня процедуры :

camelCase

Public Sub ExampleNaming(ByVal inputValue As Long, ByRef inputVariable As Long)

    Dim procedureVariable As Long
    Dim someOtherVariable As String

End Sub

Для переменных уровня модуля:

PascalCase

Public GlobalVariable As Long
Private ModuleVariable As String

Для констант:

SHOUTY_SNAKE_CASE обычно используется для дифференциации констант от переменных:

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

Однако имена PascalCase делают более чистый код и так же хороши, поскольку IntelliSense использует разные значки для переменных и констант:

IntelliSense использует разные значки для постоянных Foo и переменных Bar


Венгерская нотация

Назовите их после того, для чего они используются, а не после их типа или области данных.

«Венгерская нотация облегчает просмотр типа переменной»

Если вы пишете свой код, например, процедуры придерживаетесь принципа единой ответственности (как и должно быть), вы никогда не должны смотреть на экранные объявления переменных в верхней части любой процедуры; объявлять переменные как можно ближе к их первому использованию, и их тип данных всегда будет на виду, если вы объявите их с явным типом. Ярлык Ctrl + i VBE можно использовать для отображения типа переменной в всплывающей подсказке.

Для какой переменной используется гораздо более полезная информация, чем ее тип данных, особенно на языке, таком как VBA, который счастливо и неявно преобразует тип в другой по мере необходимости.

Рассмотрим iFile и strFile в этом примере:

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

Сравнить с:

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 передается ByRef в верхнем примере, но помимо того факта, что нам посчастливилось увидеть, что он явно передан как таковой, нет никаких указаний на то, что strData фактически возвращается функцией.

В нижнем примере называет его outContent ; это out префикса , что венгерская нотация была изобретена для: чтобы помочь прояснить , что переменная используется для, в данном случае четко определить его как «вне» параметра.

Это полезно, поскольку IntelliSense сам по себе не отображает ByRef , даже если параметр явно передан по ссылке:

IntelliSense, показывающий «CanReadFile (ByVal path As String, outComment As String) как логический», когда фактическая подпись указывает outComment как явно переданный по ссылке («ByRef»)

Что приводит к...

Венгерский сделал правильно

Первоначально венгерская нотация не имела ничего общего с переменными типами . Фактически, венгерская нотация, сделанная правильно , действительно полезна. Рассмотрим этот небольшой пример ( ByVal и As Integer удалены для краткости):

Public Sub Copy(iX1, iY1, iX2, iY2)
End Sub

Сравнить с:

Public Sub Copy(srcColumn, srcRow, dstColumn, dstRow)
End Sub

src и dst являются префиксами венгерского нотации здесь, и они передают полезную информацию, которая в противном случае уже не может быть выведена из имен параметров или IntelliSense, показывая нам объявленный тип.

Конечно, есть лучший способ передать все это, используя правильную абстракцию и реальные слова, которые могут быть произнесены вслух и понятны - как надуманный пример:

Type Coordinate
    RowIndex As Long
    ColumnIndex As Long
End Type

Sub Copy(source As Coordinate, destination As Coordinate)
End Sub

Имена процедур

Процедуры что-то делают . Назовите их после того, что они делают, используя глагол . Если точное написание процедуры невозможно, вероятно, процедура выполняет слишком много вещей и ее необходимо разбить на более мелкие, более специализированные процедуры.

Некоторые общие соглашения об именах VBA:


Для всех процедур:

PascalCase

Public Sub DoThing()

End Sub

Private Function ReturnSomeValue() As [DataType]

End Function

Для процедур обработчика событий:

ObjectName_EventName

Public Sub Workbook_Open()

End Sub

Public Sub Button1_Click()

End Sub

Обработчики событий обычно автоматически именуются VBE; переименование их без переименования объекта и / или обработанного события приведет к поломке кода - код будет запущен и скомпилирован, но процедура обработчика будет потеряна и никогда не будет выполнена.

Boolean Members

Рассмотрим функцию с булевым возвратом:

Function bReadFile(ByVal strFile As String, ByRef strData As String) As Boolean
End Function

Сравнить с:

Function CanReadFile(ByVal path As String, ByRef outContent As String) As Boolean
End Function

Can префикс не служат той же цели, что и b приставкой: он определяет возвращаемое значение функции как Boolean . Но Can читать лучше, чем b :

If CanReadFile(path, content) Then

По сравнению с:

If bReadFile(strFile, strData) Then

Рассмотрите возможность использования префиксов , например, Can , Is или Has перед Логическое возвращающих членов (функции и свойства), но только тогда , когда он добавляет ценность. Это соответствует действующим правилам именования Microsoft .



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow