Программирование >>  Проектирование интерфейса пользователя 

1 ... 125 126 127 [ 128 ] 129 130 131 ... 153


Если свойство 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. Может показаться, что указанные выводы могут способствовать тому, чтобы задним числом исправить листинг 22.1.

Но зачем? Он может послужить хорошей иллюстрацией методов работы, поддерживаемых парадигмой объектно-ориентированного программирования. На самом деле, вполне приемлема и даже желательна практика непрерывного - диалектического - улучшения структуры и способов реализации класса по мере постижения проблемы и осознания ее особенностей. В рамках объектно-

ориентированного подхода затраченные усилия, направленные на развитие и улучшение программного кода, всецело окупятся .


Рассматривая возможность использования Collection в ка-

честве свойства Strings в настоящем приложении, я бы сначала изменил дизайн с целью реализовать методы Add и Remove как методы класса Strings.

Использование в явном виде объекта Collection исключает

применение интерфейса класса Strings.

Еще несколько замечаний. Достаточно полезна специальная функция indexOfName (определенная в строках Она вызывается из строк 29 и 40 и возвращает ин-

деке элемента коллекции по значению ключевого имени.

Заслуживает внимания реализация обработчика ошибок в строках 43-47. Если Property-метод Let Value предпринимает попытку изменения такого элемента коллекции, которого просто нет, выполняется условие обработчика ошибок в строке 43 и вызывается стандартный метод Add добавления в коллекцию нового элемента. Все другие обработчики просто констатируют ошибку и обращаются к процедуре RaiseError, определенной в строках 79-81.

Реализация функций файлового ввода-вывода

Для практического воплощения средств файлового ввода-вывода, предусмотренных в интерфейсе класса Strings, целесообразно обратиться к готовому решению - классу trearn (мы его строили на прошлом занятии). Листинг 22.3 демонстрирует ту часть кода класса Strings, которая содержит тексты процедур потокового вывода данных в файл и чтения их из файла. Если объединить тексты листингов 22.2 и 22.3 воедино, мы получим цельный интерфейс класса, предназначенного для реализации ассоциативного массива с поддержкой файловых операций.



Листинг 22.3. Методы класса Strings, обеспечивающие выполнение файловых операций

1: Private Sub ParseStrings(ByVal Text As String)

2: Dim P As Integer

3: Do While (Len{Text) > 0)

4: P = InStrd, Text, vbNewLine)

5: If (P = 0) Then

Call FStrings.Add(Text) Exit Sub

7: 8: 9:

10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29

3 0:

31. 32

38.:

Else

Call FStrings.Add(Left$(Text, P - 1)) Text = Mid$(Text, P + Len(ybNewLine))

End If

Loop End Sub

Public Su ByVal FileName As String) Clear

Dim F As New FileStream Call F.OpenStream(FileName) Dim Text As String Call F.ReadStream(Text, F.Count) Call ParseStrings(Text) Call F.CloseStream Set F = Nothing End Sub

Sub FileName As String)

Dim I As Integer

Dim F As New FileStream

Call F.OpenStream( FileName )

For 1=1 To FStrings.Count

Call F.WriteStream(Strings( I ) & vbNewLine) Next I

Call F.CloseStream

Set F = Nothing

End Sub

Public Sub Clear 0

Do While(FStrings.Count >0)

Call FStrings.Remove(FStrings.Count)

Loop End Sub

Анзлиз

I Листинг 22.3 демонстрирует пример реализации методов ReadFromFile и .I WriteToFile. Добавьте этот текст в состав модуля класса Strings (листинг 22.2) - и получите полпофупкциопальп1й вариант организации ассоциативного массива, спабжеппого средствами файлового ввода-вывода. Листинг 22.3 содержит дополнительную процедуру ParseString, осуществляющую считывание отдельных строк даппых из общего текстового буфера и сохранение их в элементах коллекции. Разделителем строк в файле служит предопределенная копстапта vbNewLine, состоящая из пары символов возврата каретки и перевода строки. В процедурах ReadFromFile и WriteToFile создаются и применяются объекте! класса FileStream, построенного па прошлом занятии. Еще одпа процедура, Clear, используется для проверки того факта, что в коллекции strings находится только содержимое считанного файла.



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

другой базе данных, выполните следующие действия.

Откройте необходимый модуль (в нашем случае - в окне редактора

Microsoft Visual Basic.

Выберите файл для экспорта (в пашем случае - FileStream. els). Выберите команду FileOExport File.

В диалоговом окне Export File (рис И. 1) введите имя файла и щелкните на кнопке Сохранить (Save).

i gJMyeBooks jiiaiMyReasivedFtes

Office Deveioper Projects источняси s

pho:o Мои рисунки

lteach Access 24 hours Imor nfwt

Э1 ачйеозегмси

т &гнша j

Рис. 22.1. Диалоговое окно Export File позволяет сохранить код класса во внешнем файле

Благодаря применению готовых классов Collection и FileStream задача реализации класса Strings оказалась относительно простой. Агрегация позволяет использовать средства существующих классов при создании новых. Возможности кода вырастают весьма ощутимо, но это слабо сказывается на его сложности. Причина в том, что новый профаммныи текст писать почти не приходится - вы пользуетесь готовыми и протестированными решениями, прошедшими проверку временем и гарантирующими более высокую степень надежности.

Тестирование нового класса

Подобно любому новому профаммному коду, класс strings должен быть протестирован. Однако класс Collection тестировать не нужно (впрочем, исходного кода у вас все равно нет), да и наш собственный класс FileStream вряд ли нуждается в проверке - это уже сделано на прошлом занятии. При повторном использовании существующего кода достаточно проверить точки его взаимодействия со строками нового.

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

Листинг 22.4 содержит фрагмент кода, который можно применить для тестирования класса Strings.

Листинг 22.4. Процедура для тестирования класса Strings

1: 2 3 4

Sub )

Dim S As New Strings S.Values( Ключ1 ) = Значение! S.Values( Ключ2 ) = Значение2



1 ... 125 126 127 [ 128 ] 129 130 131 ... 153

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика