Является ли хорошей практикой использование глобальных констант, типов и функций внутри классов VBA? - PullRequest
5 голосов
/ 29 февраля 2012

Я начал использовать классы VBA и всегда пытался написать свой код так, чтобы каждый класс был «независимым», то есть в нем было все, что ему нужно - константы, функции и т. Д. - внутри. В последнее время, однако, этот подход привел к дублированию кода, поскольку вместо вызова открытых функций в разных модулях я скопировал некоторый код из «внешнего мира» (в том же проекте) в класс просто для поддержания его «самодостаточности» ,

Я подумываю об изменении нескольких классов, чтобы они могли получать доступ к функциям, константам, типам и т. Д. Из других модулей так же, как и любой другой модуль, но что-то во мне говорит мне, что это не может быть хорошей практикой , Может кто-нибудь сказать мне, что то, что говорит маленький голос, неправильно? Есть ли лучший подход?

Спасибо.

Обновление:

Мои извинения за то, что не предоставили детали ранее. Вот пример кода:

'-------------------------------------
'Module 1
'-------------------------------------

Public Const INITIAL_VALUE As String = "Start"
Public Const FINAL_VALUE As String = "End"

'more constants ...

Public Type SheetLoc
   SheetName As String
   SheetRow As Long
   SheetColumn As Long
End Type

'more types ...

'-------------------------------------
'Module 2
'-------------------------------------

Public Function GetLocation(key As String) As SheetLoc

   Dim myLoc As SheetLoc

   'some codes here...
   '
   With myLoc
      .SheetName = someValue
      .SheetColumn = anotherValue
      .SheetRow = stillAnotherValue
   End With

   GetLocation = myLoc

End Function

'more module functions

'-------------------------------------
'Class Module
'-------------------------------------

'some codes...

Public Sub SaveResults()

   Dim currLoc As SheetLoc      '<==== using a type defined outside of the class

   'more declarations ....
   'some codes here ....

   If currentValue = INITIAL_VALUE Then      '<=== referring to external constant 
      currLoc = GetLocation(someKey)         '<=== calling an external function
   ElseIf currentValue = FINAL_VALUE Then    '<=== referring to an external constant 
      currLoc = GetLocation(anotherKey)
   Else
      currLoc = GetLocation(defaultKey)
   End If

   'populate data ...
   'save results ...

End Sub

Обратите внимание на коды с «<====» в комментариях; класс использует типы, функции и константы, определенные вне класса, и именно это заставляет меня задуматься, является ли это хорошей практикой или есть лучший вариант. Полагаю, я просто не совсем понял концепцию инкапсуляции. </p>

Ответы [ 2 ]

5 голосов
/ 29 февраля 2012

Я никогда не помещал открытые константы в модуль класса.Все, и я имею в виду все, мои открытые переменные и константы находятся в стандартном модуле, называемом MGlobals.Это имеет два преимущества.Во-первых, мы с тобой знаем, где их найти - они несколько опасны и их нужно найти.Во-вторых, если этот модуль получает больше, чем несколько строк, я знаю, что я ленив и мне нужно провести рефакторинг.

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

1 голос
/ 04 марта 2017

Это просто так неправильно. Оп задал мой собственный вопрос отлично, и ответ просто так плоско.

IME, ответ, который искал OP (еще в 2012 году!), Заключался в том, что они должны пересылать необходимые значения через ClassName.Module (необязательная вещь, как var,). Затем они могут отправлять конкретные значения для предположительно повторяемых вариантов запроса и получать новый ответ на запрос, который соответствует другим запросам на других машинах и может использоваться в другом проекте без изменения класса. Хотя это правда, что интеграция требует изменений, она никогда не должна быть на стороне класса. Если вы разрушаете целостность класса, он становится модулем.

Внешние INI-файлы с другой стороны ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...