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

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

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

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

Добавлен: 21.10.2020

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

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

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

ного тебе бутерброда" или "Легкие,

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

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

счет управления всеми деталями механизма автомобиля в момент экстренного тормо-
жения? Если бы такая задача была целиком возложена на человека, сидящего за ру-

лем, ни о какой экстренности не могло бы быть и речи.

Сокрытие информации (или сокрытие сложности) — безусловно, полезно и здоро-

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

Системы объектно-ориентированного программирования предоставляют в наше

распоряжение средства сокрытия сложных подробностей структуры объектов. Созда-
вая класс, вы как программист обязаны написать весь его код, т.е. предусмотреть оп-
ределение всех необходимых свойств и методов, которые позволят будущим объектам
правильно и эффективно решать возложенные на них задачи. А теперь о том, чего
следует избегать, — вы не должны требовать от потребителей интеллектуальной про-

дукции глубокого знания всех деталей внутренней организации класса. Некоторые де-
тали могут (и, вероятно, должны) быть скрыты от посторонних глаз.

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

ADODB и нам вовсе не мешало незнание каких-то особенностей его реализации. Соб-

ственно говоря, а зачем знать все тонкости? Нам как пользователям класса необходи-
мо и достаточно изучить доступные свойства и методы. Скажем, все, что следует сде-
лать для открытия набора данных Recordset, — это вызвать метод Open.

Приступая к созданию класса, имейте в виду следующее: вам, вероятно, придется

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

 вовсе нет нужды доподлин-

но знать или даже понимать, какие внутренние силы поддерживают на плаву все это
великолепие. Сокрытие некоторых деталей, несомненно, пойдет во благо, поскольку
облегчит задачу использования вашего класса — точно так же, как и любого другого, в
том числе стандартного. Ведь не задумываются же люди, изучающие программирова-
ние для Access, о том, как именно работает система?

Класс

 — это молекула объектно-ориентированного мира. В VBA класс представляет

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

 в то

время как файлы модулей классов обозначаются расширением .

 CLS.

В классе VBA допускаются две степени доступности его атрибутов. Первая обозна-

чается служебным словом Public, а вторая — Private. Перед объявлением свойства
или метода класса

 Private вы указываете, что это внутренний атри-

бут класса и пользователям не стоит о нем беспокоиться. Если объявления данных
или методов снабжены служебным словом Public, они входят в состав внешнего ин-
терфейса класса и предназначены для общего использования.

 Public

и Private в конструкциях объявлений членов класса указываются первыми.

Новый термин

Любой из атрибутов (свойство или метод) класса называется

 членом.

Данные и методы, определенные в составе класса, часто называют

 интерфейсом

класса.

 Если в начале конструкции объявления члена класса используется служебное

слово

 говорят, что такой член служит частью

 внешнего интерфейса.

 Если же

член класса объявлен с применением

 Private, он становится частью

внутреннего интерфейса

 класса.

Итак, словом

 вы указываете на объекты, предназначенные для всеобщего

обозрения, а атрибуты (свойства или методы), которые обозначены квалификатором

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

туп к его внутреннему интерфейсу. Если вы все-таки попытаетесь обратиться к приват-

 час. Основы программирования классов 385


background image

ному члену класса за пределами модуля класса, то получите сообщение об ошибке:
Method or data member not

 (метод или член-элемент данных не найден).

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

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

До появления и широкого распространения объектно-ориентированного подхода

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

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

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

 внимание на коде класса в целом, но при его ис-

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

В последующих разделах мы более конкретно поговорим о способах и особенно-

стях применения служебных слов Private и Public. Приведем еще несколько сове-

тов, которые могут оказаться полезными. Вы вправе пользоваться

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

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

Определение методов класса

Методы класса — это процедуры и функции. Они объявляются и строятся в преде-

лах модуля класса. Синтаксические правила обычны и ничем не отличаются от тех,

которыми мы руководствовались ранее. Изучите листинг 21.3.

Листинг 21.3. Расширенный вариант класса FirstClass

1 Option Compare Database
2 Option Base 0
3 Option Explicit
4

 LanguageType

5
6
7
8 End Enum
9 Public Sub

 )

10:

 ItDeutsch )

 Sub

 Sub

 )

 MsgBox

 Sub

 Sub

 )

16: MsgBox

 Sub

 Function

 Language As

 As String

 Select Case Language

386

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


background image

20:
21:
22:
23:
24:
25:
26:

Case

GetGreetingsText

Case

GetGreetingsText

Case

GetGreetingsText

End Select

"Buenos

 Function

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

I Тестовую процедуру листинга

 нетрудно приспособить и для провер-

I

 расширенной версии класса

 приведенной в листин-

ге 21.3. В классе теперь содержится перечислимый тип LanguageType.

В состав класса входят три общих метода: GreetingsEnglish, Greet-
ingsEspanol,

 а в его внутренний интерфейс вклю-

