Объектно-ориентированный подход к созданию программных средств☛Уроки программирования ✎ |
Организация программы и базовые понятия языка Visual Basict
Одно из преимуществ современных объектно-ориентированных языков программирования состоит в том, что они позволяют применять гибридный (смешанный) стиль программирования, т.е. выбирать соответствующий стиль программирования в зависимости от специфики предметной области, задачи, которую нужно решить, и от квалификации и опыта специалистов .
Характерной чертой систем программирования на Visual Basic является обеспечение возможностей для многоуровневой структурированности программного продукта. Важность этого трудно переоценить, поскольку разделение сложной задачи на несколько более простых - основной метод решения сложных проблем.
Для того чтобы уменьшить сложность программы, ее прежде надо разделить на определенное множество относительно небольших, в значительной степени независимых частей - модулей. Действительно высокой степени независимости этих частей программы можно достичь с помощью двух методов оптимизации структуры программы: усилением внутренних связей в каждом модуле и ослаблением взаимосвязей между модулями. Именно поэтому в одном модуле следует размещать лишь те функции, которые объединяются единой темой, единым функциональной направленностью или общими данными.
Мерой внутренних связей является прочность модуля. Наиболее «сильными» является информационно прочные модули. В информационно прочном модуле определяется представления данных и операции над ними. Наиболее характерной чертой информационно прочного модуля является то, что все реализованные в нем процедуры обработки данных работают с одними и теми же данными. Модуль этого типа может рассматриваться как физическое объединение нескольких процедур обработки данных с целью «сокрытия информации», за счет ограничения доступа к данным, локализованных в модуле. При выполнении определенной дисциплины программирования это позволяет реализовать концепцию сокрытия и абстракции данных.
Программный проект на Visual Basic может состоять из совокупности нескольких типов модулей, а именно:
• модулей, связанных с объектами (так называемые объектные модули), которые являются частью среды разработки программы на языке Visual Basic. В этих модулях определяется реакция объектов на определенные события;
• программных модулей, создаваемых программистом для определения переменных и процедур (так называемые стандартные модули);
• модулей классов, создаваемых программистом.
Основное назначение модулей первого типа заключается в том, что они содержат код, который определяет реакцию соответствующих объектов на события, связанные с действиями пользователя.
Стандартный модуль - это средство реализации традиционного функционального подхода к программированию на Visual Basic. При применении гибридного стиля программирования такие модули зачастую используются для определения переменных, процедур и функций, доступных всем проекта.
Модуль класса - это средство реализации объектно-ориентированного программирования на Visual Basic, позволяющий создавать новые классы объектов. Каждый модуль класса объединяет определенные данные и операции, которые могут выполняться над этими данными, в единое целое. Другими словами, модуль класса - это средство реализации на Visual Basic одной из характерных особенностей любой объектно-ориентированного языка программирования - инкапсуляции данных и операций с данными.
Программы на Visual Basic разрабатываются или в интегрированной среде системы программирования Visual Basic (Integrated Design Environment - IDE), или в окне проекта соответствующего документа MS Office.
В IDE добавить новый стандартный модуль или присоединить к проекту ранее созданный модуль можно следующим образом:
• В окне конструктора проекта выполняется команда Prodject / Add Module.
• В окне диалога Add Module нужно перейти на вкладку New, если создается новый модуль, или на вкладку Existing, если к проекту желательно присоединить модуль уже существует.
• Для создания нового модуля на вкладке New выбирается значок Module, а для включения существующего модуля на вкладке Existing выбирается папка, содержащая файл, и сам файл.
• Нажимается кнопка Open.
• Для предоставления модуля имени надо перейти в окно Propertes - <Имя модуля>, на вкладке Alphabetic изменить свойство модуля Name.
• Прилагается необходимый программный код.
• Выполняется команда File / Save <Имя модуля> для сохранения модуля.
Так же добавляются модули классов:
• В окне конструктора проекта выполняется команда Prodject / Add Class Module.
• В окне диалога Add Class Module на вкладке New выбирается значок Class Module и нажимается кнопка Open. В окне Project - <Имя проекта> появится новая папка Class Module (если в этом проекте классы пользователя еще не создавались), в которую автоматически будет добавлен класс Class1.
• На экране Propertes - Class1 на вкладке Alphabetic изменить свойство модуля Name, которая будет определять имя класса.
• Прилагается необходимый программный код, определяющий создан класс.
• Выполняется команда File / Save <Имя класса> для сохранения модуля.
Чтобы удалить модуль, надо правой кнопкой мыши щелкнуть по нему в окне Project - <Имя проекта> и в контекстном меню выбрать команду Remove <Имя модуля>.
При программировании в MS Office добавления и включения модулей в окне проекта документа (переход в него выполняется командой Сервис / Макрос / Редактор Visual Basic) вместо меню Project (которого в окне проекта документа нет) используется меню Insert. Все остальное делается аналогично.
Каждый модуль может иметь до двух секций - секция общих объявлений и секцию методов модуля.
Секция общих объявлений (General Declaration) находится в верхней части модуля. Она предназначена для размещения кода, влияет на весь модуль. В табл. 1.1 приведены те операторы, которые могут находиться в этой секции модулей.
Стоит обратить внимание на команду Option Explicit. Дело в том, что для того, чтобы облегчить использование языка Visual Basic начинающими, в ней не введено обязательное декларирование данных. Но при разработке сложных программ это может привести к возникновению ошибок, которые довольно трудно найти. Поэтому одно из требований «хорошего» стиля программирования на языке Visual Basic - это обязательное использование опции Option Explicit.
Под секцией общих объявлений (ее может и не быть) модуля могут находиться определения процедур. Эта часть модуля создает секцию методов модуля.
Процедура - это программная единица языка Visual Basic, состоящий из определения ее локальных данных и операторов, которые могут манипулировать локальными данными этой процедуры, локальными данными модуля, в который входит эта процедура, и любыми глобальными данными или объектами.
В квадратные скобки взяты ключевые слова и аргументы, которые не являются обязательными.
Каждая процедура может быть определена как Private или Public. Процедуры Private могут вызываться только процедурами, расположенными в данном модуле. Процедуры Public в объектных модулях и модулях классов становятся методами объектов. Определение процедуры как Static означает, что значение локальных переменных процедуры, если они есть, не будут меняться между вызовами процедуры.
Хотя процедуры-свойства можно использовать и в стандартных модулях (для манипулирования значениями переменных с одновременным выполнением некоторой обработки данных), основное их назначение - это чтение и установка свойств объектов, т.е. они обычно входят в состав модулей классов.
Создание и использование объектов в Visual Basic
Каждый модуль класса выполняет роль проекта (шаблона) для объектов определенного типа. Иными словами, каждый модуль класса определяет один тип объектов, нужное количество которых создается во время выполнения программы через создание экземпляров класса.
В теле каждого модуля класса определяются некоторые или все его характеристики, к которым относятся:
• свойства (Propertes);
• методы (Methods);
• события (Events).
Свойства класса. Одна (обязательно) свойство класса определяется при создании модуля класса. Это имя модуля класса, а значит, и имя класса. Для создания других свойств класса, значения которых будут характеризовать каждый объект этого типа - экземпляры класса, применяются два способа. Первый из них заключается в создании глобальных (public) переменных в секции общих объявлений. Второй, более сложный и действенный, - это создание закрытых свойств, доступ к которым приобретается с помощью процедур свойств (property procedure), которые автоматически активизируются при каждой смене значений свойств или обращении к свойствам.
Создание свойств класса с помощью глобальных (общедоступных) переменных приводит к появлению открытых свойств. При работе с объектом до сих свойств есть прямой доступ как при чтении, так и при записи значения свойства. Но такая свобода обращения с свойством часто недопустима. Вот полный перечень возможных стратегий при работе со свойствами:
• чтение и запись (Read-Write);
• чтение, запись при первом обращении (Read, Write-once);
• только чтение (Read-only);
• только записи (Write-only);
• ни чтения, ни записи (Not Read - Not Write).
Открытые свойства позволяют реализовать лишь первую стратегию. Для реализации других требуются дополнительные возможности. Такие возможности дает использование специальных процедур-свойств:
• Property Let позволяет установить новое значение свойства, выполняя операцию Write (присвоение).
• Property Set дополняет предыдущую процедуру, позволяя присвоить объектной переменной (свойства) ссылка на определенный объект.
• Property Get позволяет прочитать значение свойства, выполняя операцию Read.
При реализации первой стратегии (Read - Write) каждая открытая свойство должно иметь пару процедур-свойств Get и Let (Set), которым дается одинаковое имя (это имя является и именем свойства).
Для создания процедур-свойств можно использовать пустые заготовки, автоматически. При работе в IDE они вставляются в модуль командой Tools / Add Procedure, а в окне проекта документа MS Office - командой Insert / Procedure. После этого они заполняются нужным кодом.
В следующем фрагменте кода модуля класса Клиент показано процедуры-свойства, при выполнении которых записывается (заглавные) и возвращается текстовое значение свойства Фамилия:
Private msПризв As String
Public Property Let Фамилия (ПризвищеКл As String)
msПризв = Ucase (ПризвищеКл)
End Property
Public Property Get Фамилия ()
Фамилия = msПризв
End Property
При реализации стратегии Read, Write-once необходимо, чтобы значение свойства было записано только при первом обращении, а после этого - не менялось. В этом случае процедура-свойство Let (Set) должна выполнять проверку, не делалось присвоении свойства какого значения. Например:
Public Property Let Фамилия (Значение As String)
If msПризв = "" Then msПризв = Ucase (Значение)
End Property
Если свойство является переменной типа Variant, то проверить, было предоставлено (присвоено) какое значение этой переменной, можно с помощью функции IsEmpty:
If IsEmpty (<имя переменной>) Then ...,
которая возвращает значение True или False.
Для проверки объектной переменной можно применить оператор Is и ключевое слово Nothing:
If <имя объектной переменной> Is Nothing Then ...
Поскольку объектные переменные до первого присвоения ссылка на объект имеют значение Nothing, то в этом случае результатом применения оператора Is будет значение True, иначе - False.
При реализации стратегии Read-only или Write-only используется только одна из трех процедур: Get, Let и Set. Для Read-only - это Get, а для Write-only - это Let или Set.
Последнее стратегия полностью закрывает доступ к свойству и процедуры-свойства вообще не записываются.
Стоит отметить, что в случае, когда свойство имеет тип Variant, ее значением могут быть как обычные данные (числа, текст), так и объекты. В этом случае для присвоения ей значения это свойство должно иметь как процедуру Let, так и процедуру Set. Эти процедуры должны иметь одинаковое количество параметров и у них должно быть по крайней мере один параметр, который представляет собой значение, которое присваивается свойства. Этот параметр должен всегда быть последним в списке параметров.
Вторая особенность, на которую надо обратить внимание, это то, что два способа создания свойства (с помощью переменной public и с помощью процедуры property) можно применять только при реализации первой стратегии. При этом возникает вопрос о преимуществах и недостатках каждого из этих способов. Первый способ (глобальные переменные) более быстродействующий (если его можно использовать), однако второй - универсальный, поскольку позволяет при чтении или записи значения свойства выполнять дополнительную обработку данных. Установка и получение значения свойства выполняется независимо от способа создания их. В следующем примере используются два объекта - экземпляра класса Клиент и устанавливается (записывается) и возвращается (читается) их свойство Фамилия:
Dim ПопереднийЗамовник As New Клиент
Dim ПоточнийЗамовник As New Клиент
'Запись (присвоение) значений свойств:
ПопереднийЗамовник.Фамилия = "Сумина"
ПоточнийЗамовник.Фамилия = "Мищук"
'Чтение значений свойств:
MsgBox ПопереднийЗамовник.Фамилия
MsgBox ПоточнийЗамовник.Фамилия
'Чтение и присвоение значения свойства:
ПопереднийЗамовник.Фамилия =
ПоточнийЗамовник.Фамилия
'Чтение новое значение свойства:
MsgBox ПопереднийЗамовник.Фамилия
Этот пример показывает два отличия модуля класса от стандартного модуля:
• модуль класса используется как шаблон для создания объекта (экземпляра класса);
• можно создавать несколько экземпляров одного класса.
Для того чтобы можно было создать объект, его имя (объектная переменная) должно быть задекларировано (объявлен). Объектная переменная нужна для того, чтобы можно было обращаться к объекту, который размещается в некотором месте оперативной памяти. Но для этого эта переменная, имеет фиксированную длину в 4 байта, должен содержать адрес размещения объекта в памяти. В отличие от обычных переменных при откровении объектной переменной память самого объекта может и не выделяться. В таком случае объектная переменная не может ссылаться на конкретный объект, но все равно она будет иметь конкретное значение, а именно - Nothing (ничего).
Существует два способа объявления объектных переменных. Первый был использован в предыдущем примере. Он заключается в декларировании с применением ключевого слова New:
Dim <имя объектной переменной> As New <имя класса>
Этот способ объявления объектной переменной гарантирует, что если при обращении к объекту будет обнаружено, что он не существует, то он автоматически будет создан (в предыдущем примере такими первыми обращениями к объектам были операторы присвоения значения свойства Фамилия этих объектов). Следует иметь в виду, что каждый раз, когда в программе делается обращение к такой переменной, делается проверка, существует ли соответствующий объект. А значит, при каждом обращении к такому объекту тратится дополнительное время на выполнение такой проверки.
Альтернативный способ заключается в том, что сначала объявляется объектная переменная, принадлежащая к нужному классу, а затем используется оператор Set для связывания этой переменной с объектом. Команда декларирования объектной переменной обычный синтаксис:
Dim <имя объектной переменной> As <имя класса>
При выполнении команды создается объектная переменная соответствующего типа и ей присваивается значение Nothing. Для назначения объектной переменной ссылку на конкретный объект необходимо выполнить оператор Set в одной из следующих форм:
Set <имя объектной переменной> = New <имя класса>
Set <имя объектной переменной> = <идентификатор объекта>
При наличии в операторе Set ключевого слова New выполнения оператора ведет к созданию нового объекта указанного типа и присвоение объектной переменной ссылку на этот объект.
Вторая форма оператора Set применяется для присвоения ссылки на уже существующий объект. Естественно, что такая форма оператора Set можно применять только тогда, когда объект, идентификатор которого используется в команде, уже существует как объект соответствующего класса. Например:
Dim ПопереднийЗамовник As Клиент
Dim ПоточнийЗамовник As Клиент
Set ПоточнийЗамовник = New Клиент
Set ПопереднийЗамовник = ПоточнийЗамовник
ПоточнийЗамовник.Фамилия = "Сумина"
MsgBox ПопереднийЗамовник.Фамилия 'Выводит значение
'Сумина
Set ПоточнийЗамовник = Nothing
MsgBox ПопереднийЗамовник.Фамилия 'Выводит значение
'Сумина
Стоит обратить внимание на то, что в этом примере после выполнения команды Set ПопереднийЗамовник = ПоточнийЗамовник две переменные ссылаются на один и тот же объект и поэтому к этому объекту можно обращаться, используя имя любой из этих переменных - как ПопереднийЗамовник, так и ПоточнийЗамовник.
После выполнения команды Set ПоточнийЗамовник = Nothing объектной переменной ПоточнийЗамовник присваивается значение Nothing и она перестает ссылаться на любой объект, но объект, на который она перед этим ссылалась, можно продолжать обращаться по имени ПопереднийЗамовник. Если бы переменная ПоточнийЗамовник была единственной переменной, связанной с объектом, на который она ссылалась, то присвоение ей значение Nothing привело бы к выгрузке этого объекта из памяти и появления стандартной события Class_Terminate.
Продолжение статьи: ч.1 Продолжение статьи: ч.2 Продолжение статьи: ч.3 Продолжение статьи: ч.4 Продолжение статьи: ч.5 Продолжение статьи: ч.6 Продолжение статьи: ч.7 Продолжение статьи: ч.8 Продолжение статьи: ч.9 Продолжение статьи: ч.10 Продолжение статьи: ч.11 Продолжение статьи: ч.12 Продолжение статьи: ч.13
Другие материалы по теме:
- Информационная модель- Разработка программного продукта. Этапы проектирования и построение модели
- Технология intranet
- Язык программирования Паскаль
- Классификация case-средств
