Это продолжение предыдущей статьи «ООП в VB6?». Если вы не читали его, обязательно сначала прочтите его, а затем вернитесь к этому. Вы можете прочитать предыдущую статью, нажав на заголовок «ООП в VB6?» ниже:
Если вы хотите писать код вместе со мной, мы будем использовать бесформенное приложение VB6, поскольку нам не обязательно нужна форма для иллюстрации этой концепции.
Создание класса
Итак, для этого нам понадобится модуль «класс». Вы можете сделать это из окна проекта, щелкните правой кнопкой мыши проект, затем нажмите «Добавить», а затем «Модуль класса».

Продолжайте, чтобы выбрать «Модуль класса» и нажмите «Открыть».

В итоге вы получите пустой модуль класса, как показано ниже:

Затем давайте переименуем его с «Class1» на что-то более описательное для нашей демонстрации «CBankAccount».
Мы используем префикс с заглавной буквы «C», чтобы указать, что это модуль класса («M» для базового модуля, «F» для класса формы).

Написание класса
Хорошо, давайте наберем начальные коды для этого класса. Нам понадобятся только одни данные для поддержания баланса, а остальные будут методами, которые будут инкапсулировать эти данные.
Вот коды, так что вы можете просто скопировать + вставить их:
Option ExplicitPrivate mdblBalance As DoublePublic Sub Deposit(ByVal Amount As Double) If Amount < 0 Then ' ' prevent negative deposits ' Err.Raise vbObjectError + 101, , _ "Negative deposits are not allowed" Else ' ' you may require "minimum deposit" verification here ' but for this demo, we'll just accept any positive ' mdblBalance = mdblBalance + Amount End If End Sub

Далее мы создадим еще одну функцию для инкапсуляции получения баланса:
Public Function GetBalance() As Double
'
' we are just going to return the value of our
' protected (or encapsulated) variable
'
GetBalance = mdblBalance
End Function

Последний метод для снятия с этого счета:
Sub Withdraw(ByVal Amount As Double) ' ' you can do this at least 2 ways, either require Amount ' to be negative and then add it to balance, ' effectively substracting it. ' --- ' or ensure it's positive and perform substraction, ' which is what we'll do on this demo. '' ensure the value is positive using Abs(olute) function Amount = Abs(Amount) If Amount > GetBalance Then ' ' prevent withdrawing more than what is there ' Err.Raise vbObjectError + 201, , _ "Amount to be withdrawn is larger than current balance" End If mdblBalance = mdblBalance - Amount End Sub

Тестирование класса
Класс готов, поэтому теперь мы переключимся и повторно используем существующий базовый модуль (Module1) и напишем в нем наши тестовые коды.
Во-первых, удалите коды, которые мы написали в процедуре «Sub Main», или удалите все коды, затем скопируйте и вставьте код ниже:
:: Счастливый путь
Счастливый путь просто означает, что мы используем класс по назначению, убедившись, что мы передаем правильные значения, и все и все довольны 🙂
Option ExplicitSub main() happy_path End SubPrivate Sub happy_path() ' not recommended to auto-instantiate, but for brevity we will Dim cba As New CBankAccountDebug.Print "Initial Balance: " & cba.GetBalance cba.Deposit 100 Debug.Print "After Deposit: " & cba.GetBalancecba.Withdraw 35 Debug.Print "After Withdrawal: " & cba.GetBalance End Sub
Теперь запустите этот проект, и вы увидите, что он работает так, как ожидалось (из окна Immediate):

:: Отрицательное тестирование
Это противоположно Happy Path, поскольку наша цель в этом тесте — намеренно взломать наш код 🙂
Я знаю, это звучит странно, но это не только гарантирует, что вы полностью его протестировали, но и гарантирует, что мы правильно обработаем все исключения.
Но прежде чем мы это сделаем, мы должны убедиться, что среда IDE настроена так, чтобы мы могли правильно выполнять тесты.
Итак, перейдите в меню «Инструменты», затем нажмите «Параметры…»:

Перейдите на вкладку «Общие» и в разделе «Отлов ошибок» выберите «Перерыв при необработанных ошибках».

Это очень важно, если вы хотите перехватывать исключения, подобные тем, которые мы создали внутри класса с помощью вызовов «Err.Raise».
Теперь мы можем перейти к написанию нашего отрицательного теста:
ПРИМЕЧАНИЕ: мы закомментировали строку «happy_path» в Sub Main, чтобы она не выполнялась при тестировании.
Но вы можете оставить ее как есть.
Sub main() 'happy_path negative_tests End SubPrivate Sub negative_tests() ' not recommended to auto-instantiate, but for brevity we will Dim cba As New CBankAccount' VB6 does not have TRY..CATCH so we'll emulate that ' via On Error Resume BUT don't use this to hide errors; ' that's lazy and bad :) On Error Resume Next cba.Deposit -45 If Err.Number <> 0 Then Debug.Print Err.Description End Ifcba.Withdraw 88 If Err.Number <> 0 Then Debug.Print Err.Description End If End Sub

Мы тестируем его и убеждаемся, что он действительно вызывает ошибки, которые мы определили в нашем классе:

Я расскажу о следующем («Полиморфизм») в следующей статье, так что следите за обновлениями 🙂
Первоначально опубликовано на https://coffeewithdennis.com.