Управление пользовательскими типами в различных модулях - PullRequest
4 голосов
/ 20 октября 2010

Каков наилучший способ управления общими пользовательскими типами в модулях VBA?

Я использую одни и те же пользовательские типы в разных модулях.Например, мне часто нужно представлять (x, y) точки, поэтому я получаю Type в разных модулях:

Type XYpointType
    x As Double
    y As Double
End Type

Я передаю аргументы типа XYpointType в подпрограммы и изфункции в разных модулях.

Однако я подозреваю, что это плохой способ управления пользовательскими типами.Точно такой же код определения Type заканчивается во многих различных модулях.

В качестве альтернативы, я мог бы иметь это объявление Type в одном центральном модуле типов, и все другие модули, нуждающиеся в этом конкретном типе, должны ссылаться на модуль типов.Недостатком является то, что каждый модуль теряет свою «модульность», так как он должен сопровождаться модулем «types», куда бы он ни шел.

Есть предложения?

Ответы [ 3 ]

3 голосов
/ 20 октября 2010

Это интересно, потому что я никогда не знал, что у вас может быть два модуля, объявляющих открытый тип с одинаковым именем.Теперь, когда я знаю, я в ужасе.

Итак, во-первых, Эрик Тауэрс прав, что вы хотите поместить объявление Type только в один модуль.Другие модули, которые используют этот тип, будут зависеть от того, доступен ли этот модуль, но это только то, что поставляется с модульностью.Необходимость управления зависимостями между модулями является общей для всей разработки программного обеспечения.К сожалению, в рамках одного проекта VBA (например, типа, который вы найдете в одной книге Excel) единственным вариантом управления зависимостями модулей является ручной.(В VBA «модули» на самом деле являются «файлами исходного кода». Другие языки / среды имеют различные системы упаковки более высокого уровня.)

Теперь для ужасающей части.Если вы объявляете типы с одинаковыми именами в разных модулях, вы настраиваете себя на проблемы.Рассмотрим два модуля VBA:

'Module1

Public Type typ
    x As String
End Type

Public Sub useTyp()
    Dim t As typ
    t.x = 42

    Debug.Print t.x + t.x
End Sub

и

'Module2

Public Type typ
    x As Long
End Type

Public Sub useTyp()
    Dim t As typ
    t.x = 42

    Debug.Print t.x + t.x
End Sub

в одном проекте, ваш код будет «компилироваться» (по крайней мере, в Excel VBA).Но два саба 'useTyp' дают разный результат.Хуже того, если вы удалите одно из объявлений Type из одного из модулей, вы внезапно изменили поведение подпрограммы 'useTyp' в том же модуле!Такая двусмысленность никогда не желательна.

В действительности VBA создает два разных типа: Module1.typ и Module2.typ.Когда вы находитесь в том же модуле и не определяете имя типа, VBA молча находит «правильный» тип и использует его.

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

3 голосов
/ 20 октября 2010

Используйте свой второй метод.Смысл в том, чтобы сделать многоразовый BLOB-объект Types.Для повторного использования он должен быть отделен.Тогда, да, каждый модуль, который использует эти типы, должен ссылаться на этот BLOB-объект.Но то же самое можно сказать о модулях, вызывающих друг друга, формах, требующих модулей, которые они вызывают, и т. Д.

1 голос
/ 20 октября 2010

Вы также можете создать класс для своих XYPoints.Это позволит вам иметь пользовательские функции и методы, если вам нужно идти по этому пути.Типы очень ограничены по сравнению с классами.

Вот хороший ресурс для начала: http://www.cpearson.com/excel/Classes.aspx

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