Файл: Освой самостоятельно программирование для MS Access 2002 за 24 часа [П.Киммел].pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 21.10.2020
Просмотров: 7904
Скачиваний: 25

Property Let
Name As String,
Value As String)
39: On Error GoTo EXCEPT
40:
= Name &
& Value
41: Exit Property
If
= 5) Then
44:
&
Value)
45: Else
46: Call
47: End If
Property
49:
Function
Name As String) As Integer
51:
Dim I As Integer
53: For I = 1 To
If
Strings ( I
Name) > 0) Then
55: IndexOfName = I
Exit Function
57: End If
58: Next I
59:
60: IndexOfName = -1
Function
Sub
As String)
64:
Sub
66:
Sub
FileName As String)
68:
Sub
70:
Sub Class_Initialize ( )
72: Set FStrings = New Collection
Sub
74:
Sub
)
76: Set FStrings = Nothing
Sub
78:
Sub
Msg As String)
80:
vbObjectError + 1000,
Msg
Sub
Как вы заметили, объем кода существенно вырос. Выбрав класс кол-
I лекций, мы значительно облегчили задачу программирования. Строка 5
содержит объявление переменной
FStrings
класса
Collection.
Объект коллекции инициализируется в момент выполнения директивы
New
(срабатывает процедура
Class_Initialize,
расположенная в
строках
уничтожается он при выполнении команды присваи-
вания значения
Nothing
(автоматически выполняется процедура
Class Terminate,
строки
22-й час. Совершенствование типов данных 405

Если свойство Names выступает в роли правостороннего операнда выражения, вы-
зывается соответствующий Property-метод Get (строка 9), который возвращает часть
строки указанного индексом элемента коллекции от начала до символа равенства (=).
Если Names употребляется в левой части выражения присваивания, срабатывает
Property-метод Let (строки 15-21), перезаписывающий содержимое заданного эле-
мента коллекции символьной строкой, которая состоит из ключевого имени и значе-
ния, разделенных символом =.
Реализация свойства Strings претерпела изменения. Табл. 22.1 описывает Strings
как общую строку данных. В начале процесса
класса у меня еще не
было предложений по поводу добавления строк в будущее "хранилище" и удаления
их. Поскольку в классе Collection подобные методы уже реализованы, достаточно
было оставить Property-метод Get Strings (метод Let Strings я исключил во из-
бежание непреднамеренного присвоения объекту коллекции нового значения типа
Collection) и возложить обязанности по изменению элементов коллекции на Prop-
erty-методы Let для свойств Names и Values. Может показаться, что указанные вы-
воды могут способствовать тому, чтобы "задним числом" исправить листинг
Но зачем? Он может послужить хорошей иллюстрацией методов работы, поддер-
живаемых парадигмой объектно-ориентированного программирования. На самом де-
ле, вполне приемлема и даже желательна практика непрерывного -
"диалектического" •- улучшения структуры и способов реализации класса по мере по-
стижения проблемы и осознания ее особенностей. В рамках объектно-
ориентированного подхода затраченные усилия, направленные на развитие и улучше-
ние программного кода, всецело "окупятся".
Рассматривая возможность использования
Collection в ка-
честве свойства Strings в настоящем приложении, я бы сначала изме-
нил дизайн с целью реализовать методы Add и Remove как методы класса
Strings.
Использование в явном виде объекта Collection исключает
применение интерфейса класса Strings.
Еще несколько замечаний. Достаточно полезна специальная функция
(определенная в строках
Она вызывается из строк 29 и 40 и возвращает ин-
декс элемента коллекции по значению ключевого имени.
Заслуживает внимания реализация обработчика ошибок в строках
Если
Property-метод Let Value предпринимает попытку изменения такого элемента кол-
лекции, которого просто нет, выполняется условие обработчика ошибок в строке 43 и
вызывается стандартный метод Add добавления в коллекцию нового элемента. Все
другие обработчики просто констатируют ошибку и обращаются к процедуре
RaiseError, определенной в строках
Реализация функций файлового ввода-вывода
Для практического воплощения средств файлового ввода-вывода, предусмотренных
в интерфейсе класса Strings, целесообразно обратиться к готовому решению —
классу
(мы его строили на прошлом занятии). Листинг 22.3 демонстриру-
ет ту часть кода класса Strings, которая содержит тексты процедур потокового выво-
да данных в файл и чтения их из файла. Если объединить тексты листингов 22.2 и
22.3 воедино, мы получим цельный интерфейс класса, предназначенного для реализа-
ции ассоциативного массива с поддержкой файловых операций.
406 Часть VIII. Объектно-ориентированное программирование в Access

Листинг 22.3. Методы класса Strings, обеспечивающие выполнение файловых операций
1:
2:
3:
4:
5:
7:
8:
9:
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
33
34
35
36
37
38
39
40
41
Private Sub
Text As String)
Dim P As Integer
Do While
> 0)
P =
Text,
If (P = 0)
Call
Exit Sub
Else
Call
P -
Text =
P +
End If
Loop
Sub
Sub
As String)
; Clear
: Dim F As New
: Call
: Dim Text As String
; Call
: Call
Call
Set F = Nothing
Sub
Sub
FileName As String)
: Dim I As Integer
: Dim F As New FileStream
; Call
FileName )
: For I = 1 To
: Call
I ) & vbNewLine)
: Next I
: Call
; Set F = Nothing
: End Sub
Public Sub
: Do
>0)
: Call
: Loop
Sub
I Листинг 22.3 демонстрирует пример реализации методов ReadFromFile и
I WriteToFile. Добавьте этот текст в состав модуля класса Strings
(листинг 22.2) — и получите полнофункциональный вариант организа-
ции ассоциативного массива, снабженного средствами файлового ввода-
вывода. Листинг 22.3 содержит дополнительную процедуру ParseString,
осуществляющую считывание отдельных строк данных из общего тексто-
вого буфера и сохранение их в элементах коллекции. Разделителем строк
в файле служит предопределенная константа vbNewLine, состоящая из
пары символов возврата каретки и перевода строки. В процедурах Read-
FromFile и WriteToFile создаются и применяются объекты класса
FileStream, построенного на прошлом занятии. Еще одна процедура,
Clear, используется для проверки того факта, что в коллекции strings
находится только содержимое считанного файла.
22-й час. Совершенствование типов данных
407

