Файл: Освой самостоятельно программирование для MS Access 2002 за 24 часа [П.Киммел].pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 21.10.2020

Просмотров: 7960

Скачиваний: 25

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

 для хранения информации о параметрах настройки программ, — это примеры

ассоциативных массивов. Такой же структурой обладают и базы данных реестров опе-

рационных систем Windows 95, 98, NT и 2000. Реестр содержит ключи и соответст-

вующие им значения. Если вы никогда не видели, как выглядит реестр Windows,

щелкните на кнопке Пуск (Start) панели задач, выберите в меню элемент Выполнить

(Run) и посредством команды

 загрузите программу Редактор реестра. Не

вносите в реестр никаких изменений, поскольку это может привести к разного рода

нарушениям работоспособности операционной системы и прикладных программ.

Класс Collection также можно считать разновидностью ассоциативных массивов,

поскольку каждому элементу коллекции вы ставите в соответствие определенный ключ.

В данном случае, правда, существует одно ограничение — у программиста нет доступа к

ключам как к значениям. Вы должны заранее знать значения ключей, чтобы суметь ими

воспользоваться. Далее вы узнаете, как применять Collection в новом классе для рас-
ширения его возможностей. Чтобы облегчить задачу сохранения ассоциативного масси-

ва в файле и чтения его из файла, добавим средства класса FileStream, который мы
построили в главе "21-й час. Основы программирования классов".

Когда именно следует создавать классы

Никто не запрещает создавать классы при каждом удобном случае. Если говорить

о формальной стороне вопроса, вы можете построить класс, содержащий единствен-

ный элемент данных, хотя, разумеется, это нельзя назвать удачным решением. В ка-

честве общего правила можно указать следующее: целесообразно рассматривать воз-

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

более порций данных и предложить, по меньшей мере, столько же методов их обра-

ботки, полезных для решения определенной частной задачи.

Помните о различии классов и объектов.

 Класс

 определяет вид и

поведение отдельного элемента. Термин

 объект

 часто используют там,

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

класс.

 Как уже указывалось в начале этой главы, совершенно не обяза-

тельно определять классы во всех приложениях в Access.

Впрочем, если вы заглянете в окно оперативной справочной системы и отыщете

тему, посвященную классу Collection, то обнаружите, что этот класс содержит всего

одно свойство и три метода. Тем не менее, класс Collection находит самое широкое

применение. С другой стороны, неплохо, если класс содержит не более десятка общих

методов, поскольку в противном случае он становится слишком сложным для воспри-

ятия и использования. Число скрытых членов класса особого значения не имеет, по-

скольку пользователи могут даже не знать об их существовании.

Если в программе повторяется один и тот же фрагмент кода, эта программа

 дивер-

гентная.

 Код должен быть

 т.е. каждый отдельный блок кода должен по-

являться в программе только один раз. Если набор из нескольких строк встречается в

коде неоднократно, попробуйте организовать этот фрагмент в виде отдельного класса.

Такой подход не только уменьшает объем кода, но и облегчает его сопровождение.

Конечно, это самые общие правила, поэтому еще раз сформулируем основные

критерии пригодности задачи к тому, чтобы быть оформленной в виде класса, и об-

щие количественные требования к структуре класса.

• Существует три или более элементов данных, совместно описывающих ча-

стную задачу.

• Количество членов внешнего интерфейса класса не превышает десятка.
• Удается обосновать необходимость нарушения двух предыдущих правил.

400 Часть VIII. Объектно-ориентированное программирование в Access


background image

Если вы станете создавать классы только в тех случаях, которые укладываются в

предложенную схему, вы достигнете вполне приемлемых результатов.

Теперь вернемся к поставленной цели — нам необходим класс ассоциативной кол-

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

файлового ввода-вывода данных.

Принципы объектно-ориентированного
проектирования

Один из основных принципов

 объектно-ориентированного проектирования

 состоит

