变量名称
变量保存数据。使用名词命名它们,而不是在它们的数据类型或范围之后。如果你觉得有必要为变量编号 (例如 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
但是,鉴于 IntelliSense 对变量和常量使用不同的图标,PascalCase
名称会使代码看起来更清晰,同样好。
匈牙利表示法
在它们用于它们之后命名它们,而不是在它们的数据类型或范围之后。
匈牙利表示法可以更容易地看到变量的类型是什么
如果你编写的代码如程序遵循单一责任原则 (应该如此),那么你永远不应该在任何程序的顶部查看一系列变量声明; 声明变量尽可能接近它们的第一次使用,如果用明确的类型声明变量,它们的数据类型总是很明显。VBE 的 Ctrl + i 快捷键也可用于在工具提示中显示变量的类型。
使用什么变量比它的数据类型更有用的信息,特别是在诸如 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
前缀是匈牙利表示法的发明:帮助澄清变量的用途,在这种情况下,将其清楚地标识为 out
参数。
这很有用,因为即使通过引用显式传递参数,IntelliSense 本身也不会显示 ByRef
:
这导致…
匈牙利完成的权利
Hungarian Notation 最初与变量类型没有任何关系 。事实上,正确的匈牙利表示法实际上是有用的。考虑这个小例子(ByVal
和 As Integer
为 brevety 删除):
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