Когда использовать Класс в VBA?

В Java все переменные, которые вы объявляете, на самом деле являются «ссылками» на объекты (или примитивы), а не самими объектами.

При попытке выполнить один метод объекта , ссылка просит живой объект выполнить этот метод. Но если ссылка ссылается на NULL (ничего, нуль, void, nada), то нет способа, которым метод будет выполнен. Тогда runtime сообщит вам об этом, выбросив исключение NullPointerException.

Ваша ссылка «указывает» на нуль, таким образом, «Null -> Pointer».

Объект живет в памяти виртуальной машины пространство и единственный способ доступа к нему - использовать ссылки this. Возьмем этот пример:

public class Some {
    private int id;
    public int getId(){
        return this.id;
    }
    public setId( int newId ) {
        this.id = newId;
    }
}

И в другом месте вашего кода:

Some reference = new Some();    // Point to a new object of type Some()
Some otherReference = null;     // Initiallly this points to NULL

reference.setId( 1 );           // Execute setId method, now private var id is 1

System.out.println( reference.getId() ); // Prints 1 to the console

otherReference = reference      // Now they both point to the only object.

reference = null;               // "reference" now point to null.

// But "otherReference" still point to the "real" object so this print 1 too...
System.out.println( otherReference.getId() );

// Guess what will happen
System.out.println( reference.getId() ); // :S Throws NullPointerException because "reference" is pointing to NULL remember...

Это важно знать - когда больше нет ссылок на объект (в пример выше, когда reference и otherReference оба указывают на null), тогда объект «недоступен». Мы не можем работать с ним, поэтому этот объект готов к сбору мусора, и в какой-то момент VM освободит память, используемую этим объектом, и выделит другую.

39
задан Tom Fenech 8 April 2014 в 21:39
поделиться

8 ответов

Это зависит от того, кто собирается разработать и поддержать код. Типичные писатели макроса "Продвинутого пользователя", взламывающие маленькие специальные приложения, могут быть смущены при помощи классов. Но для серьезной разработки, причины использовать классы совпадают с на других языках. У Вас есть те же ограничения как VB6 - никакое наследование - но у Вас может быть полиморфизм при помощи интерфейсов.

А хорошее использование классов должно представить объекты и наборы объектов. Например, я часто вижу, что VBA кодирует, который копирует диапазон Excel в двухмерную антенную решетку, затем управляет двумерной матрицей с кодом как:

Total = 0
For i = 0 To NumRows-1
    Total = Total + (OrderArray(i,1) * OrderArray(i,3))
Next i

Это более читаемо для копирования диапазона в набор объектов с соответственно названными свойствами, чем-то как:

Total = 0
For Each objOrder in colOrders
    Total = Total + objOrder.Quantity * objOrder.Price
Next i

Другой пример должен использовать классы для реализации шаблона разработки RAII (Google для него). Например, одна вещь, которую я, возможно, должен сделать, состоит в том, чтобы оставить рабочий лист без защиты, сделать некоторые манипуляции, затем защитить его снова. Используя класс гарантирует, что рабочий лист будет всегда защищаться снова, даже если ошибка произойдет в Вашем коде:

--- WorksheetProtector class module ---

Private m_objWorksheet As Worksheet
Private m_sPassword As String

Public Sub Unprotect(Worksheet As Worksheet, Password As String)
    ' Nothing to do if we didn't define a password for the worksheet
    If Len(Password) = 0 Then Exit Sub

    ' If the worksheet is already unprotected, nothing to do
    If Not Worksheet.ProtectContents Then Exit Sub

    ' Unprotect the worksheet
    Worksheet.Unprotect Password

    ' Remember the worksheet and password so we can protect again
    Set m_objWorksheet = Worksheet
    m_sPassword = Password
End Sub

Public Sub Protect()
    ' Protects the worksheet with the same password used to unprotect it
    If m_objWorksheet Is Nothing Then Exit Sub
    If Len(m_sPassword) = 0 Then Exit Sub

    ' If the worksheet is already protected, nothing to do
    If m_objWorksheet.ProtectContents Then Exit Sub

    m_objWorksheet.Protect m_sPassword
    Set m_objWorksheet = Nothing
    m_sPassword = ""
End Sub

Private Sub Class_Terminate()
    ' Reprotect the worksheet when this object goes out of scope
    On Error Resume Next
    Protect
End Sub

можно тогда использовать это для упрощения кода:

