Что лучше для использования памяти: определить константы в подпрограммах или в модуле

Я понимаю, что это некоторые из основ VB, но не могу понять, как спросить Google:

Как VBA управляет константами? В некоторых языках компилятор заменяет их значениями. Но как это работает в VBA? Будет ли иметь значение, если я объявлю их в sub/function, а не в глобальном пространстве. Особенно, если sub/function вызывается много раз во время выполнения.

Я часто объявляю имя функции и некоторые другие строки как константы в подфункции / пространстве функций - мне легче читать мой код. Например: SUB_NAME в Get_AppExcel_Ref() в коде ниже, чтобы использовать его для регистрации событий ошибок. Если Get_AppExcel_Ref() будет вызываться пару раз во время работы программы - SUB_NAME будет выделяться в памяти один раз, при первом запуске или при каждом вызове? Или, может быть, есть какая-то проблема с производительностью и лучше объявить SUB_NAME глобальным.

Private Sub Get_AppExcel_Ref(ByRef appObject As Object)
  Const SUB_NAME As String = "Get_AppExcel_Ref"    

  On Error GoTo ERR_NOT_OPENNED
  Set appObject = GetObject(, "Excel.Application")
  Exit Sub 

ERR_NOT_OPENNED:    
  If Err.Number = 429 Then
    Err.Clear
    Set appObject = CreateObject("Excel.Application")
  Else    
    Call LOG.printLog("open Excel", Err, SUB_NAME)
  End If    
End Sub 

'LOG - user class type variable, printLog params: Description, Error, Source Name

2 ответа

Решение

Объявление вашего Const Так как global не имеет смысла, так как отображает одну и ту же строку, где бы вы ее не использовали.

Вы можете объявить ее как глобальную переменную (например, чтобы сохранить дополнительный параметр для вашей подпрограммы ведения журнала) и назначить имя подпрограммы, но имя вашей подпрограммы будет также иметь (постоянную) строку в вашем коде (так такое же количество используемой памяти). И, в конце концов, это полностью испортит вашу логику, потому что при вызове подпрограммы содержимое будет перезаписано, и когда после этого вызова произойдет ошибка, ваш журнал покажет неверное имя подпрограммы. Так что не иди по этому пути.

Как пишет Пол Огиливи в своих комментариях, думайте о константе как о переменной только для чтения - и не тратьте впустую любые мысли о реализации exaxt (но я думаю, что стоит предположить, что строка помещается в память только один раз). У вас более чем достаточно памяти для вашего кода VBA, и обработка строк настолько быстра, что у вас никогда не возникнет проблем во время выполнения.

Мое кредо: используйте все, что соответствует вашим потребностям как программиста, и удобочитаемость является важным аспектом. Не обращайте особого внимания на потребление памяти или скорость выполнения - кроме случаев, когда вы действительно сталкиваетесь с проблемами. И если вы делаете, это, скорее всего, вызвано другими вещами.

Прежде всего, добро пожаловать в ТАК.

Я думаю, что компилятор VBA также заменяет константы их значениями, как и в других языках. Таким образом, они не совпадают с переменными.

Я не думаю, что константа необходима здесь. Я склонен использовать их только для параметров, а не просто для замены какой-либо строки.

Ваш код будет просто так:

LOG.printLog "open Excel", Err, "GetAppExcelRef"
Другие вопросы по тегам