Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Управление и оптимизация / Osnovi informatsionnikh i komputernikh tekhnologiy 2011

.pdf
Скачиваний:
50
Добавлен:
02.09.2019
Размер:
2.13 Mб
Скачать

ТЕХНОЛОГИИ ПРОГРАММИРОВАНИЯ. ПРОГРАММИРОВАНИЕ В СРЕДЕ DELPHI

Основные принципы ООП

Парадигма объектно-ориентированного программирования является одной из самых распространенных в настоящее время. Основным элементом является объект – совокупность данных и способов работы с ними.

В основу ООП положены следующие принципы:

абстрагирование,

ограничение доступа,

модульность,

иерархичность,

типизация,

параллелизм,

устойчивость.

Рассмотрим, что представляет собой каждый принцип.

Абстракция - совокупность характеристик некоторого объекта, отражающих его сущность и которые позволяют отличить его от всех других видов объектов. Таким образом, абстракция четко определяет особенности объекта с точки зрения дальнейшего рассмотрения и анализа. Современный уровень абстракции предполагает объединение всех свойств абстракции (как касающихся состояния анализируемого объекта, так и определяющих его поведение) в единую программную единицу некий абстрактный тип (класс). Таким образом, можно дать следующее понятие класса. Это совокупность объектов, которые имеют одинаковый набор свойств и обладают одинаковым поведением. Понятие класса является ключевым понятием ООП. Индивидуальные объекты называются экземплярами класса, а класс в ООП – это шаблон по которому строятся объекты.

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

интерфейс - совокупность доступных извне элементов описания объекта (основные характеристики состояния и поведения) – внешние поведение всех объектов данного класса;

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

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

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

121

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

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

Иерархия наследования означает отношение при котором один класс (подкласс) использует структурную или функциональную часть одного или нескольких других классов. Этот тип иерархии можно назвать «общеечастное». Используется, когда сложные классы строятся на базе более простых путем добавления к ним новых характеристик и, возможно, уточнения имеющихся. Агрегирование означает, что объект состоит из подобъектов – «целое-часть». Этот вариант иерархии используется в процессе разбиения системы на разных этапах проектирования.

Один из важнейших механизмов ООП - наследование свойств, в иерархии общее/частное. Наследование - такое соотношение между объектами, когда один из них использует структурную или функциональную часть другого или нескольких других объектов (соответственно простое и множественное наследование).

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

Использование данного принципа позволяет:

на этапе компиляции программы обнаружить ошибки, связанные с недопустимыми операциями над программными объектами;

упрощение документирования;

возможность генерации более эффективного кода.

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

Устойчивость - свойство объектов существовать во времени независимо от процесса, его породившего.

Различают следующие объекты, которые обладают различной степенью устойчивости:

122

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

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

глобальные объекты, существующие, пока программа загружена в память;

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

Все указанные выше принципы в той или иной степени реализованы в

различных версиях объектно-ориентированных языков.

Три основных компонента ООП

Наследование, инкапсуляция, полиморфизм – три основных компонента объектно-ориентированного программирования.

Наследование: любой класс может быть порожден от другого класса. Базовый класс (родительский) – класс, который «передает» свойства, наследующий класс (потомок) – класс, который их «принимает». Наследующий класс получает доступ ко всем полям, методам и свойствам базового класса. Принцип наследования позволяет создать новый класс, который наследует свойства и методы родителя. Выделяют простое и множественное наследование. При множественном наследовании у потомка может быть более одного предка.

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

Инкапсуляция. Инкапсуляция это механизм, который объединяет данные и код в единое целое – объект, манипулирующий этими данными, т.е. это единство трех сущностей: полей, методов и свойств.

Структура программы. Основные команды

Delphi – среда визуального программирования. Визуальное программирование базируется на объектно-ориентированной технологии. Структурной единицей визуального программирования, основным «строительным элементом» для программы является компонент.

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

123

называется экземпляр класса. Например, тип Kursant – это класс, а курсант Иванов – конкретный объект, экземпляр класса.

Как и любой класс, компонент характеризуется полями, свойствами и методами. В Delphi вместо полей обычно используются свойства. Свойство – это разновидность поля класса, обращение к которому автоматически приводит к вызову метода чтения/записи поля. В объектно-ориентированном программировании хорошим стилем считается обращение к полям только через методы.

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

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

Формой называется визуальный компонент, имеющий свойства окна Windows (или просто окно Windows). На форме размещаются другие визуальные компоненты – кнопки, строки редактирования и др. Форм в приложении может быть несколько. Одна из них – главная. Закрытие главной формы означает завершение программы.

Каждая форма представлена двумя файлами - файлом визуального описания формы (бинарный файл с расширением .dfm) и модулем с исходным текстом на языке Pascal (текстовый файл с расширением .pas), содержащим обработчики событий для компонентов этой формы.

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

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

Главное меню. Напоминает главное меню c некоторыми изменениями и дополнениями, типичными для Windows-программ.

Панель инструментов. Содержит кнопки «быстрого доступа», дублирующие некоторые часто используемые команды меню.

