Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Объектно-ориентированное программирование.PDF
Скачиваний:
208
Добавлен:
01.05.2014
Размер:
3.64 Mб
Скачать

converted to PDF by BoJIoc

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

Упражнения

1.Опишите роль наследования и отложенных методов в среде разработки. Возможно ли создание среды для языка программирования, не являющегося объектно- ориентированным?

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

3.Можете ли вы привести другие примеры схемы типа «посредник»?

4.Объясните, почему инкапсуляция становится более полезной в схеме

«посетитель», если проход дерева осуществляется структурой данных (деревом), а не клиентом?

5. Объясните, каким образом в языке программирования без строгого контроля типа данных (например, Smalltalk) для выполнения арифметических действий с операндами смешанного типа может быть использована техника двойной диспетчеризации. Как, в частности, сложить два числа, каждое из которых может быть как целым, так и вещественным?

Глава 19

Учебный пример: среда разработки

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

наиболее часто среды разработки используются при создании графических интерфейсов пользователя. Действительно, в большей степени популярность объектно- ориентированных техник можно отнести за счет успеха сред типа GUI (Graphics User Interface — графический интерфейс пользователя).

В этой главе мы рассмотрим очень простую среду разработки Малую Среду Разработки

LAF (LAF — Little Application Framework). Она сознательно сделана гораздо проще, чем большинство коммерческих сред, поскольку рассчитана только на объяснение концепции среды разработки. LAF в целом содержит менее дюжины классов, в то время как в большинстве коммерческих сред их более сотни. Несмотря на это, среда LAF вполне закончена и демонстрирует большинство важных концепций, необходимых для понимания средств разработки графических приложений.

Среда LAF была создана с учетом требований переносимости на различные платформы. В то время как детали реализации могут сильно различаться, интерфейс LAF для различных платформ остается постоянным. Существуют версии среды LAF для Macintosh, PC и UNIX- систем.

19.1. Компоненты GUI

Среда LAF поддерживает следующие компоненты GUI: единственное окно, меню, кнопки, текстовые поля, работу с мышью и клавиатурой.

converted to PDF by BoJIoc

Основной способ, посредством которого программист задает конкретный вид элемента управления (кнопки, меню, окна), — это наследование. Так, существует общий класс кнопок button, из которого порождаются подклассы, то есть кнопки конкретного типа. То же самое справедливо для меню, пунктов меню и окон.

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

19.2. Выполнение, управляемое событиями

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

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

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

program main; begin

initialize application; while not finished do begin

if user has done something interesting then respond to it

end;

clean up application; end

«Интересные вещи», которые делает пользователь, называются событиями. Поскольку поток управления диктуется последовательностью событий, это называется выполнением, управляемым событиями. Не все события должны соответствовать действиям пользователя. Например, такие действия, как появление дискеты в дисководе, могут вызвать последовательность событий, генерируемых изнутри программы. Программа отреагирует на них таким же образом, как и на события, вызванные пользователем.

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

подклассов из классов такой библиотеки и переопределения некоторых методов мы добавляем «рабочую» часть приложения без необходимости переписывать «управляющие» разделы. Это в точности то, что делается средой разработки GUI- приложений.

Стив Барбек из фирмы Арple описал типичную библиотеку, используемую для построения управляемого событиями приложения, как «библиотеку наизнанку» [Wilson, 1990]. В

converted to PDF by BoJIoc

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

19.3. Настройка через наследование

Основное средство, посредством которого среда разработки настраивается на создание новой программы, — это наследование. Среда предоставляет один или несколько абстрактных надклассов, которые будут переопределены программистом. Чтобы объяснить механизм настройки, мы разделим методы, определенные в этих классах, на три категории:

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

2.Алгоритмические методы. Они описывают абстрактный алгоритм, а конкретизация оставляется на долю других методов. В качестве примера можно привести метод, который реализует описанный выше цикл ожидания события. Такие методы обеспечивают структуру типичного приложения без выполнения какой-либо фактической работы. Как и в случае базовых методов, алгоритмические методы обычно не переопределяются новым приложением.

3.Абстрактные методы. Они выполняют фактическую работу приложения. В библиотеке среды разработки абстрактный метод, как правило, является просто пустой процедурой, которая ничего не делает. Путем переопределения

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

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

19.4. Классы в среде LAF

В среде LAF имеется шесть основных классов: application, button, menu, menuItem, staticText и editText. Три класса, на основе которых обычно порождаются подклассы, —

это application, button и menuItem. Они подробно описаны ниже.

Мы создаем приложение путем порождения подклассов класса application, переопределяя в них некоторые методы. Основной цикл ожидания событий начинается с вызова метода run, унаследованного от класса application. Этот метод реализует цикл ожидания, описанный выше. Выполнение заканчивается, когда пользователь выбирает элемент меню quit, который закрывает окно приложения, то есть вызывает метод quit(), наследуемый из класса application.

Простейшее возможное приложение показано ниже. Обратите внимание, что его код состоит из:

определения класса приложения;