Чтобы получить возможность использовать ранее созданный класс, хранящийся в
другой базе данных, выполните следующие действия.
1. Откройте необходимый модуль (в нашем случае —
в окне редактора
Microsoft Visual Basic.
2. Выберите файл для экспорта (в нашем случае — FileStream.
3. Выберите команду
File.
4. В диалоговом окне Export File (рис.
введите имя файла и щелкните на кнопке
Сохранить (Save).
3
Projects
S
рисунки
i
Диалоговое окно Export File позво-
ляет сохранить код класса во внешнем файле
Благодаря применению готовых классов Collection и FileStream задача реали-
зации класса Strings оказалась относительно простой. Агрегация позволяет исполь-
зовать средства существующих классов при создании новых. Возможности кода вы-
растают весьма ощутимо, но это слабо сказывается на его сложности. Причина в том,
что новый профаммныи текст писать почти не приходится — вы пользуетесь готовы-
ми и протестированными решениями, прошедшими проверку временем и гаранти-
рующими более высокую степень надежности.
Тестирование нового класса
Подобно любому новому профаммному коду, класс strings должен быть протес-
тирован. Однако класс Collection тестировать не нужно (впрочем, исходного кода у
вас все равно нет), да и наш собственный класс FileStream вряд ли нуждается в про-
верке — это уже сделано на прошлом занятии. При повторном использовании суще-
ствующего кода достаточно проверить точки его взаимодействия со строками нового.
Конечный итог повторного применения профаммного кода выражается в увеличе-
нии производительности труда профаммиста, уменьшении затрат на тестирование и
повышении степени надежности и функциональной полноты.
Листинг 22.4 содержит фрагмент кода, который можно применить для тестирова-
ния класса Strings.
Листинг 22.4. Процедура для тестирования класса Strings
1: Sub
)
Dim S As New Strings
) =
)
408
Часть VIII. Объектно-ориентированное программирование в Access

5: Call
)
6: Call
"Test.txt" )
End Sub
Строка 2 листинга 22.4 содержит
объявления и создания
объекта S класса strings. Строки 3 и 4 тестируют правильность выпол-
нения функции
Property-метода Let Values и обработ-
чика ошибок в нем, поскольку выражения содержат обращения к эле-
ментам коллекции, которых еще нет (в этом случае элементы будут соз-
даны). Строка
5
проверяет средства записи данных в файл, а строка 6 -
их чтения. Строка 7 позволяет увидеть содержимое считанного из файла
элемента коллекции с номером 1 в окне сообщения. Тестовый код спо-
собен выявить немало ситуаций, о которых вы даже не подозревали.
Применение класса Strings
Класс Strings может оказаться особо нужным в тех случаях, когда необходимы
средства организации доступа к значениям по ключевым именам. В Windows, напри-
мер, все еще находят широкое применение файлы INI, содержащие информацию о
параметрах настройки приложений. Ассоциативный массив в виде объекта коллек-
ции — удобный способ хранения данных, позволяющий обращаться к элементам ин-
формации как по индексам, так и по ключевым именам.
В главе "8-й час. Декомпозиция задач" вы изучили процедуры Get Set-
tings и SaveSettings, позволяющие выполнять чтение реестра и запись
в реестр. Эти методы работы с реестром более предпочтительны для
сохранения информации о приложении, чем использование
Класс Strings полезен для хранения ассоциативных данных, которые
должно отслеживать приложение. Однако не рекомендуется использовать
класс Strings для работы с реестром вместо специально созданных для
этой цели методов.
Для чтения и записи INI-файлов существуют API-процедуры — Get-
PrivateProfileString И
Как уже
отмечалось, предпочтительнее работать с реестром, в этом случае
указанные API-процедуры не понадобятся.
Резюме
На этом занятии на примере класса strings вы изучили способы построения кол-
лекций, обеспечивающих возможности обращения к элементам данных по индексным
значениям и ключевым именам. Что еще более важно — вы усвоили основные аспек-
ты объектно-ориентированного проектирования и методы повторного применения
существующего кода при построении новых классов. Достаточно приложить неболь-
шие усилия — и за счет добавления простых проверенных решений класс приобретает
новые полезные качества.
Вы убедились, как включение существующего кода в состав нового класса помога-
ет добиться приемлемых результатов с минимальными затратами: так, при построении
класса Strings мы воспользовались ранее созданным классом
обеспе-
чивающим средства выполнения файловых операций.
22-й час. Совершенствование типов данных 409