Тема 7 «Алгоритмизация и основы объективно-ориентированного программирования» (20 ч)
Урок 51. Основы объектно-ориентированного программирования
CПО в российских школах: уроки Gambas
Заочная школа программирования. Основы gambas
http://dvo.sut.ru/libr/cvti/i618buz/17.htm
http://vschol.ru/TurboPascal/gl10/gl10_1.html
В настоящее время в программировании существуют четыре принципиально отличающихся подхода:
· процедурный (алгоритмический),
· логический (декларативный),
· функциональный,
· объектно-ориентированный.
Объектно-ориентированный подход в разработке программ появился позже других. Его появление стало следствием все возрастающей сложности программного обеспечения, необходимости его регулярного обновления из-за постоянно изменяющихся требований к программам и условиям их функционирования. Именно объектно-ориентированный подход позволяет решать задачи наивысшей сложности, повышает надежность программ, облегчает их модернизацию.
Логическая единица объектно-ориентированной программы – объект. Объект в реальной жизни – это сущность, обладающая некоторым набором свойств и моделью поведения.
Мы живем в мире объектов. Стол, автомобиль, ручка, классная доска – все это объекты. Наряду с физическими существуют так же абстрактные объекты, типичными представителями которых являются числа. Таким образом, объект – это любая физическая или абстрактная четко идентифицируемая сущность. Объект – это общефилософское понятие, которое изучалось философами на протяжении длительного времени.
Объекты характеризуются атрибутами. Так атрибутами автомобиля являются максимальная скорость, мощность двигателя, цвет кузова и т. д. Атрибутами усилителя являются частотный диапазон, выходная мощность, коэффициент нелинейных искажений, уровень шума и т. д.
Помимо атрибутов объекты обладают некоторыми функциональными возможностями, которые в объектно-ориентированном программировании (ООП) называют операциями или методами. Так автомобиль может ездить, корабль – плавать, компьютер – производить вычисления.
Таким образом, объект инкапсулирует атрибуты и методы, скрывая от других объектов взаимодействующих с ним и использующих его функциональность, свою реализацию. Так для того чтобы переключить телевизионную программу нам достаточно на пульте дистанционного управления набрать ее номер, что запустит сложный механизм, который в итоге и приведет к желаемому результату. Нам совершенно не обязательно знать, что происходит в пульте дистанционного управления и телевизоре, нам лишь достаточно знать, что телевизор обладает такой возможностью (методом) и как ее можно активировать. Инкапсуляция или сокрытие реализации является базовым свойством ООП. Она позволяет создавать пользовательские объекты, обладающие требуемыми методами и далее оперировать ими, не вдаваясь в устройство этих объектов.
Объект – это экземпляр некоторого класса объектов или просто класса. Так автомобиль Audi 6 является экземпляром класса автомобилей данной модели, приемник Sony SW-7600G так же будет представителем класса одноименных приемников.
Объект в программе представляет собой абстракцию реального объекта, т. е. в программе объект наделяется теми чертами и характеристиками реального времени, которые существенны для решаемой задачи. Второстепенные же характеристики в программную абстракцию не включаются, при этом характеристики одного и того же реального объекта, существенные для одной задачи, оказываются второстепенными в другой задаче. Рассмотрим хорошо знакомый нам объект – принтер. Если разрабатывать программу для обслуживания магазина, продающего принтеры, существенными будут модель принтера, цена, габариты, скорость печати, цвет корпуса и т. д. Если рассматривать принтер с точки зрения администратора вычислительной сети, то существенными характеристиками будут логическое имя устройства в сети, его IP-адрес, драйверы, обеспечивающие работу принтера.
Объект в программе имеет имя, ограниченный набор свойств, набор допустимых состояний (т. е. набор конкретных значений свойств), набор методов (операций), определяющих модель поведения объекта (действия объекта).
Пример абстракции:
Модель принтера
Имя: HP_5P
Набор свойств: Модель, год выпуска, состояние готовности
Значения свойств: Модель = "HP 5P", Год выпуска = 1999, Состояние готовности=Ready (готов к печати)
Действия объекта: Печатает
Как видно, эта абстракция включает в себя далеко не полный перечень свойств принтера, но для определенной задачи этого набора будет достаточно. Если задача изменится (усложнится), в модель принтера можно будет добавить недостающие свойства и описания новых действий.
В программе свойства объекта представлены с помощью переменных, а действия объекта – с помощью подпрограмм (в C++ – функций). Подпрограммы, содержащие описания действий объекта, называются методами. Набор конкретных значений переменных, характеризующих объект, определяет состояние объекта. Объект имеет ограниченный набор допустимых состояний. Например, в нашей модели принтера возможны два состояния: «готов к печати» и «печатает». Остальные свойства задаются для конкретного принтера изначально и не изменяются в процессе работы программы.
Таким образом, объект в объектно-ориентированном программировании (ООП) – это совокупность переменных состояния и связанных с ними методов (операций). Эти методы, с одной стороны, определяют, как объект взаимодействует с внешним миром. С другой стороны, методы осуществляют переход объекта из одного состояния в другое, причем метод проверяет, возможен ли такой переход в данной ситуации. Например, принтеру дается команда отпечатать документ. Если принтер находился в этот момент в состоянии «готов к печати», изменит свое состояние на состояние «печатает». Если принтер в момент получения команды печатал другой документ, то он остается в прежнем состоянии «печатает», а наш документ ставится в очередь на печать. Когда принтер закончит печатать один документ, он приступит к печати нашего документа. Отпечатав наш документ, принтер проверит, есть ли еще документы в очереди на печать, и, если очередь пуста, перейдет в режим «готов к печати». Таким образом, в ответ на наше действие принтер сам определил свои дальнейшие действия, и его выбор зависел от предыдущего состояния принтера. Объектно-ориентированный подход позволяет объектам самим решать, как выполнить ту или иную задачу.
В основе разработки программы с использованием методов ООП применяется объектная декомпозиция задачи. Объектная декомпозиция задачи включает в себя разбиение задачи на отдельные объекты, выявление существенных свойств объектов и способов их взаимодействия. Программа представляет при этом совокупность объектов, взаимодействующих между собой.
В процессе декомпозиции задачи могут быть выявлены объекты с одинаковыми наборами свойств и поведением. Например, для программы, моделирующей футбольный матч, необходимы две команды объектов-«футболистов». Каждого игрока матча можно охарактеризовать следующими свойствами: название команды, форма одежды, номер, координаты на поле. Поведение игроков на поле можно описать следующими действиями: стоит, бежит, отдает мяч, получает мяч. Объекты с одинаковым набором свойств и методов образуют класс. Класс – основа объектно-ориентированной методологии – служит для создания в программе любого количества объектов с заданным набором свойств и заданной моделью поведения. Если проводить параллель с алгоритмической методологией, то класс выступает в роли типа данных, однако это специфический тип, так как кроме данных в класс включаются действия (функции-члены класса, манипулирующие с данными).
Теперь рассмотрим основные термины ООП.
Класс (class) – это тип данных, включающий в себя группу данных различных типов (свойства) и методы работы с этими данными.
Объект (object) – это экземпляр класса, обладающий набором свойств с заданными значениями.
Свойство (property) – характеристика объекта, представленная в виде переменной, являющейся членом класса.
Метод (method) – это подпрограмма, входящая в состав класса и управляющая данными объекта.
Событие (event) – какое-либо происшествие в программе, системе, например, была нажата кнопка мыши.
Сообщение (message) – адресованная конкретному объекту информация о происшедшем событии; объект, получивший сообщение, должен на него ответить своими действиями, вызвав метод, соответствующий этому событию. Например, если получено сообщение о том, что была нажата левая кнопка мыши на пункте меню Exit, произойдет завершение программы, если был выбран пункт меню Save, будет выполнено сохранение информации.
Основные принципы ООП
Объектно-ориентированное программирование основано на «трех китах» - трех важнейших принципах, придающих объектам новые свойства. Этими принципами являются инкапсуляция, наследование и полиморфизм.
Инкапсуляция
Инкапсуляция есть объединение в единое целое данных и алгоритмов обработки этих данных. В рамках ООП данные называются полями объекта, а алгоритмы - объектными методами.
Инкапсуляция позволяет в максимальной степени изолировать объект от внешнего окружения. Она существенно повышает надежность разрабатываемых программ, т.к. локализованные в объекте алгоритмы обмениваются с программой сравнительно небольшими объемами данных, причем количество и тип этих данных обычно тщательно контролируются. В результате замена или модификация алгоритмов и данных, инкапсулированных в объект, как правило, не влечет за собой плохо прослеживаемых последствий для программы в целом (в целях повышения защищенности программ в ООП почти не используются глобальные переменные).
Другим немаловажным следствием инкапсуляции является легкость обмена объектами, переноса их из одной программы в другую. Можно сказать, что ООП «провоцирует» разработку библиотек объектов, таких как Turbo Vision.
Наследование
Наследование есть свойство объектов порождать своих потомков. Объект-потомок автоматически наследует от родителя все поля и методы, может дополнять объекты новыми полями и заменять (перекрывать) методы родителя или дополнять их.
Принцип наследования решает проблему модификации свойств объекта и придает ООП в целом исключительную гибкость. При работе с объектами программист обычно подбирает объект, наиболее близкий по своим свойствам для решения конкретной задачи, и создает одного или нескольких потомков от него, которые «умеют» делать то, что не реализовано в родителе.
Последовательное проведение в жизнь принципа «наследуй и изменяй» хорошо согласуется с поэтапным подходом к разработке крупных программных проектов и во многом стимулирует такой подход.
Полиморфизм
Полиморфизм - это свойство родственных объектов (т.е. объектов, имеющих одного общего родителя) решать схожие по смыслу проблемы разными способами. В рамках ООП поведенческие свойства объекта определяются набором входящих в него методов. Изменяя алгоритм того или иного метода в потомках объекта, программист может придавать этим потомкам отсутствующие у родителя специфические свойства. Для изменения метода необходимо перекрыть его в потомке, т.е. объявить в потомке одноименный метод и реализовать в нем нужные действия. В результате в объекте-родителе и объекте-потомке будут действовать два одноименных метода, имеющие разную алгоритмическую основу и, следовательно, придающие объектам разные свойства. Это и называется полиморфизмом объектов.
Практическая работа 4. Графический редактор
Создадим простейший графический редактор в Gambas
Пусть в редакторе можно будет задать координаты начальной и конечной точки, выбрать цвет и нарисовать графические примитивы Линия, Круг, Прямоугольник.
Чтобы создать меню, нужно кликнуть правой кнопкой по форме, выбрать команду Создать меню.
Пусть у нас в меню будет две команды: Нарисовать, Очистить. В меню Нарисовать создадим подменю Линия, Круг, Прямоугольник. Для создания подменю сместим эти команды вправо относительно основного меню Нарисовать. В меню Очистить создадим подменю Отменить изменения
Форма готова. Перейдем к написанию кода. Для этого сначала разберемся с основными командами рисования.
Метод представляет собой действие, выполняемое над объектом. Графические методы используются для построения изображений на поверхности объектов.
Формат команды: объект.метод.
Объект рисования Draw, методы перечислены ниже. Например, Draw.Line(х1,у1,х2,у2) нарисует отрезок от точки (х1,у1) до точки (х2,у2).
Графические методы применимы к объекту DrawingArea.
Так как нам для рисования понадобятся переменные - координаты точек х1, х2, у1, у2, цвета r, g, b - то опубликуем их
Определяем холст для рисования:
Здесь заданы Width (ширина), Height (высота) холста, цвет изображения и цвет фона. Можно задать другие данные. Для изменения цвета изменяем свойство ForeColor:
используем системный цвет
Draw.ForeColor = Color.Black - черный
используем пользовательский цвет (указываем интенсивность каждого из трех основных цветов: красного, зеленого и синего от 0 до 255)
Draw.ForeColor = Color.RGB(255, 255, 0) - желтый
Система координат: Единица измерения 1 пиксель. Свойства: X (координаты левой границы), Y (координата верхней границы), Width (ширина), Height (высота).
Основные методы рисования
Draw.Line(int xl, int yl, int х2, int y2) вычерчивает текущим цветом отрезок прямой между точками с координатами (xl, yl) и (х2, у2).
Draw.Point(int x, int y) вычерчивает текущим цветом точку с координатами (x,y)
Draw.Rect(int x, int у, int width, int height) — чертит прямоугольник со сторонами, параллельными краям экрана, задаваемый координатами верхнего левого угла (х, у), шириной width пикселей и высотой height пикселей;
Draw.Polygon([int x1, int y1, ..., int xn,int yn ]) — чертит замкнутый многоугольник, последняя точка соединяется с первой;
Draw.Circle( int x, int у, int r) – чертит окружность с центром в точке (x,y) и радиусом r
Draw.Ellipse(int x, int у, int width, int height) — чертит овал, вписанный в прямоугольник, заданный аргументами метода.
Метод Fill задает закрашенные фигуры. Цвет закраски задается следующим способом:
Draw.FillColor = Color.White
Стиль закраски: Draw.FillStyle = True (сплошная закраска), Draw.FillStyle = False (контур)
Создаем событие Клик по меню Линия:
Считываем значения координат Начинаем рисовать Стиль закраски - контур Цвет изображения красный (можно задать любой) Рисуем линию Конец рисования |
Если запустить программу, получим примерно такой результат
Очистка экрана
PUBLIC SUB btnClear_Click()
Draw.Begin(drwUlica)
Draw.FillColor = Color.White
Draw.FillStyle = Fill.Solid
Draw.Rect(0, 0, Draw.Width, Draw.Height)
Draw.End
END