變數名稱
變數儲存資料。使用名詞命名它們,而不是在它們的資料型別或範圍之後。如果你覺得有必要為變數編號 (例如 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