1. Что такое объекты 2. Объектно-ориентированное программирование 3. Пример работы с объектами Что такое объекты Везде в реальном мире, куда бы вы ни взглянули,

Download Report

Transcript 1. Что такое объекты 2. Объектно-ориентированное программирование 3. Пример работы с объектами Что такое объекты Везде в реальном мире, куда бы вы ни взглянули,

1. Что такое объекты
2. Объектно-ориентированное программирование
3. Пример работы с объектами
1
Что такое объекты
Везде в реальном мире, куда бы вы ни взглянули, вы видите объекты, —
людей, машины, самолеты, здания, компьютеры и так далее.
Люди мыслят на языке объектов.
Телефоны, дома, светофоры, микроволновые печи и холодильники — это
просто некоторые объекты, которые мы видим вокруг нас ежедневно.
Иногда мы делим объекты на две категории — одушевленные и
неодушевленные.
Одушевленные объекты в некотором смысле «живые» — они движутся и
что-то делают.
Неодушевленные объекты, с другой стороны, сами по себе не движутся.
Однако объекты обоих типов имеют нечто общее.
Все они имеют атрибуты (например, размер, форму, цвет и высоту), и они
проявляют поведение (например, мяч катится, скачет, надувается и сдувается;
ребенок плачет, спит, ползает, ходит и моргает; автомобиль разгоняется,
тормозит и поворачивает; полотенце впитывает воду).
Люди познают существующие объекты, изучая их атрибуты и наблюдая их
поведение.
Различные объекты могут иметь похожие свойства и проявлять сходное
поведение.
Можно, например, провести сравнение между детьми и взрослыми, между
2
людьми и шимпанзе.
Предположим, вы хотите поехать на машине;
вы разгоняете ее, нажимая на акселератор.
Что должно произойти, прежде чем вы сможете это сделать?
Вообще говоря, чтобы вы могли ездить на машине, кто-то должен был
спроектировать и собрать ее.
Автомобиль начинается с инженерных эскизов и чертежей, похожих на планы
дома. В эти чертежи входит конструкция педали акселератора, с помощью
которой водитель разгоняет машину.
В некотором смысле эта педаль «скрывает» за собой сложные механизмы,
которые в действительности заставляют машину ехать быстрее, точно так же,
как педаль тормоза «скрывает» механизмы, замедляющие машину, руль
«скрывает» механизмы, поворачивающие машину и т.д.
3
Все это позволяет людям,
мало или вообще ничего не знающим о том,
как устроен автомобиль,
с легкостью водить его,
просто нажимая на акселератор и тормоз,
поворачивая руль,
переключая передачи и
манипулируя прочими простыми,
привычными пользователю «интерфейсами» сложных внутренних
механизмов.
К сожалению, нельзя ездить на чертежах автомобиля;
прежде чем вы поедете, автомобиль должен быть собран согласно
описывающим его чертежам.
В полностью собранном автомобиле будет настоящая педаль
акселератора, предназначенная для его ускорения.
Но и этого недостаточно — автомобиль не будет разгоняться сам собой;
для этого нужно, чтобы водитель нажимал на эту педаль, приказывая
автомобилю ехать быстрее.
4
Теперь давайте воспользуемся примером с автомобилем,
чтобы представить ключевые концепции
объектно-ориентированного программирования.
Чтобы выполнить в программе некоторую задачу, требуется функция
Функция описывает механизмы, которые в действительности эту задачу
выполняют.
Функция скрывает от пользователя выполняемые ею сложные задачи,
точно так же как акселератор скрывает от водителя сложные механизмы,
заставляющие автомобиль ускоряться.
В C++ мы начинаем с создания программной единицы, называемой
классом, в которую входит функция — как в чертежи автомобиля входит
конструкция педали акселератора.
Функция, принадлежащая классу, называется его элемент-функцией.
В классе предусматривают одну или более элемент-функций,
предназначенных для выполнения задач класса.
Например, класс, представляющий банковский счет, может содержать
одну элемент-функцию для внесения денег на счет, другую для снятия
денег со счета и третью для справок о текущем состоянии счета.
5
Точно так же, как нельзя ездить на чертежах автомобиля, нельзя
«ездить» на классе.
Как кто-то должен был собрать автомобиль по чертежам, прежде чем
вы сможете на нем поехать,
так и вы должны создать объект класса, прежде чем программа сможет
выполнять описываемые классом задачи.
Заметьте, что из одного класса можно точно так же породить много
объектов, как по одним и тем же чертежам — собрать много
автомобилей.
Когда вы ведете машину, нажатие акселератора посылает машине
сообщение — ехать быстрее.
Аналогичным образом вы посылаете объекту сообщения, каждое из
которых называется
вызовом элемент-функции
и приказывает элемент-функции объекта выполнить ее задачу.
Часто это называют запросом услуг у объекта.
6
Мы пользовались аналогией с автомобилем,
чтобы представить класс, объекты и элементы-функции.
Помимо предоставляемых автомобилем возможностей, у него
имеется также множество атрибутов, таких, как цвет, число дверей,
количество бензина в баке, текущая скорость и суммарный пробег
(т.е. показания счетчика-одометра).
Как и возможности автомобиля, его атрибуты представлены в
проекте и чертежах.
Когда вы ведете автомобиль, они все время с ним ассоциируются.
У каждого автомобиля имеются свои собственные атрибуты.
Например, каждый автомобиль знает о том, сколько бензина у него в
баке, но не о том, сколько бензина в баках других автомобилей.
Аналогичным образом объект имеет атрибуты, которые, в процессе
использования его в программе, всегда сопровождают объект.
Спецификация этих атрибутов является частью класса объекта.
Например, объект банковского счета имеет атрибут баланса,
представляющий сумму денег на счете.
Каждый объект банковского счета знает баланс счета, им
представляемого, но не балансы других счетов банка.
Атрибуты специфицируются элементами данных класса.
7
Объектно-ориентированное проектирование
(OOD, Object-Oriented Design)
моделирует программное обеспечение на языке,
сходном с тем, которым пользуются люди при описании объектов реального
мира.
OOD пользуется средствами классификации,
когда объекты определенного класса,
например, класса средств передвижения,
имеют одинаковые характеристики —
лимузины, грузовики, маленькие красные фургончики и роликовые коньки
имеют много общего.
OOD пользуется отношениями наследования,
когда новые классы объектов производятся путем поглощения
характеристик существующих классов и добавления к ним своих
собственных уникальных характеристик.
Объект класса «кабриолет» обладает, безусловно, характеристиками более
общего класса «автомобиль», но, в частности, его крыша может
подниматься и опускаться.
8
Объектно-ориентированное проектирование предлагает
естественный и интуитивный подход
к процессу проектирования программного обеспечения, —
а именно,
моделирование объектов
посредством их
атрибутов,
поведения и
взаимоотношений,
точно так же,
как мы поступаем при описании объектов реального мира.
OOD моделирует также коммуникацию между объектами.
Точно так же, как люди
посылают друг другу сообщения
(например,
сержант дает солдату команду стать по стойке «смирно»),
обмениваются сообщениями и объекты.
Объект банковского счета может получить сообщение уменьшить
свой баланс на определенную сумму, поскольку клиент снял эту
сумму со счета.
9
Атрибуты и действия (поведение)
OOD инкапсулирует
(т.е. упаковывает) в объектах —
атрибуты и действия объекта тесно связаны между собой.
Объекты обладают свойством сокрытия информации.
Это означает, что объекты могут знать,
как взаимодействовать друг с другом при посредстве точно определенных
интерфейсов,
но, как правило, им не дано знать,
как реализованы другие объекты;
детали реализации скрыты внутри самих объектов.
Мы вполне, например, можем вести машину,
не зная деталей того, как работают двигатели, тормоза, трансмиссии и
выхлопные системы — нам достаточно знать, как обращаться с педалями
акселератора и тормозов, рулевым колесом и так далее.
Сокрытие информации,
как мы увидим, является ключом к правильному проектированию
программного обеспечения.
10
Языки, подобные C++,
являются объектно-ориентированными.
Программирование на таком языке называют
объектно-ориентированным программированием (OOP),
и оно позволяет программистам реализовать
объектно-ориентированный проект в качестве работающей
программной системы.
С другой стороны, языки, подобные С, являются процедурными,
соответственно программирование тяготеет
к ориентации на действия.
В С программной единицей является функция.
В C++ программной единицей является класс,
в качестве представителей
(синоним OOP для термина «экземпляр»)
которого создаются объекты.
Классы C++ содержат функции,
которые реализуют действия,
и данные, которые реализуют атрибуты.
существуют прежде всего ради выполняемых функцией действий.
11
Пример работы с объектами
В качестве примера можно привести применение различных эффектов
при проектировании ВЕБ-страницы.
ОБЪЕКТНАЯ МОДЕЛЬ БРАУЗЕРА
Браузер строит объектную модель, в которой каждому тегу соответствует
отдельный объект. Эти объекты помещаются в соответствующие места
иерархической схемы документа.
12
Объект document представляет собой модель
документа, построенного браузером на экране.
Кроме того, в состав объекта document входят несколько специальных
массивов со ссылками на объекты.
Эти массивы (их называют коллекциями)
удобно использовать для доступа к элементам модели без учета иерархии.
Так коллекция с именем all содержит объекты,
построенные для всех тегов документа,
а коллекция images — содержит объекты, построенные для тегов IMG.
Управление логикой программного кода
при помощи событий —
это вторая характерная черта ООП
наряду с понятием объекта.
Управление выполняется посредством событий:
возникает событие,
и браузер передает управление в нужный объект.
Например, на картинке выполнен щелчок.
Браузер передает управление объекту, построенному для
соответствующего тега IMG.
13
Не представляя себе как
работает объектная модель
браузера, мы можем
демонстрировать на своей
HTML-странице различные
эффекты появления, смены
картинок.
Смена картинки при
наведении курсора
Изменяем свойство объекта document
src
Текст HTML-страницы:
<html>
<img id="my2" src="redcar.jpg"
style="position:absolute;top:260;left:310"
onmouseover="document.all.my2.src='phantom.jpg'"
onmouseout="document.all.my2.src='redcar.jpg'">
</html>
14
Изменяем свойство объекта document
visibility
Появление-исчезновение
по щелчку на картинке
<html>
<img id="my1" src="phantom.jpg"
onclick="document.all.my2.style.visibility='visible'">
<img id="my2" src="redcar.jpg"
onclick="document.all.my2.style.visibility='hidden'"
STYLE="visibility='hidden'"><br>
Машина появится при щелчке на картинке <br>
утеса в море, а исчезнет при щелчке на ней
</html>
15
Изменяем свойство объекта document
visibility
Появление-исчезновение
картинки
при наведении
<html>
<img id="my1" src="phantom.jpg"
onmouseover="document.all.my2.style.visibility='visible'">
<img id="my2" src="redcar.jpg"
onmouseout="document.all.my2.style.visibility='hidden'"
STYLE="visibility='hidden'"><br>
Машина появится при наведении курсора на картинку
<br>
утеса в море, а исчезнет при уходе курсора с машины
</html>
16