в необходимости построения классов, которые способны предоставить решение задач,

относящихся к определенной

 области.

 Мы, например, собираемся решить задачу хра-

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

значению по имени или по индексу и, наоборот, к имени по значению.

С объектно-ориентированным программированием неразрывно связаны

дисциплины объектно-ориентированного

 проектирования

 и

 обла-

дающие собственными языками, методами и инструментальными средст-

вами. Одна из самых популярных систем такого рода — Rational Rose.
Проектирование во многом сводится к процессу моделирования. Стан-

дартом языков моделирования служит Unified Modeling Language (UML).

UML использует собственные средства описания классов и взаимо-

отношений между ними. За более подробной информацией о языке UML

и способах его применения обращайтесь к специальной литературе

(например, к книге

 Teach Yourself UML in 24 Hours,

 изданной

 Sams).

Объектно-ориентированное проектирование — это самостоятельная

область знаний, отличная от собственно программирования. Конечно,

если проект прост и реализуется силами небольшого коллектива, стадии

проектирования и программирования часто неразрывно связаны, чего

не скажешь о крупномасштабных и сложных проектах, когда этапу

программирования предшествуют серьезные и длительные процессы

анализа, моделирования и проектирования.

Основной принцип объектно-ориентированного проектирования заключается в

определении набора свойств и методов, необходимого и достаточного для решения

определенной задачи с помощью будущего класса. (На этом этапе программисту по-

могут лист бумаги и карандаш.) Ниже перечислены все требования к классу ассоциа-

тивных массивов, который будет проектироваться.

Проектирование класса ассоциативных

массивов

Класс ассоциативных массивов, который необходимо построить, предназначен для

хранения пар символьных значений. Поэтому уместно назвать его Strings. Класс
обязан обеспечить реализацию возможностей, перечисленных ниже.

• Хранение строк.
• Доступ к значениям по ключевым именам.

 час. Совершенствование типов данных

401


background image

• Доступ к именам по значениям.
• Чтение строк из файла.
• Запись строк в файл.
• Редактирование значений.

Теперь, когда круг задач определен, имеет смысл придумать названия для соответ-

ствующих членов класса и решить,

 что

 именно должен представлять собой каждый из

них — свойство или метод.

Нам необходима возможность доступа к строкам по индексу, поэтому символьное

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

обращаться к строкам по ключевому имени, которое также следует представить в виде

свойства. Указанное замечание справедливо и в отношении ключей — их надлежит

оформить как свойства. Теперь подытожим: нам необходимы отдельные свойства
Names и Values, а также символьная переменная Strings, предназначенная для од-

новременного хранения ключевого имени и значения. В наименовании свойства

Strings форма множественного числа существительного выбрана по той причине,

что это индексированное значение — в объекте класса их может быть несколько.

Класс должен поддерживать возможность выполнения операций чтения и записи

файловых данных. Поэтому потребуются два соответствующих метода — ReadFrom-

 и

 Табл. 22.1 представляет описание элементов внешнего интер-

фейса класса Strings.

Таблица

 Описание внешнего интерфейса класса Strings

Имя

Свойство или метод

Описание

Names
Values

Strings

ReadFromFile
WriteToFile

Свойство
Свойство
Свойство
Метод
Метод

Ключевое имя
Значение

Общая строка данных

Процедура чтения данных из файла
Процедура записи данных в файл

Табл. 22.1 в общих чертах представлена структура класса strings. Перечисленные

здесь свойства и методы образуют внешний интерфейс класса. Какой окажется прак-

тическая реализация — зависит от возможностей и желаний программиста (в данном

случае — моих).

Несколько советов по реализации класса

Приступая к проектированию класса, придерживайтесь такого правила: внешний

интерфейс должен быть настолько простым, насколько это возможно. Другая состав-

ляющая успеха — максимальное использование существующего кода. Такой код заве-

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

прошел тестирование и проверку временем. В результате новый класс окажется проще