чена функция GetGreetingsText, компактно хранящая все литеральные
строки в одном месте и выбирающая нужную.

Пользователь объекта класса Firstciass не сможет вызвать метод
GetGreetingsText. Эта функция использует оператор Select Case

для выбора строки текста.

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

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

Например, можно изменить код трех методов внешнего интерфейса,

вызвав новый Private-метод, GetFastGreetingsText, и удалив метод
GetGreetingsText. Эффект воздействия такого рода изменений
ограничен рамками модуля класса. Члены внутреннего интерфейса
класса недоступны извне, поэтому их модификация или даже удаление
(если эти операции корректны сами по себе, в контексте модуля класса)
никак не скажутся на работоспособности других модулей.

Листинг 21.4 представляет более эффективный вариант реализации класса

Firstciass.

Листинг 21.4. Класс Firstciass - а может быть, вот так?

1: Option Compare Database
2 : Option Base 0
3 : Option Explicit

 LanguageType

5: ItTechnoid

 ItEspanol

7: ItDeutsch

 End Enum

9: Public Sub

 )

10:

 ItDeutsch

 Sub

 Sub

 )

21  час. Основы программирования классов

387


background image

13
14
15
16

18

19
20
21

 )

End Sub

Public Sub

 )

MsgBox

 )

End Sub

Private Function

 Language As

LanguageType) As String

GetFastGreetingsText = Array(

 "Buenos

End Function

Листинг 21.4 почти идентичен предыдущему, за исключением изменений

1 во внутренней функции класса — теперь она получила название Get-

FastGreetingsText. Параметр функции (значение Language перечис-

лимого типа LanguageType) выступает в роли индекса массива, позво-
ляющего заменить громоздкую управляющую структуру Select Case

. . . End Case простым и изящным выражением присваивания.

Итак, изменения, вносимые в скрытый интерфейс класса, не оказывают влияния

на внешний код.

Если же исправлениям подвергаются внешние методы класса, потребуется пере-

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

Когда создается код класса, вы являетесь производителем, а когда

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

Определение свойств класса

Данные — это то, с чем работает программа. Если информация содержит ошибки,

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

данные должны проверяться. Например, произвольная комбинация цифр не обязатель-

но дает в результате правильную дату,

 не может быть значением возраста, а 1000 —

числом одновременно продаваемых акций компании Microsoft. Эти примеры элементов
данных верны далеко не во всех случаях; поэтому информация подлежит проверке.

На первых порах для проверки данных использовались функции. К несчастью, та-

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

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

Решение пришло — в виде концепции

 свойств

 и

 методов Property.

 Свойства ис-

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

ской проверки корректности данных.

Методы Property обладают собственным уникальным синтаксисом. Один из двух

методов используется для чтения значений соответствующего свойства, а другой — для
их записи. Листинг 21.5 представляет пример нового класса, в котором определены два
свойства, Name и EmailAddress, и соответствующие им пары методов Property.

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


background image

Листинг 21.5. Пример класса Contact, содержащего определения методов Property

Option Compare Database
Option Explicit
Private FName As String
Private

 As String

5 Property Get

 ) As String

6 Name = FName

7 End Property

Property Let

 Value As String )

FName = Value

 Property

 Get

 ) As String

 EmailAddress = FEmailAddress

 Property

 Sub

 ByVal MESSAGE As String )

15: Call

 "Contact", Message)

 Sub

 Sub

 EmailAddress As String)

18: Const Message = "Неверный почтовый адрес"
19: If (InStr( 1, EmailAddress,

 ) = 0) Then

 &

 Sub

 Let

 ByVal Value As String )

2 2 : Call

 Value )

23: FEmailAddress

 Value

 Property

Напомним: чтобы создать класс Contact, код которого приведен в лис-

 21.5, следует открыть окно редактора Microsoft Visual Basic и вы-

брать в меню команду

 Module. Строки 3 и 4 содержат объяв-

ления свойств класса — переменных FName и FEmailAddress типа

String. Они снабжены

 Private, чтобы исключить воз-

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

лям класса альтернативный вариант — методы Property.

В строках

 размещен текст Property-метода Get для свойства FName. Предпо-

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

 Когда она употреб-

ляется в качестве правостороннего операнда, вызывается Property-метод Get Name и

срабатывает строка кода 6. Строки

 определяют код метода записи, Let. Метод

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

 = "Noah

Приведенные строки выглядят как обычные обращения к переменной, предпола-

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

Property-методы, Let и Get. Все, как и ранее, удобно, к тому же, может быть прове-

дена автоматическая проверка данных.

В строках 11-13 и

 содержатся методы Get и Let, обеспечивающие доступ к

свойству FEmailAddress. (Обратите внимание, что синтаксис аналогичен рассмотрен-
ному выше. Property-метод Get оформляется в виде функции, возвращающей значе-

21-й час. Основы программирования классов

389