Министерство общего и профессионального образования Российской Федерации УФИМСКИЙ ГОСУДАРСТВЕННЫЙ АВИАЦИОННЫЙ ТЕХНИЧЕСКИ...
46 downloads
214 Views
234KB Size
Report
This content was uploaded by our users and we assume good faith they have the permission to share this book. If you own the copyright to this book and it is wrongfully on our website, we offer a simple DMCA procedure to remove your content from our site. Start by pressing the button below!
Report copyright / DMCA form
Министерство общего и профессионального образования Российской Федерации УФИМСКИЙ ГОСУДАРСТВЕННЫЙ АВИАЦИОННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ Кафедра технической кибернетики
ИЗУЧЕНИЕ ПРИНЦИПОВ ОБЪЕКТНО-ОРИЕНТИРОВАННОГО ПРОГРАММИРОВАНИЯ
МЕТОДИЧЕСКИЕ УКАЗАНИЯ к лабораторной работе по курсу "Системное программное обеспечение" для подготовки инженеров по специальности 210100 Управление и информатика в технических системах
Уфа 1999
2
Составитель О.В. Трушин УДК 681.3.06
Изучение принципов объектно-ориентированного программирования. Методические указания к лабораторной работе по курсу "Системное программное обеспечение" для подготовки инженеров по специальности 210100 - Управление и информатика в технических системах / Уфимск. гос. авиац. техн. унив-т; Сост. О.В. Трушин. - Уфа, 1999. – 17 с.
Приведены базовые теоретические сведения и задания для лабораторной работы по разделу курса "Системное ПО", в котором изучается методология и принципы объектно-ориентированного подхода при разработке программных систем. Приведенные алгоритмы реализованы применительно к среде Borland Pascal для Windows в форме, позволяющей при необходимости легко адаптировать их для других (более современных, но и более ресурсоемких) систем программирования.
Библиогр.: 12 назв.
Рецензенты:
Л. П. Костюкова; М. Е. Сидоров
3
Содержание Стр. 1 Цель работы …………..……………………………….….…………. 4 2 Средства объектно-ориентированного программирования……….. 4 3 Методология и принципы работы с объектами…………………….. 5 3.1 Понятие объекта в ООП……………………………………… 5 3.2 Добавление новых свойств объекту-родителю……………. 8 3.3 Добавление новых свойств объектам-наследникам……….. 9 4 Программа как объект в рамках идеологии ООП…………………. 11 5 Практическое задание ……………………………………………….. 13 Список литературы ...............................................…......…....….14 Приложение А ……………..…………………………..…………… 15
4 1 Цель работы Целью работы является практическое освоение методологии и принципов объектно-ориентированного подхода при разработке программных систем. Принципы объектной методологии изучаются сначала на базовом уровне – на примере решения классической задачи управления набором графических объектов. Далее рассматривается подход к самой разрабатываемой программе как к объекту. 2 Средства объектно-ориентированного программирования Различные расширения базовых версий алгоритмических языков (например, введение строковых типов данных, модульная организация программ) принципиально не меняют природы этих языков, являясь лишь технологическими усовершенствованиями. Классический подход к программированию является процедурно-ориентированным – задаются характеристики моделируемого объекта и определяется набор процедур для отображения или модификации этих характеристик. Введение объектных типов означает радикальное изменение в самом принципе программирования. При этом подходе в характеристики объекта включают, кроме непосредственно его свойств, также и процедуры обработки этих свойств. Такие процедуры называют методами объекта (Methods). Характеристики объекта при этом называют полями (Fields). Объектно-ориентированное программирование (ООП) в настоящее время является мощным средством создания программ. Но ООП является эффективным инструментом лишь в рамках целостного объектно-ориентированного подхода на всех этапах жизненного цикла программных систем. Термин ООП (Object-oriented programming) появился в начале 80-х годов вместе с языком SmallTalk. Развитие ООП определялось потребностями развития программных систем – необходимо было создавать мобильные, легко расширяемые и стыкуемые программы с унифицированным дружественным интерфейсом. В среду Turbo-Pascal объекты были введены уже с версии 5.5, самое известное DOS-приложение ООП – пакет Turbo-Vision. Наиболее мощно как языковое средство ООП представлено в языке С++. Операционная система MS Windows (как и другие многозадачные ОС) в своей основе содержит объектно-ориентированные подходы, и игнорировать эти подходы, мягко говоря, неперспективно. Развитие средств создания программ в настоящее время находится на стадии совершенствования сред визуального проектирования, базирующихся на популярных языках программирования. Для профессиональных программистов это системы типа C++ Builder, для пользователей – среды типа Delphi и Visual Basic.
5 3 Методология и принципы работы с объектами 3.1 Понятие объекта в ООП Тип "объект" является составным, его элементы (поля) могут быть любого типа. Например, точечный бесцветный объект можно описать как Type
O = object x,y: integer; { координаты центра объекта }
end; Внешне эта структура похожа на тип "запись", но начинается она словом "Object". Здесь в структуру входят два поля целого типа (координаты). С введенным типом можно обращаться как с любым другим типом – определять переменные этого типа, работать с полями, создавать экземпляры переменной и т.д. Но в отличие от записи в описание объекта можно вводить процедуры (и функции) в качестве полей. Например, введем как свойства (методы) точечного объекта пять процедур: создания этого объекта (определения его координат), прорисовки (последовательности прохода "контура" объекта), показа (прорисовки конкретным инструментом), скрытия (прорисовки цветом фона) и, наконец, процедуру перемещения. Содержание процедур, реализующих методы объекта, приводят отдельно. uses WinCrt,WinTypes,WinProcs; Var Win: hWnd; { окно } DC: hDC; { контекст дисплея} {--------------------- Раздел объявления объектов ----------------------} Type O = object { Описание объекта-родителя } x,y: integer; { координаты центра объекта } Constructor Procedure Procedure Procedure Procedure
INIT( _X,_Y: integer);{ создатель объекта } DRAW; Virtual; { вывод объекта } SHOW; { прорисовка объекта } HIDE; { скрытие объекта } MOVE( dX,dY: integer);{ смещение объекта на dX,dY} end; { конец описания объекта-родителя }
В ООП включен принцип наследования свойств объекта при создании новых объектов как его потомков. Потомок автоматически наследует от родителя все его поля и методы с возможностью добавления новых и перекрытия (замены) существующих у родителя полей и методов. Методы, выполняющиеся по разному (здесь это прорисовка), объявляются виртуальными. Определим конкретный объект-потомок для точечного объекта – круг.
6 Cir = object(O) { Описание объекта-потомка "круг" } r: integer; { радиус – новое поле} Constructor INIT(_X,_Y,_R: integer); Procedure DRAW; Virtual; end; Здесь добавляется одно новое поле (радиус) с соответствующим переопределением (перекрытием в терминах ООП) конструктора объекта и упоминанием процедуры виртуальной прорисовки. Определим еще один объект-потомок – отрезок. Type Lin = object(O) { Описание объекта-потомка "отрезок"} sX,sY: integer; { смещение координат для конца отрезка } Constructor INIT( X1,Y1,X2,Y2: integer); Procedure DRAW; Virtual; end; Здесь включены два новых поля sX,sY для относительных координат второго конца отрезка (за первый принимается базовая точка) и перекрывается конструктор объекта, так как нужно задать новый набор координат узловых точек. Процедура прорисовки как виртуальная также объявляется. Описание методов как процедур приводится отдельно, причем параметры этих процедур можно опускать. Constructor O.INIT; Procedure O.DRAW;
begin x:=_X; y:=_Y end; begin MoveTo(DC,x-1,y); LineTo(DC,x,y) end;
Procedure O.SHOW; begin { отрисовка черным карандашом } SelectObject(DC, GetStockObject(Black_Pen)); DRAW end; Procedure O.HIDE; begin { отрисовка белым карандашом } SelectObject(DC, GetStockObject(White_Pen)); DRAW end; Procedure O.MOVE;
begin HIDE; x:=x+dX; y:=y+dY; SHOW end;
Constructor Cir.INIT; { унаследованный конструктор потомка (круга) } begin
O.INIT( _X,_Y);
r:=_R end;
Procedure Cir.DRAW; begin Ellipse(DC, x-r div 2, y-r div 2, x+r div 2, y+r div 2) end; Constructor Lin.INIT;{унаследованный конструктор потомка (линии) } begin O.INIT( X1,Y1); sX:=X2-X1; sY:=Y2-Y1 end; Procedure Lin.DRAW; begin MoveTo(DC,x,y); LineTo(DC,x+sX,y+sY) end;
7 Прорисовка точечного объекта здесь для удобства выбора инструмента проводится карандашом как короткий горизонтальный отрезок (хотя можно использовать и процедуру SetPixel, но с другим принципом выбора цвета). Оператором типа SelectObject(DC, GetStockObject(Black_Pen)) проводится выбор инструмента (из набора стандартных) для отрисовки объектов. Определим экземпляры объектов. Const N=100; Var Pixel: array[1..N] of O; { массив точек } Lini: Lin; { линия } Circ: Cir; { окружность } Active: integer; { активный объект } Определим процедуры работы с объектами. Procedure SHOWALL; { перерисовка всех объектов } Var k: integer; Begin Lini.SHOW; Circ.SHOW; For k:=1 to N do Pixel[k].SHOW end; Procedure MOVEACTIVE( dX,dY: integer); { движение активного объекта } Var k: integer; begin CASE active OF 1: Circ.MOVE( dX,dY); 2: Lini.MOVE( dX,dY); 3: For k:=1 to N do Pixel[k].MOVE( dX,dY); end end; Головная программа, организующая управление набором объектов. Var k: integer;
stop: boolean; const d=5;
begin CmdShow:=sw_ShowMaximized; { установка размера окна } InitWinCRT; { создание окна CRT } Win:=FindWindow('TPWinCRT',Pchar(0)); DC:=GetDC(Win); For k:=1 to N do { создание точек } Pixel[k].INIT( random(640),random(480)); Lini.INIT( 200,150, 400,300); { создание линии } Circ.INIT( 300,240, 100); { создание окружности } SHOWALL; { показ всех объектов } Active:=1; { номер активного объекта } stop:=false; {индикатор окончания работы с объектами } REPEAT CASE ReadKey OF { управление объектами с клавиатуры }
8 #27: Stop:=True; { Esc - остановка процесса } #9 : { Tab выбирает активный объект } begin inc(active); if active>3 then active:=1 end; '1': '2': '3': '4':
MOVEACTIVE( 0,-d); MOVEACTIVE( 0, d); MOVEACTIVE(-d, 0); MOVEACTIVE( d, 0);
{ { { {
влево } вправо } вверх } вниз } end;{case}
SHOWALL UNTIL stop; ReleaseDC(Win,DC);
DoneWinCrt end.
При организации движения объектов по горизонтали и вертикали курсорные клавиши не задействованы – ими в окне WinCrt по умолчанию перемещаются бегунки полос скроллинга. Перед закрытием окна необходимо освободить контекст устройства (DC – Display Context). 3.2 Добавление новых свойств объекту-родителю Одно из преимуществ объектно-ориентированного подхода при создании программ – легкость расширения программ. Усовершенствуем приведенную выше программу – определим цвета объектов. Для этого в разделе объявления объектов для родителя введем поле, определяющее цвет. Type O = object { Описание объекта-родителя } x,y: integer; { координаты центра объекта } pen: hPen; { карандаш для прорисовки } Constructor INIT( _X,_Y: integer; _Pen: hPen); { создатель объекта } .. .. .. end; { многоточие указывает неизменяемые части программы } При такой модернизации для потомков конструктор изменится аналогично – добавлением в параметры методов пункта _Pen: hPen. Изменения для методов родителя следующие: Constructor O.INIT; Procedure O.DRAW;
begin
x:=_X; y:=_Y; pen:=_Pen end;
begin SelectObject(DC, pen); MoveTo(DC,x-1,y); LineTo(DC,x,y) end;
Procedure O.HIDE; var dm: integer; begin dm:=SetROP2(DC,R2_WHITE); { стиль рисования белым } DRAW; dm:=SetROP2(DC,dm) { восстановление стиля рисования } end;
9 Для объектов-потомков модернизация методов в данном случае сведется лишь к добавлению нового поля. Например, для отрезка получим Constructor Lin.INIT; { унаследованный конструктор потомка (для линии) } begin O.INIT( X1,Y1,_Pen); sX:=X2-X1; sY:=Y2-Y1 end; Procedure Lin.DRAW; begin SelectObject(DC, pen); MoveTo(DC,x,y); LineTo(DC,x+sX,y+sY) end; В основной программе необходимо для реализации введенных возможностей создавать средства рисования и использовать их при создании экземпляров объекта, например .. ..
DC:=GetDC(Win); p1:=CreatePen(ps_Solid,2,RGB(255,0,0)); p2:=CreatePen(ps_Solid,5,RGB(0,255,0)); p3:=CreatePen(ps_Solid,3,RGB(0,0,255));
For k:=1 to N do Pixel[k].INIT( Lini.INIT( Circ.INIT( SHOWALL; .. ..
{ создание точек } random(600),random(300),p1); 200,150, 400,300,p2); { создание линии } 300,240, 100,p3); { создание окружности } ..
Созданные средства рисования необходимо удалять по завершении работы программы. .. .. SHOWALL UNTIL stop; DeleteObject(p1); DeleteObject(p2); ReleaseDC(Win,DC); .. .. ..
DeleteObject(p3);
3.3 Добавление новых свойств объектам-наследникам Усовершенствуем программу, определив новые методы объектов. В раздел описания объектов добавим для круга метод изменения его размера. Cir = object(O) { Описание объекта-потомка: окружность } .. .. .. Procedure ROST( k: real); { масштабирование с коэффициентом k} End;
Type
Для типа-отрезка добавим метод изменения его ориентации. Type
end;
Lin = object(O) { Описание объекта-потомка "отрезок" } .. .. .. Procedure ROTO(ugol: real); { вращение отрезка на угол ugol (град)}
10 В раздел раскрытия методов добавим строки, раскрывающие содержание введенных методов. Procedure Cir.ROST( k: real); begin HIDE; r:=round(k*r); SHOW end; Procedure Lin.ROTO( ugol: real); var ug,l: real; begin if sX=0 then begin ug:= pi/2; if sY