Понятие объекта
Программные системы призваны решать задачи, которые возникают в разнообразных областях деятельности человека. Программные системы создаются с помощью средств разработки программ – языков программирования, систем управления базами данных, операционных систем. Все эти средства имеют под собой прежде всего математическое основание – логику, теорию конечных автоматов, алгебру и т.д. Соответственно удобнее всего с их помощью решаются математические, вычислительные задачи: именно с них и начиналось программирование.
Программные системы предназначены для моделирования реальных систем, поэтому очень важно, в каких терминах мы пытаемся описывать эти реальные системы. Описание в виде последовательности действий (процедурный подход к программированию) оказалось слишком сложным. Объектно-ориентированный подход предлагает описывать системы в виде взаимодействия объектов.
Предположим, что мы должны разработать систему автоматизации банка. Для примера рассмотрим, как могла бы осуществляться операция снятия денег через банкомат (рисунок 1).
В данной операции задействованы три объекта: «клиент Иванов», «банкомат на Тверской» и
«счет № 66579801», который открыт в данном банке у г-на Иванова. Подойдя к банкомату и засунув свою карточку, объект «клиент Иванов» посылает банкомату сообщение «Начать работать». Получив такое сообщение, банкомат высвечивает какое-нибудь сообщение на экране и запрашивает код доступа. «Банкомат на Тверской» посылает сообщение «клиенту Иванову»: «Сообщите идентификационный номер». Если идентификация прошла успешно, «клиент Иванов» просит выдать ему 1000 рублей. Он посылает сообщение банкомату, а тот в свою очередь посылает сообщение объекту «счет № 66579801». Приняв это сообщение, объект «счет № 66579801» проверяет, есть ли у него 1000 рублей, и, если есть, пересылает разрешение на снятие денег, одновременно уменьшая свой баланс на соответствующую сумму. Банкомат передает деньги, и на этом процедура заканчивается.
Данное описание мы составили целиком в терминах взаимодействия объектов. Объекты выполняют необходимые действия, передавая друг другу сообщения.
Описание в терминах объектов достаточно близко к языку предметной области. С другой стороны, описание в терминах объектов достаточно строгое. Наличие в объектно-ориентированных языках программирования средств для реализации понятия объекта позволяет сравнительно просто перевести описание работы банкомата в работающую программу. Таким образом, объектно-ориентированный подход выполняет свою первую задачу – сокращение семантического разрыва между языком предметной области и языком программирования.
Описание в виде объектов позволяет выделить компоненты системы. Те же самые объекты – «счет № 66579801» и «клиент Иванов» - будут участвовать и в другой операции, при которой клиент приходит в отделение банка для снятия или зачисления денег на счет.
Особенности объектов
1. Каждый объект характеризуется своим внутренним состоянием. Состояние объекта характеризуется перечнем всех свойств данного объекта и текущими значениями каждого из этих свойств.
Пример – торговый автомат, продающий напитки. После опускания монеты и нажатия кнопки автомат выдает выбранный напиток. Что произойдет, если сначала будет нажата кнопка выбора напитка, а потом уже отпущена монета? Автомат ничего не сделает, так как пользователь нарушил основные правила. Или предположим, что пользователь не обратил внимания на предупреждающий сигнал «Бросить столько мелочи, сколько стоит напиток» и опустил в автомат лишнюю монету. В большинстве случаев автоматы не дружественны к пользователю и «радостно» заглатывают все деньги. В каждой из таких ситуаций мы видим, что поведение объекта определяется его историей, т.е. важна последовательность совершаемых над объектом действий. Такая зависимость поведения объекта от событий объясняется тем, что у объекта есть внутреннее состояние. Внутреннее состояние автомата определяется суммой денег, опущенных до нажатия кнопки выбора напитка. Банкомат состоит из множества частей, и для того, чтобы выдать наличные, он должен осуществить достаточно сложные манипуляции. Однако нас интересует не механическое устройство банкомата, а его возможности по выдаче денег. Все внутреннее устройство оказывается скрытым, спрятанным внутри объекта «банкомат». Подобный принцип построения систем, называемый инкапсуляцией, был применен при построении абстрактных типов данных. Подробности реализации той или иной операции, внутренняя структура объекта невидимы для остальных участников системы.
2. Состояние объекта характеризуется текущим значением его атрибутов.
В нашем примере у счета есть атрибут - баланс. В простейшем случае он выражается числом - количеством рублей и копеек. Операции снятия со счета и зачисления на счет изменяют баланс и состояние объекта. У объекта «банкомат» имеется несколько атрибутов. Количество денег в банкомате может характеризоваться атрибутом - числом. Состояние «включен» или «выключен» может выражаться логическим значением, для которого истина соответствует состоянию «включен», а ложь - состоянию «выключен». Также логическим значением «истина» или «ложь» можно выразить готовность банкомата к принятию запроса.
Атрибутами могут быть не только простейшие величины - числа, логические значения и т.п., но и сложные величины, объекты. Предположим, для целей контроля счет будет хранить историю всех транзакций. Транзакция сама по себе - это объект, который состоит из нескольких характеристик: типа транзакции (положить или снять), суммы переведенных денег, места, откуда была совершена операция (банкомат, отделение банка), и получателя (источника) денег. У объекта-счета атрибут «история транзакций» будет состоять из набора объектов-транзакций.
Все перечисленные атрибуты объектов могут изменяться. Баланс уменьшается или увеличивается, банкомат включается или выключается и т. д.
Однако не все атрибуты объекта могут изменяться. У объекта «счет» есть номер, по которому он отличается от всех остальных счетов. В отличие от баланса атрибут «номер» не может изменяться. До тех пор пока счет существует, он сохраняет свой номер. То же самое можно сказать об адресе банкомата, идентификационном коде клиента и т.д.
3. Идентификация объекта. Метод идентификации объекта должен отвечать на вопрос, как отличить один объект от другого. Иными словами, если имеются два объекта, как можно определить, что эти объекты разные.
На самом деле существуют два вопроса: равны ли два объекта и тождественны ли они. Предположим, в мешке лежат шары белого и черного цвета. Пусть каждый из них - объект. Мы вынимаем один шар, рассматриваем его и кладем обратно в мешок. Вытащив два раза шар из мешка, мы хотим знать, вытащили ли мы одинаковые шары или один и тот же шар.
Если все шары одного размера и веса и отличаются только цветом, вытащив подряд два черных шара, мы можем определенно утверждать, что шары равны. Ответить на вопрос, вытащили ли мы один и тот же шар, невозможно. Ответить на этот вопрос можно, если, например, все шары пронумерованы.
Точно так же, если программа обращается к двум объектам, она может сравнить все известные атрибуты объектов и определить, равны ли они. Для того чтобы сравнивать объекты на тождество, необходимо, чтобы у любого объекта существовала некоторая уникальная характеристика.
Во многих случаях один из атрибутов объекта по определению является уникальным. Например, для всех счетов в банковской системе атрибут «номер счета» должен быть уникальным, т.е. не может существовать двух счетов с одинаковым номером. Кроме того, как мы уже отмечали, номер является неизменяемым атрибутом объекта. Сравнив номера у двух счетов, можно однозначно сделать вывод о тождественности этих объектов.
Разумеется, чтобы такое сравнение работало, необходимо принять определенные меры. Создавая новый счет, необходимо присваивать ему номер, отличный от номеров всех существующих в настоящий момент счетов. Необходимо обеспечить неизменяемость номера счета при всех преобразованиях состояния объекта. В таком случае ответственность за правильность идентификации объекта лежит на программисте, разрабатывающем систему.
Перекладывая ответственность на разработчика, среда программирования создает возможности для ошибок.
Многие объектные модели предлагают встроенные методы идентификации объектов. При создании любого нового объекта ему присваивается уникальный идентификатор, отличающийся от идентификаторов всех остальных имеющихся в системе объектов. Форма этого идентификатора может быть различной.
Особое значение правильность идентификации объектов приобретает в распределенных системах, в которых программы, работающие на разных компьютерах, независимо друг от друга в произвольное время создают и уничтожают объекты.
4. Интерфейс объекта (поведение).
Важнейшей характеристикой объекта является описание того, как он может взаимодействовать с окружающим миром. Это описание называется интерфейсом объекта.
Объекты взаимодействуют между собой с помощью сообщений. Принимая сообщение, объект выполняет соответствующее действие. Эти действия обычно называются методами.
В нашем примере работы банкомата у объекта «счет № 66579801» имеются действия «снять деньги со счета» и «положить деньги на счет». Эти два действия (метода) и составляют интерфейс объекта. У объекта «клиент Иванов» имеется метод «сообщить свой код». У объекта «банкомат на Тверской» есть методы «начать работу», «принять деньги», «выдать деньги».
У объекта «счет» есть еще и атрибут - «баланс». Является ли атрибут частью интерфейса? Интерфейс - это внешнее описание объекта.
Наряду с методами и атрибутами, входящими в интерфейс и доступными другим объектам, у объекта могут быть методы или атрибуты, предназначенные для «внутреннего употребления», к которым может обращаться только сам объект.
Например, у банкомата имеется довольно сложная внутренняя структура и соответственно методы, заставляющие эти составные части работать вместе. Однако для банковской системы они не важны, и ни клиент, ни объект «счет» не могут к ним обращаться. Они не входят в интерфейс объекта «банкомат».
Подводя итог, можно сказать, что объект известен другим объектам только по своему интерфейсу. Внутренняя структура его скрыта. Важным следствием является возможность изменения внутренней структуры объекта независимо от других взаимодействующих с ним объектов. Если какая-либо часть банкомата будет заменена, в работе всех остальных участников банковской системы никаких изменений не произойдет.
Поведение объекта определяется выполняемыми над ним операциями и его состоянием.
Операции:
- модификатор – операция, которая изменяет состояние объекта;
- селектор – операция, считывающая состояние объекта, но не меняющая это состояние;
- итератор – операция, позволяющая организовать доступ ко всем частям объекта в строго
определённой последовательности.
Универсальные операции:
- конструктор – операция создания объекта и/или его инициализации;
- деструктор – операция освобождающая состояние объекта и/или разрушающая сам объект.
Приведем еще один пример. При разработке модели автомобиля нас может интересовать как внешнее поведение машины, так и ее структура. Внешнее поведение автомобиля описывается стимулами или сообщениями, ему посылаемыми, и реакцией автомобиля на эти сообщения. Поворот руля вызывает изменение направления движения, нажатие на тормоз - замедление движения, нажатие на педаль газа - ускорение. Для внешнего мира (для человека, управляющего автомобилем) автомобиль представляется объектом, у которого есть несколько методов: «повернуть руль», «нажать на тормоз», «прибавить газ» и т.д., и состоянием: направлением движения и скоростью.
Автомобиль в свою очередь состоит из узлов: двигателя, колес, коробки передач, руля и т.д. В ответ на внешнее сообщение автомобиль, рассматриваемый как система, передает необходимые сообщения внутренним узлам. Эти крупные узлы в свою очередь состоят из более мелких узлов и деталей.
Взаимозаменяемость узлов и деталей определяется тем, что новый узел обладает тем же самым интерфейсом, что и старый. Таким образом, определив интерфейс объекта на определенном уровне, мы добиваемся независимости реализации поведения объекта. При нажатии на газ любая машина должна разгоняться, а при нажатии на тормоз - замедляться, хотя, быть может, и с разной скоростью.
Если модель автомобиля используется в тренажере, замена одной модели другой не представляет труда до тех пор, пока обе они поддерживают один и тот же интерфейс. В свою очередь объект «автомобиль» является композицией других объектов, также взаимозаменяемых при сохранении интерфейса.
Хотя из приведенных примеров интуитивно ясно, что такое объект, дать его четкое и приемлемое для всех определение достаточно сложно. Объект - это слишком общее понятие.
У объекта есть состояние, поведение и возможность отличить его от других объектов.
Немного другое определение объекта: «Объект - это сущность, способная сохранять свое состояние (информацию) и обеспечивающая набор операций (поведение) для проверки и изменения этого состояния».
Объект - это модель или абстракция реальной сущности в программной системе. Предмет моделирования при построении объекта может быть различным и можно говорить о разных типах абстракции, используемой при построении объекта:
- объект - это модель какого-то понятия предметной области;
- объект объединяет набор операций для выполнения какой-либо функции;
- объект объединяет операции, которые используются другими, более высокими уровнями абстракции;
- объект объединяет не связанные между собой операции.
|