В 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 освободит память, используемую этим объектом, и выделит другую.
Это зависит от того, кто собирается разработать и поддержать код. Типичные писатели макроса "Продвинутого пользователя", взламывающие маленькие специальные приложения, могут быть смущены при помощи классов. Но для серьезной разработки, причины использовать классы совпадают с на других языках. У Вас есть те же ограничения как 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 выходит из объема, и рабочий лист защищен снова.
Я думаю, что критерии совпадают с другими языками
, Если необходимо связать несколько частей данных и некоторые методы и также конкретно обработать то, что происходит, когда объект создается/завершается, классы идеальны
, говорят, есть ли у Вас несколько процедур, которые стреляют, когда Вы открываете форму, и одному из них требуется много времени, Вы могли бы решить желание ко времени каждого этапа......
Вы могли создать класс секундомера с методами для очевидных функций для запуска и остановки, Вы могли тогда добавить функцию, чтобы получить время до сих пор и сообщить о нем в текстовом файле, с помощью аргумента, представляющего название синхронизируемого процесса. Вы могли записать логику для входа только самых медленных действий для расследования.
Вы могли тогда добавить объект индикатора выполнения с методами, чтобы открыть и закрыть его и отобразить названия текущего действия, наряду с временами в мс и вероятное время, оставаясь на основе предыдущих сохраненных отчетов и т.д.
, Другой пример мог бы быть то, если Вам не нравится мусор группы пользователей Доступа, можно создать собственный Пользовательский класс с методами для того, чтобы войти в систему и и функции контроля доступа пользователей уровня группы/auditing/logging определенные ошибки действий/отслеживания и т.д.
, Конечно, Вы могли сделать это использование, ряд несвязанных методов и большой переменной передачи, но иметь все это инкапсулировавшее в классе просто кажется лучше мне.
Вы действительно рано или поздно подходите к пределам VBA, но вполне мощный язык и если Ваша компания связывает Вас с ним, можно на самом деле вытащить некоторые хорошие, сложные решения из него.
Я не сказал бы, что существует определенный критерий, но я действительно никогда не находил, что полезное место использует Классы в коде VBA. В моем уме это так связывается с существующими моделями вокруг приложений Office, что добавление дополнительной абстракции за пределами той объектной модели просто путает вещи.
Но это вовсе не значит один не мог находить полезное место для класса в VBA или делают совершенно полезные вещи с помощью класса, просто что я никогда не находил их полезными в той среде.
Можно также снова использовать код VBA, не используя фактические классы. Например, если у Вас есть названный, VBACode. Можно получить доступ к любой функции или sub в любом модуле со следующим синтаксисом:
VBCode.mysub(param1, param2)
при создании ссылки на шаблон/документ (поскольку Вы были бы dll), Вы можете код ссылки из других проектов таким же образом.
Программное обеспечение Developing, даже с Microsoft Access, с помощью Объектно-ориентированного программирования обычно является хорошей практикой. Это будет допускать масштабируемость в будущем, позволяя объектам быть слабо связанным, наряду со многими преимуществами. Это в основном означает, что объекты в Вашей системе будут менее зависеть друг от друга, таким образом осуществление рефакторинг становится намного легче. Можно достигнуть, это - Доступ с помощью Модулей Класса. Оборотная сторона - то, что Вы не можете выполнить Наследование классов или Полиморфизм в VBA. В конце нет никакого жесткого правила об использовании классов, просто лучшие практики. Но имейте в виду, что, поскольку Ваше приложение растет, более легкое, оно должно поддержать классы использования.
Я не вижу, почему критерии VBA несколько отличались бы от другого языка, особенно если Вы обращаетесь к VB.NET.
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.
Я использую классы, когда мне нужно что-то сделать, и класс будет делать это лучше всего :) Например, если вам нужно реагировать (или перехватывать) события, тогда вам нужен класс. Некоторые люди ненавидят UDT (типы, определяемые пользователем), но они мне нравятся, поэтому я использую их, если мне нужен самодокументирующийся код на простом английском языке. Pharmacy.NCPDP намного легче читать, чем strPhrmNum :) Но UDT ограничен, поэтому скажем, я хочу иметь возможность установить Pharmacy.NCPDP и заполнить все остальные свойства. И еще я хочу сделать так, чтобы вы не могли случайно изменить данные. Затем мне нужен класс, потому что у вас нет свойств только для чтения в UDT и т. Д.
Еще одно соображение - просто удобочитаемость. Если вы работаете со сложными структурами данных, часто полезно знать, что вам просто нужно позвонить в Company.Owner.Phone. Затем AreaCode пытается отслеживать, где все структурировано. Специально для людей, которым приходится поддерживать эту кодовую базу через 2 года после вашего ухода :)
Мои собственные два цента - это «Код с целью». Не используйте класс без причины. Но если у вас есть причина, сделайте это :)