в использовании и дешевле в сопровождении.

Теперь, используя данные, приведенные в табл. 22.1, можно составить "скелет"

искомого класса — просмотрите листинг

Листинг

 Определение членов внешнего интерфейса класса Strings

1: Option Compare Database

2 : Option Explicit

3: Public Property Get

 Index

 As

 Integer) As String

4:

402

Часть VIII. Объектно-ориентированное программирование в Access


background image

5: End Property

6:

7: Public Property Let

 Index As Integer,

 Name As_

String)

8:

9 : End Property

 Property Get

 Index As Integer) As String

 Property

 Property Let

 Index As Integer, ByVal Str

String)

16:

 Property

18:

 Property Get

 Name As String) As String

20:

 Property

22:

 Property Let

 Name As String, ByVal Value As_

String)

24:

 Property

 Sub

 As String)

28:

 Sub

30:

 Sub

 FileName As String)

32:

 Sub

В строках

 листинга 22.1 определяется

 внешний

 интерфейс класса

strings, поскольку все методы снабжены

 Public. Вы,

разумеется, уже обратили внимание, что сами методы еще не реализова-

ны и класс не содержит приватных членов. Вся оставшаяся часть работы

будет выполнена далее.

Расширение возможностей

существующих классов

Удачный способ построения нового класса заключается в расширении функцио-

нальных возможностей существующего. Если говорить о классе strings, отметим два

аспекта проблемы, требующих решения. Во-первых, нам необходима структура дан-

ных для хранения значений и, во-вторых, нужны способы файлового ввода-вывода

этих данных. Если ничего не помешает, решения непременно будут найдены.

Использование коллекции для хранения

данных ассоциативного массива

Класс Collection уже создан, и вполне пригоден для хранения символьной ин-

формации. Поэтому его можно рассматривать в качестве подходящей кандидатуры на
роль "хранилища" данных (строк, содержащих ключевое имя и значение) в классе

22-й час. Совершенствование типов данных 403


background image

Strings. Решив использовать класс Collection, следует предложить способы
"добычи" данных из него — в листинге 22.1 уже "заготовлены" определения соответ-

ствующих Property-методов. (Конечно, вместо коллекций можно было бы обратить-
ся к средствам построения массивов, но в последнем случае мы создали бы себе лиш-

ние хлопоты — зачем?)

Включение объекта существующего класса в состав нового называют

 агрегацией.

Чтобы воспользоваться возможностями коллекций в контексте проектируемого клас-

са, необходимо объявить переменную типа Collection и предусмотреть ее инициа-

лизацию, т.е. выполнение операции создания объекта класса Collection. В данном

случае переменная типа Collection будет объявлена как приватная. Для ее инициа-

лизации и очистки удобно воспользоваться средствамами стандартных обработчиков

событий Class_Initialize и

С учетом сказанного, код класса, знакомый по тексту листинга

 нетрудно на-

полнить новым содержанием. Результат представлен в листинге 22.2.

Листинг 22.2. Расширенный вариант кода класса Strings

1:

2:
3:
4:
5:
б:
7:

10
11
12
13
14
15

16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

33
34
35
36

Option Compare Database
Option Explicit
Option Base 1

Private FStrings As Collection

Public Property Get

 Index As Integer) As String

On Error GoTo EXCEPT
Names =

 1,

 Strings (Index) ,

 =

 - 1)

: Exit Property

: Call

 Property

 Property Let

 Index As Integer,

ByVal Name As String)

: On Error GoTo EXCEPT
:

 = Name &

 &

: Exit Property

: Call

 Property

 Property Get

 ) As Collection

: Strings = FStrings

 Property

 Property Get

 Name As String) As String

: Dim Index As Integer
: Index =
: If (Index > -1) Then
: Values =
: Values =

 - InStr(l, Values,

: Else
: Call

 &

 не найдено" )

: End If

 Property

404

Часть VIII. Объектно-ориентированное программирование в Access