Public Sub DoSomething()
   Dim objWorksheetProtector as WorksheetProtector
   Set objWorksheetProtector = New WorksheetProtector
   objWorksheetProtector.Unprotect myWorksheet, myPassword

   ... manipulate myWorksheet - may raise an error

End Sub 

, Когда этот Sub выходит, objWorksheetProtector выходит из объема, и рабочий лист защищен снова.

50
ответ дан David Murdoch 27 November 2019 в 02:30
поделиться

Я думаю, что критерии совпадают с другими языками

, Если необходимо связать несколько частей данных и некоторые методы и также конкретно обработать то, что происходит, когда объект создается/завершается, классы идеальны

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

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

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

, Другой пример мог бы быть то, если Вам не нравится мусор группы пользователей Доступа, можно создать собственный Пользовательский класс с методами для того, чтобы войти в систему и и функции контроля доступа пользователей уровня группы/auditing/logging определенные ошибки действий/отслеживания и т.д.

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

Вы действительно рано или поздно подходите к пределам VBA, но вполне мощный язык и если Ваша компания связывает Вас с ним, можно на самом деле вытащить некоторые хорошие, сложные решения из него.

8
ответ дан ajp 27 November 2019 в 02:30
поделиться

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

Но это вовсе не значит один не мог находить полезное место для класса в VBA или делают совершенно полезные вещи с помощью класса, просто что я никогда не находил их полезными в той среде.

5
ответ дан cori 27 November 2019 в 02:30
поделиться

Можно также снова использовать код VBA, не используя фактические классы. Например, если у Вас есть названный, VBACode. Можно получить доступ к любой функции или sub в любом модуле со следующим синтаксисом:

VBCode.mysub(param1, param2)

при создании ссылки на шаблон/документ (поскольку Вы были бы dll), Вы можете код ссылки из других проектов таким же образом.

3
ответ дан JonnyGold 27 November 2019 в 02:30
поделиться

Программное обеспечение Developing, даже с Microsoft Access, с помощью Объектно-ориентированного программирования обычно является хорошей практикой. Это будет допускать масштабируемость в будущем, позволяя объектам быть слабо связанным, наряду со многими преимуществами. Это в основном означает, что объекты в Вашей системе будут менее зависеть друг от друга, таким образом осуществление рефакторинг становится намного легче. Можно достигнуть, это - Доступ с помощью Модулей Класса. Оборотная сторона - то, что Вы не можете выполнить Наследование классов или Полиморфизм в VBA. В конце нет никакого жесткого правила об использовании классов, просто лучшие практики. Но имейте в виду, что, поскольку Ваше приложение растет, более легкое, оно должно поддержать классы использования.

2
ответ дан jinsungy 27 November 2019 в 02:30
поделиться

Я не вижу, почему критерии VBA несколько отличались бы от другого языка, особенно если Вы обращаетесь к VB.NET.

-1
ответ дан JosephStyons 27 November 2019 в 02:30
поделиться

For data recursion (a.k.a. BOM handling), a custom class is critically helpful and I think sometimes indispensable. You can make a recursive function without a class module, but a lot of data issues can't be addressed effectively.

(I don't know why people aren't out peddling BOM library-sets for VBA. Maybe the XML tools have made a difference.)

Multiple form instances is the common application of a class (many automation problems are otherwise unsolvable), I assume the question is about custom classes.

2
ответ дан 27 November 2019 в 02:30
поделиться

Я использую классы, когда мне нужно что-то сделать, и класс будет делать это лучше всего :) Например, если вам нужно реагировать (или перехватывать) события, тогда вам нужен класс. Некоторые люди ненавидят UDT (типы, определяемые пользователем), но они мне нравятся, поэтому я использую их, если мне нужен самодокументирующийся код на простом английском языке. Pharmacy.NCPDP намного легче читать, чем strPhrmNum :) Но UDT ограничен, поэтому скажем, я хочу иметь возможность установить Pharmacy.NCPDP и заполнить все остальные свойства. И еще я хочу сделать так, чтобы вы не могли случайно изменить данные. Затем мне нужен класс, потому что у вас нет свойств только для чтения в UDT и т. Д.

Еще одно соображение - просто удобочитаемость. Если вы работаете со сложными структурами данных, часто полезно знать, что вам просто нужно позвонить в Company.Owner.Phone. Затем AreaCode пытается отслеживать, где все структурировано. Специально для людей, которым приходится поддерживать эту кодовую базу через 2 года после вашего ухода :)

Мои собственные два цента - это «Код с целью». Не используйте класс без причины. Но если у вас есть причина, сделайте это :)

2
ответ дан 27 November 2019 в 02:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: