2012-12-13 58 views
4

作爲我的第一語言,並且從其他例子中完全教導過,我從未質疑VBA中將模塊,例程或函數的所有變量聲明分組的所有變量聲明的標準做法,它們的範圍如本例中所述。爲什麼我們要在模塊的開始處聲明變量?

Sub Traditional() 
Dim bVariable as Boolean 
Dim OtherVariable 
' Some code using OtherVariable goes here 
' 
' Now we use bVariable 
bVariable = True 
Do While bVariable 
    bVariable = SomeFunction() 
Loop 
End Sub 

現在我正在學習其它語言的標準做法是變量聲明爲接近的地方,它們被用作可能的,就像這樣:

Sub Defensive() 
Dim OtherVariable as String 
' Some code using OtherVariable goes here 
' 
' Now we use bVariable 
Dim bVariable as Boolean 
bVariable = True 
Do While bVariable 
    bVariable = SomeFunction() 
Loop 
End Sub 

這似乎是完全合理的,以我爲防禦性編程練習 - 因爲它限制了跨度和實時時間(如Code Complete中所解釋的),所以我想知道是否有任何理由在VBA中不這樣做?我能想到的可能原因是內存,運行時間(例如在循環內重複聲明),傳統 - 可以說是一個很好的理由,因爲必須有成千上萬的VBA程序員期望在例程開始時看到所有使用的變量。有沒有我錯過了,可以解釋這種做法的好處,或者至少它是從哪裏來的?

+0

在VBA中,我總是在子/函數等的頂部聲明變量,以使其他人更容易來到我後面並調試/擴展我的代碼。一般來說,我做VBA的人幾乎沒有編程背景。 – Chris

+0

我不完全確定它確實幫助他們。如果有什麼讓它變得更難。 –

+1

有點偏離主題,但VBScript將變量提升到作用域(全局或函數)的頂部,就像Javascipt一樣。所以下面的代碼將在VBScript中運行:'Option Explicit:Msgbox i:Dim i'。 –

回答

2

我宣佈我在上面的所有變量。我認爲宣佈它們更接近第一次使用口罩(至少)另外兩個應該首先解決的問題。

  1. 程序過長:如果你的程序是不是適應屏幕顯示更多的,也許它做太多,應該分解成小塊。你還會發現,當你的程序很小並且只做一件事時,單元測試更容易編寫。
  2. 變量太多:如果您有一堆相關變量,請考慮使用自定義類模塊或用戶定義的類型。它會使代碼更易讀,更易於維護。

如果你的程序很短,你正在使用類和UDT,在使用點聲明變量的好處是減輕或消除。

2

我覺得這兩個辦法都只是不同的編碼風格在VBA

在舊的C標準,所有的聲明必須在上面,我想很多人只是採取這樣的習慣,並把它變成其他PL如VBA。

對於變量名稱的簡短列表,聲明變量在頂部是明確的。對於一長串變量名稱將是不可讀的

稍後會介紹將變量聲明爲接近它的使用位置。我認爲這種做法比擁有優化器或比VBA範圍更廣的PL的「聲明頂部」具有明顯的優勢。 (就像你可以聲明範圍在FOR循環中可見的變量)然後優化器將爲你改變範圍。 (在VBA的話,可能一個全局變量更改程序變量)

對於VBA,無親景

+0

完全同意,很難跟蹤一長串變量。它也可能從C標準中發現有趣的歷史。我試圖將聲明保留在較短的子程序和函數的頂部,但聲明接近它用於較長子程序的位置 - 就像控制更復雜程序流的長主程序一樣。 –

相關問題