Палитра компонентов. Содержит пиктограммы, представляющие компоненты Delphi. Палитра для удобства разделена на несколько страниц с закладками: Standard, Additional и др. Для размещения представленных компонентов на форме необходимо «щелкнуть мышью» на пиктограмме и затем «щелкнуть мышью» в нужном месте формы.

Окно формы. Здесь надо разместить используемые программой визуальные и невизуальные компоненты.

124

Окно редактирования модуля. Содержит тексты модулей, связанных с формами. Модули для разных форм находятся на отдельных страницах с закладками. Переключиться из окна редактирования в окно соответствующей формы и обратно можно с помощью клавиши <F12>.

Инспектор объектов. С его помощью можно устанавливать значения свойств компонентов и задавать их реакцию на стандартные события. Состоит из двух страниц. На первой странице (Properties) приведен список свойств компонентов, на второй (Events) приведен список событий, на которые компонент может реагировать. Свойства и события указываются всегда для выделенного компонента на форме. Компонент выделяется щелчком мыши, при этом появляется характерное обрамление.

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

125

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

Типичная головная программа приложения имеет вид: program Projectl;

uses Forms,

Unit1 in 'Unit1.pas' {Form1},

Unit2 in 'Unit2,pas' {Form2}; {$R *.RES}

{Здесь вы можете поместить описания констант, переменных, функций,

процедур. Все это будет доступно только в пределах данного файла} begin

Application.Initialize; Application.CreateForm(Tform1, Form1); Application.CreateForm(TForm2, Form2); Application.Run;

end.

Начинается программа с ключевого слова program, после которого пишется имя программы. Оно совпадает с именем файла, в которым вы сохранили свой проект. Это же имя присваивается выполняемому файлу приложения. По умолчанию это имя Project1.

После заголовка в тексте программы располагается предложение uses. В этом предложении перечисляются модули, загружаемые программой. Первый модуль Forms — системный. А следующие — модули разработанных вами форм. Данный пример подразумевает, что вы создали в проекте две формы с именами Form1 и Form2 в модулях с именами Unit1 и Unit2. Помещенные в фигурные скобки названия форм — это комментарии.

Следующая строка текста — {$R *.BES} представляет собой директиву компилятора. Затем после ключевого слова begin и до последнего завершающего программу оператора end с точкой (end.) записано тело программы.

Первый оператор в теле программы инициализирует приложение, два следующих — создают объекты форм Form1 и Form2, последний — начинает выполнение приложения.

Этапы создания программы

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

Процесс создания любого Windows-приложения на Delphi включает в себя следующие этапы.

126

1. Создание эскиза формы. На форме размещаются необходимые визуальные и невизуальные компоненты. Соответствующие форме модули

.pas и .dfm Delphi генерирует самостоятельно. Для каждого размещенного компонента Delphi заносит в описание класса формы поля, содержащие указатели на объекты-экземпляры компонентов. Экземпляры компонентов будут созданы в памяти во время выполнения программы методомконструктором формы. (Все переменные объектового типа в Delphi являются динамическими, т.е. представляют собой указатели. Однако для упрощения программирования Delphi «скрывает» этот факт, обозначая и указатели, и созданные экземпляры одинаково, без применения символа ^.)

По умолчанию имена экземпляров отличаются от названия класса цифрой: класс TButton – объекты Button1, Button2 и т.д. На палитре компонентов буква T в названии компонента опущена, хотя в описании класса компонента она обязательна.

2.Установка значений свойств размещенных компонентов, таких как размер, цвет, надписи, содержание и т.д.

Изменение свойств происходит чаще всего с помощью инспектора объектов. Размеры и местоположение компонентов можно изменить мышью (методом перетаскивания), а удалить выделенный компонент - нажатием клавиши <Delete>. Все свойства можно также установить программно с помощью оператора присваивания.

Различайте свойства Name и Caption. Name – это идентификатор объекта в программе, а Caption – визуальный текст или заголовок на объекте. Поэтому далее, говоря «создайте кнопку Button1 с надписью Старт», мы будем подразумевать «разместите на форме компонент TButton и присвойте его свойству Name значение Button1 и свойству Caption значение Старт». Заметим, что в инспекторе объектов при вводе строк кавычки не указываются.

3.Указание реакций компонентов на действия пользователя или другие события в системе. Например, что программа должна делать, если пользователь нажал на кнопку с надписью Exit. Этот этап требует уже программирования.

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

сэтим компонентом. В Delphi термин «событие» трактуется двузначно. Первая трактовка (событие в среде Windows) соответствует названию. Кроме того используется понятие события компонента. Событием компонента называется его свойство процедурного типа, которому надо присвоить адрес метода, вызываемого для обработки соответствующего события Windows. Назначение события компонента можно понять по его названию: OnClick (щелчок мышью), OnDblClick (двойной щелчок), OnKeyPress (нажатие клавиши) и т.д. Чтобы сопоставить событию его метод-обработчик, необходимо два раза щелкнуть мышью в инспекторе объектов на странице Events по пустому полю рядом с названием события. При этом Delphi

127

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

