|
Программирование >> Проектирование интерфейса пользователя
Если свойство 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
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |