4. ЛАБОРАТОРНАЯ РАБОТА "ОБЪЕКТЫ TURBO VISION" 4.1. Цель работы 4.2. Методические указания к лабораторной работе 4.2.1. Объектно-ориентированное программирование Объектовые типы впервые появились в Турбо Паскле версии 5.5. Потенциально это новый подход к программированию, позво- ляющий существенно повысить производительность труда програм- мистов, сделать программы более компактными и легко расширяе- мыми. ООП зарождалось в языке Simula-67, затем развивалось с семейством языков Smalltalk. Сначала ООП использовалось как инструмент для исследова- тельской работы с большими накладными расходами, сейчас компи- ляторы получают высокоэффективный код. Полностью "объект- но-ориентированный" пакет Turbo Vision использовался для соз- дания интегрированной среды TP 6.0. Объектовые типы похожи на записи (комбинированные типы), но ПОСЛЕ описания полей данных в объектовом типе можно зада- вать подпрограммы - процедуры и функции (методы). ОБЪЕКТ=ИНФОРМАЦИЯ+ПРАВИЛА ПОВЕДЕНИЯ Непосредственно в объектовом типе задаются только заго- ловки подпрограмм-методов, а полные их описания должны быть заданы отдельно. Имя подпрограммы составляется из имени объек- тового типа - "хозяина", символа "точка" и имени подпрограммы. Такое разделение дает большую наглядность объектовому типу, он может описываться как интерфейсный элемент модуля, а полные описания подпрограмм-методов могут быть размещены в разделе реализации модуля. Программа с использованием ООП является не бессистемной совокупностью данных и подпрограмм, а библиотекой объектов с полностью определенным поведением. Используя наследование, объекты все более усложняются, т.е. используется восходящее проектирование программ. Замечания 1. Методы, определенные в объектовом типе, имеют доступ ко всем полям этого типа. К полям можно обращаться и непос- редственно, используя составные имена, но это считается отс- туплением от объектно-ориентированного стиля: ВСЕ действия с информацией, заданной в объектовом типе, осуществляются пос- редством его методов. 2. Объекты похожи на модули. В ТР модуль отдельно хранит- ся и компилируется, но нельзя определить переменную "модульно- го типа". Для объектового типа можно создать произвольное чис- ло переменных этого типа, имеющих свои методы, посредством ко- торых эти объекты манипулируют значениями своих полей. 3. Если в модуле определен интерфейсный объектовый тип со многими методами, а в программе будут применяться только неко- торые методы, то в результирующий код попадут только те мето- ды, которые реально вызываются программой. В ТР средства ООП связаны с тремя зарезервированными сло- вами: OBJECT, CONSTRUCTOR (строитель), DESTRUCTOR (разруши- тель) и тремя стандартными директивами PRIVATE (частный, тай- ный), PUBLIC (общедоступный, открытый) и VIRTUAL (фактический, действительный). Для объектовых типов характерны три свойства: инкапсуля- ция, наследование, полиморфизм. ИНКАПСУЛЯЦИЯ - объединение данных и алгоритмов их обра- ботки, в результате чего и данные, и процедуры во многом теря- ют самостоятельное значение. Фактически это модульное програм- мирование нового уровня с большей смысловой связью. Инкапсуля- ция спосбствует уменьшению количества ошибок: к полям данных обращаются, используя соответствующие методы объекта. ООП в наибольшей степени подходит для создания библиотек программирования при разработке достаточно сложных программ. Попытки использовать ООП для программирования несложных алго- ритмических действий, связанных с расчетами по готовым форму- лам чаще всего выглядят искусственными нагромождениями ненуж- ных языковых конструкций. А отладка сложных диалоговых прог- рамм очень трудоемка ("критическая масса" 1000-1200 операторов языка) без их структурирования, т.е. создания фактически собс- твенной библиотеки программирования. НАСЛЕДОВАНИЕ (Inheritance) - объявление объекта потомком ранее описанного объекта. От родителя наследуются все данные и методы, которые можно дополнить своими данными и методами. Имя родителя указывается в круглых скобках за словом OBJECT. Глав- ное преимущество наследования (самое мощное свойство ООП) - нет необходимости заново описывать уже существующие в объек- те-родителе поля и методы. Наследование распространяется на любые объекты, в том числе и на объекты-потомки: если в качестве родителя указано имя объекта, который сам по себе является потомком, то новый объект наследует свойства своего родителя и всех прародителей. Таким образом, создается дерево наследования от корня к ветвям и листьям. ПОЛИМОРФИЗМ - одним именем могут называться различные ал- горитмические действия в родственных объектах, т.е. объект-по- томок может заменять методы родителя (но не поля) на новые. [Фаронов, с.174] type TA=object procedure Out; end; TB=object (TA) procedure Out; end; procedure TA.Out; begin writeln('AAAA') end; procedure TB.Out; begin writeln('BBBB') end; var A:TA; B:TB; begin A.Out; B.Out end. При запуске программы будет выдано AAAA BBBB Такое связывание объектов, полей с методами называется ранним - на этапе компиляции. Такие методы называются стати- ческими. Возможно позднее связывание данных с методами - на этапе исполнения программы. Описание метода дополняется директивой VIRTUAL, такие методы называются виртуальными. VIRTUAL предуп- реждает компилятор: "Пока ты не знаешь, что я хочу. Придет время - запроси образец". Для каждого типа объекта создается таблица виртуальных методов (ТВМ): адреса точек входа всех виртуальных методов. Фактическое связывание осуществляется при обращении к КОНСТРУКТОРУ - специальному методу (обычная проце- дура, но заголовок вместо PROCEDURE содержит CONSTRUCTOR. В момент обращения к констуктору в специальное поле объекта за- носится адрес нужной ТВМ, в результате чего ВСЕ виртуальные методы (в том числе и унаследованные от родителей) получают доступ к нужным полям. При позднем связывании полиморфизм распространяется не только от текущего уровня иерархии вниз, к потомкам, но также и вверх, к родителям. type TA=object procedure Out; function OutStr:string; virtual; constructor Init; end; TB=object (TA) function OutStr:string; virtual; constructor Init; end; procedure TA.Out; begin writeln(OutStr) end; function TA.OutStr:string; begin OutStr:='AAAA' end; function TB.OutStr:string; begin OutStr:='BBBB' end; constructor TA.Init; begin end; constructor TB.Init; begin end; var A:TA; B:TB; begin A.Init; B.Init; A.Out; B.Out end. Будет выведено AAAA BBBB С помощью ТВМ родительский метод TA.Out "узнал" о сущест- вовании виртуального метода TB.OutStr и использовал именно его при обращении B.Out. 4.2.1. Библиотека Turbo Vision Vision - зрение, предвидение, видение. [Turbo Vision для C++.К,:1992] Библиотека Turbo Vision предназначена для написания прог- рамм, работающих в текстовом режиме и использующих высокопро- изводительный, гибкий и целостный интерфейс для взаимодействия с пользователем. Интерфейс включает окна, диалоговые панели, меню, поддержку манипулятора "мыши" и даже простой редактор. С помощью варианта Turbo Vision для Turbo Pascal интегри- рованная среда ТР 6.0 создана за меньшее время, чем требуется для написания такой среды с нуля. В приложениях, написанных с помощью Turbo Vision, широко используется техника ООП, в том числе наследование и полиморфизм. Изменения в библиотеке Turbo Vision производятся не путем модификации исходного текста, а путем расширения. Объект прик- ладной программы TApplication остается неизменным в библиоте- ке, программист просто делает добавления к нему, создавая но- вые типы объектов и внося нужные изменения путем замены имею- щихся функций на новые, которые разработаны для новых объектов. Кроме того, Turbo Vision представляет собой иерархическую структуру, а не разобщенный набор отдельных средств. Его можно использовать только целиком, а не по частям. Все компоненты Turbo Vision архитектурно взаимосвязаны и все они взаимодейс- твуют друг с другом множеством взаимосвязанных способов. Не стоит пытаться вычленить из него, например поддерку "мыши" - это сложнее, чем создание новой системы поддержки "мыши". ЭЛЕМЕНТЫ ПРИКЛАДНОЙ ПРОГРАММЫ, ПОСТРОЕННОЙ В Turbo Vision Прикладная программа, использующая Turbo Vision, предс- тавляет собой множество отображаемых объектов, событий и нео- тображаемых объектов. ОТОБРАЖАЕМЫЙ ОБЪЕКТ - это любой объект программы, изобра- жаемый на экране: поля, названия полей, рамки, строки прокрут- ки и меню и т.д.. Отображаемые объекты могут объединяться в группы: окна, панели диалога, которые функционируют вместе как один объект. Отображаемые объекты всегда имеют прямоугольную форму, минимально один символ или строки в один символ высотой или шириной. СОБЫТИЯ - это то, на что должна отреагировать программа: нажатие клавиши, кнопки "мыши", события, поступившие из других частей Turbo Vision. События поступают в очередь, затем обра- батываются в порядке поступления обработчиком в объекте TApp- lication. Необработанные события передаются другим отображае- мым объектам и так до тех пор, пока не будет найден нужный об- работчик событий или пока не возникнет ошибочная ситуация. Например, нажатие клавиши F1 для вызова справочной системы об- рабатывается обработчиком событий главной программы, а нажатие алфавитно-цифровой клавиши - обработчиком активного в данный момент отображаемого объекта. НЕОТОБРАЖАЕМЫЕ ОБЪЕКТЫ - любые объекты, не являющиеся отображаемыми на экране: анализаторы вводимой информации, кол- лекции, потоки, ресурсы, списки строк. Они выполняют вычисле- ния, осуществляют связь с периферийными устройствами и в целом реализуют функции прикладной программы. Если неотображаемому объекту требуется вывести какую-либо информацию на экран, то это делается при помощи отображаемого объекта. Самостоятельный вывод (writeln) будет "мешаться" тексту Turbo Vision. Прикладные программы с использованием Turbo Vision приоб- ретут похожий, знакомый вид. Этот вид идентичен виду интер- фейса различных интегрированных сред фирмы Borland и базирует- ся на многолетнем опыте и проверках их использования. Общие элементы экрана: линейное меню в верхней части эк- рана, рабочая область в середине экрана (заштрихованный фон, на котором отображаются объекты прикладной программы), строка состояния с подсказками в нижней части экрана. Линейное меню Рабочая область Строка состояния Команды в строковом меню раскрываются вниз (вертикальные меню), при выборе команды вертикального меню клавишей Enter или левой кнопки мыши производится передача управления в ка- кую-либо часть программы. Связь программы с пользователями обычно осуществляется через окно или несколько окон или панели диалога, которые отображаются в рабочей области на экране и исчезают в соответствии с командами от "мыши" или клавиатуры. Внутренние поля окон можно сделать прокручиваемыми, и тогда они будут служить "воротами" в более крупные изображения дан- ных, такие как файлы документов. Прокрутка окна по данным вы- полняется перемещением бегунка строки прокрутки в нижней части экрана, в его правой части или в обеих этих частях. Бегунок строки прокрутки указывает положение окна относительно сово- купности изображаемых на экране данных. Диалоговые окна часто содержат кнопки, которые в ответ на нажатие передают команду прикладной программе. ИЕРАРХИЯ ОБЪЕКТОВ Turbo Vision Хотя объект TObject является базовым почти для всех ос- тальных объектов, основные объекты наследуются из объекта TVi- ew, который является прямым наследником TObject. Знание иерархии помогает в изучении объектов. Например, объект TDialog является наследником TWindow, который является наследником TGroup, а последний - наследником TView. Каждый объект будет обладать известными унаследованными свойствами и остается лишь узнать, какие дополнительные поля и методы он будет иметь. Объект TGroup наследует все поля TView и к ним добавляют- ся поля, необходимые, например, для указания текущего и пос- леднего объекта в группе. В свою очередь TWindow добавляет еще поля, такие как рамка, заголовок и номер окна. Объекты TPoint (точка) и TRect (прямоугольник) использу- ются всеми отображаемыми объектами. Объект TObject является основой иерархии. TObject - не имеет полей, имеет два метода destroy (осво- бождает память) и shutDown (абстрактный деструктор, который должен переопределяться в порожденных классах). Отображаемые объекты порождаются от TView. Сам TView - пустая прямоугольная зона на экране и виртуальный метод draw. TGroup (ГРУППА) - позволяет обрабатывать динамически соз- данные списки отображаемых объектов посредством отображаемого объекта под названием owner (владелец) группы. Поле next - связь со следующим объектом в цепочке. 4.3. Порядок выполнения работы 4.3.1. Ознакомиться с основами объектно-ориентированного программирования, составом библиотеки Turbo Vision, иерархией объектов. 4.3.2. Написать, отладить программу и получить контроль- ный пример, проверяющий все варианты обработки. 4.3.3. В отчет по лабораторной работе включается: постановка задачи с описанием предметной области, струк- тур данных, математической модели; иерархическая схема программы со спецификацией; иерархия объектов программы со спецификацией; схема программы по ГОСТ 19.701-90 или структурограмма; текст программы; контрольный пример. 4.4. Задания Разрабатываемая программа предназначена для обработки ре- зультатов спортивных соревнований. В начале программы выдается в графическом режиме пиктограмма, адекватно отображающая дан- ный вид соревнований. Стартовые протоколы, имена команд-участ- ников вводятся из тестового файла и/или с клаватуры. Результа- ты соревнований генерируются случайным образом в интервалах, определяемых предметной областью или вводятся из файла резуль- татов. В процессе обработки результатов предусмотреть регули- руемые задержки для наилучшего отображения динамики соревнова- ний. Программа должна использовать не менее одного своего объ- екта, не имеющего предков, и не менее одного своего объекта, имеющего в качестве предка объект Turbo Vision. Варианты: 1). Лыжные соревнования. 2). Бег. 3). Метание копья. 4). Толкание ядра. 5). Прыжки в длину. 6). Прыжки в высоту. 7). Многоборье (триатлон, пятиборье, семиборье, десяти- борье). 8). Плавание. 9). Биатлон. 10). Стрельба. 11). Слалом. 12). Конный спорт: конкур. 13). Хоккей. 14). Баскетбол. 15). Волейбол. 16). Футбол. 17). Мотоспорт: спидвей. 18). Автоспорт: ипподромные гонки. 19). Санный спорт. 20). Бобслей. 21). Скоростной спуск. 22). Конный спорт: скачки. 23). Автоспорт: Формула 1. 24). Шашки. 25). Шахматы. 26). Стрельба из лука. 27). Борьба вольная. 28). Самбо. 29). Парашютный спорт. 4.5. Контрольные вопросы 1. Предметная область: правила соревнований. 2. Виды спортивных снарядов. 3. Определение (измерение) результатов. 4. Использование вычислителшьной техники в спорте. 5. Свойства объектов. 6. Библиотека Turbo Vision. 7. Отображаемые и неотображаемые объекты, события.