Названия обработчиков событий строятся по определенным правилам: приставка On заменяется именем (значением свойства Name) компонента- «соучастника» события, с указанием класса текущей формы, например, для события OnClick щелчка по кнопке Button1 название будет иметь вид: procedure TForm1.Button1Click. Таким образом, в названии обработчика зафиксировано как название события, так и имя объекта, на котором оно произошло.

Для каждого компонента имеется так называемое событие по умолчанию. Например, для Button – это OnClick. Если дважды щелкнуть по объекту, Delphi создаст заготовку обработчика такого события.

Итак, весь код программы оказывается, сосредоточен в обработчиках событий. Разумеется, эти обработчики могут вызывать и другие, независимые процедуры, в том числе, хранящиеся в других, традиционных модулях, а также «чужие» обработчики событий. По сравнению с большинством программ для MS-DOS, программы для Windows имеют иную, «параллельную» структуру. Не вдаваясь в детали, ее можно представить как цикл ожидания событий, внутри которого события анализируются и вызывается соответствующий обработчик:

case событие of

событие 1: Обработчик 1; событие 2: Обработчик 2;

. . .

событие N: Обработчик N;

end;

Delphi скрывает от программиста эту структуру, оставляя ему лишь написание обработчиков. «Функциональность», т.е. алгоритм расчетов для прикладной задачи, также размещается в обработчике события. Выбор события, которое должно инициировать расчеты, остается за программистом. Например, это может быть двойной щелчок по форме, щелчок по кнопке «Старт» и т.п.

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

Программы и модули

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

Паскаль использует модули, чтобы создать библиотечные модули многократного пользования. Модуль – поставщик констант, типов данных, переменных и процедур. Модуль дает возможность разработчику программного обеспечения создавать большие программы, которые могут легко компоноваться и модифицироваться. Модуль Паскаля имеет заголовок

128

unit, за которым следуют три части: интерфейс (interface), блок реализации (implementation) и блок инициализации. Заголовок модуля определяет имя модуля, которое появляется в операторе uses других модулей и программ. Часть интерфейса сообщает компилятору, какая часть модуля является доступной для клиентов модуля (то есть для других модулей и программ). Все, что помещается непосредственно в раздел interface (типы, переменные, константы, функции, процедуры), может быть использовано другими модулями программы. Все, что помещается в раздел implementation — внутреннее дело модуля. Внешние модули не могут видеть типы, переменные, константы, функции и процедуры, размещенные в разделе реализации.

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

Общий синтаксис модуля: unit Unitl;

interface // Открытый интерфейс модуля (Список подключаемых модулей) uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

{Объявление класса формы} type

TForml = class(TForm) private // Закрытый раздел класса { Private declarations }

{Сюда могут помещаться объявления переменных, функций и процедур, включаемых в класс формы, но не доступных для других модулей}

public // Открытый раздел класса { Public declarations }

{Сюда могут помещаться объявления переменных, функций и процедур, включаемых в класс формы и доступных для других модулей)

end; var

Forml: TForml;

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

implementation // Реализация модуля {$R *.DFM}

{Сюда могут помещаться предложения uses, объявления типов, констант, переменных, к которым не будет доступа из других модулей. Тут же должны быть реализации всех объявленных в разделе interface функций и процедур, а также могут быть реализации любых дополнительных, не объявленных ранее функций и процедур}

end.

Модуль начинается с ключевого слова unit, после которого пишется имя модуля. Оно совпадает с именем файла, в котором вы сохранили свой

129

модуль. По умолчанию для первого модуля имя равно Unit1, для второго

Unit2 — и т.д.

Вразделе interface после предложения uses, содержащего список подключаемых модулей, вы можете видеть заготовку объявления класса вашей формы, подготовленную Delphi. Имя класса вашей формы — TForml. Класс содержит два раздела: private — закрытый раздел класса, и public — открытый раздел класса. То, что вы или Delphi объявите в разделе public, будет доступно для других классов и модулей. То, что объявлено в разделе private, доступно только в пределах данного модуля.

После завершения объявления класса формы вы можете видеть строки var

Forml: TForml;

Это объявляется переменная Forml класса TForml, т.е. объявляется ваша форма как объект класса TForml.

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

Вмодуль вы можете ввести еще два раздела, кроме interface и implementation: разделы initialization и finalization.

Доступ к свойствам и методам объектов

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

<имя объекта>.<имя свойства> После имени объекта пишется без пробела символ точки, а затем также

без пробела пишется имя свойства. Например, ссылка на свойство Caption метки Label1 осуществляется записью Label1.Caption.

Иногда свойство объекта является, в свою очередь объектом. Тогда в обращении к этому свойству указывается через точки вся цепочка предшествующих объектов. Например, метки имеют свойство Font — шрифт, которое в свою очередь является объектом. У этого объекта имеется множество свойств, в частности свойство Color — цвет шрифта. Чтобы, сослаться на цвет шрифта метки Label1, надо написать Label1.Font.Color. Это означает: свойство Color объекта Font, принадлежащего объекту Label1.

Аналогичная нотация с точкой используется и для доступа к методам объекта.

Области видимости переменных и функций

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

130