2012-02-29 2 views
5

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

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

+1

Просьба представить некоторый пример кода для людей, чтобы понять, «говорит мне, что это не может быть хорошей практикой.» – shahkalpesh

+0

http://www.cpearson.com/excel/classes.aspx – JMax

+0

Было бы неплохо узнать, имеете ли вы в виду хорошую практику против какой-либо вещи .. Обычно это только для вас самих, и вы можете это понять, тогда это хорошая практика ... – gbianchi

ответ

5

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

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

+0

Спасибо. Что помогает. У меня на самом деле есть модуль для констант и типов, утилит (которые я теперь могу использовать в своих классах без этого вопроса, который меня сюда взял). – bigeyes

1

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

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

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

Смежные вопросы