Понятие объекта

Программные системы призваны решать задачи, которые возникают в разнообразных областях деятельности человека. Программные системы создаются с помощью средств разработки программ – языков программирования, систем управления базами данных, операционных систем. Все эти средства имеют под собой прежде всего математическое основание – логику, теорию конечных автоматов, алгебру и т.д. Соответственно удобнее всего с их помощью решаются математические, вычислительные задачи: именно с них и начиналось программирование.

Программные системы предназначены для моделирования реальных систем, поэтому очень важно, в каких терминах мы пытаемся описывать эти реальные системы. Описание в виде последовательности действий (процедурный подход к программированию) оказалось слишком сложным. Объектно-ориентированный подход предлагает описывать системы в виде взаимодействия объектов.

Предположим, что мы должны разработать систему автоматизации банка. Для примера рассмотрим, как могла бы осуществляться операция снятия денег через банкомат (рисунок 1).
В данной операции задействованы три объекта: «клиент Иванов», «банкомат на Тверской» и
«счет № 66579801», который открыт в данном банке у г-на Иванова. Подойдя к банкомату и засунув свою карточку, объект «клиент Иванов» посылает банкомату сообщение «Начать работать». Получив такое сообщение, банкомат высвечивает какое-нибудь сообщение на экране и запрашивает код доступа. «Банкомат на Тверской» посылает сообщение «клиенту Иванову»: «Сообщите идентификационный номер». Если идентификация прошла успешно, «клиент Иванов» просит выдать ему 1000 рублей. Он посылает сообщение банкомату, а тот в свою очередь посылает сообщение объекту «счет № 66579801». Приняв это сообщение, объект «счет № 66579801» проверяет, есть ли у него 1000 рублей, и, если есть, пересылает разрешение на снятие денег, одновременно уменьшая свой баланс на соответствующую сумму. Банкомат передает деньги, и на этом процедура заканчивается.

Данное описание мы составили целиком в терминах взаимодействия объектов. Объекты выполняют необходимые действия, передавая друг другу сообщения.

Описание в терминах объектов достаточно близко к языку предметной области. С другой стороны, описание в терминах объектов достаточно строгое. Наличие в объектно-ориентированных языках программирования средств для реализации понятия объекта позволяет сравнительно просто перевести описание работы банкомата в работающую программу. Таким образом, объектно-ориентированный подход выполняет свою первую задачу – сокращение семантического разрыва между языком предметной области и языком программирования.

Описание в виде объектов позволяет выделить компоненты системы. Те же самые объекты – «счет № 66579801» и «клиент Иванов» - будут участвовать и в другой операции, при которой клиент приходит в отделение банка для снятия или зачисления денег на счет.

Особенности объектов

1. Каждый объект характеризуется своим внутренним состоянием. Состояние объекта характеризуется перечнем всех свойств данного объекта и текущими значениями каждого из этих свойств.

Пример – торговый автомат, продающий напитки. После опускания монеты и нажатия кнопки автомат выдает выбранный напиток. Что произойдет, если сначала будет нажата кнопка выбора напитка, а потом уже отпущена монета?  Автомат ничего не сделает, так как пользователь нарушил основные правила. Или предположим, что пользователь не обратил внимания на предупреждающий сигнал «Бросить столько мелочи, сколько стоит напиток» и опустил в автомат лишнюю монету. В большинстве случаев автоматы не дружественны к пользователю и «радостно» заглатывают все деньги. В каждой из таких ситуаций мы видим, что поведение объекта определяется его историей, т.е. важна последовательность совершаемых над объектом действий. Такая зависимость поведения объекта от событий объясняется тем, что у объекта есть внутреннее состояние. Внутреннее состояние автомата определяется суммой денег, опущенных до нажатия кнопки выбора напитка. Банкомат со­стоит из множества частей, и для того, чтобы выдать наличные, он должен осуществить достаточно сложные манипуляции. Однако нас интересует не механическое устройство банкомата, а его возмож­ности по выдаче денег. Все внутреннее устройство оказывается скрытым, спрятанным внутри объекта «банкомат». Подобный принцип построения систем, называемый инкапсуляцией, был при­менен при построении абстрактных типов данных. Подробно­сти реализации той или иной операции, внутренняя структура объекта невидимы для остальных участников системы.

2. Состояние объекта характеризуется текущим значением его атрибутов. 

В нашем примере у счета есть атрибут - баланс. В про­стейшем случае он выражается числом - количеством рублей и ко­пеек. Операции снятия со счета и зачисления на счет изменяют ба­ланс и состояние объекта. У объекта «банкомат» имеется несколь­ко атрибутов. Количество денег в банкомате может характеризо­ваться атрибутом - числом. Состояние «включен» или «выключен» может выражаться логическим значением, для которого истина со­ответствует состоянию «включен», а ложь - состоянию «выключен». Также логическим значением «истина» или «ложь» можно выра­зить готовность банкомата к принятию запроса.

Атрибутами могут быть не только простейшие величины - чис­ла, логические значения и т.п., но и сложные величины, объекты. Предположим, для целей контроля счет будет хранить историю всех транзакций. Транзакция сама по себе - это объект, который состо­ит из нескольких характеристик: типа транзакции (положить или снять), суммы переведенных денег, места, откуда была совершена операция (банкомат, отделение банка), и получателя (источника) денег. У объекта-счета атрибут «история транзакций» будет состо­ять из набора объектов-транзакций.

Все перечисленные атрибуты объектов могут изменяться. Баланс уменьшается или увеличивается, банкомат включается или выклю­чается и т. д.

Однако не все атрибуты объекта могут изменяться. У объекта «счет» есть номер, по которому он отличается от всех остальных счетов. В отличие от баланса атрибут «номер» не может изменять­ся. До тех пор пока счет существует, он сохраняет свой номер. То же самое можно сказать об адресе банкомата, идентификационном коде клиента и т.д.

3. Идентификация объекта. Метод идентификации объекта должен отвечать на вопрос, как отличить один объект от другого. Иными словами, если имеются два объекта, как можно определить, что эти объекты разные.

На самом деле существуют два вопроса: равны ли два объекта и тождественны ли они. Предположим, в мешке лежат шары бело­го и черного цвета. Пусть каждый из них - объект. Мы вынимаем один шар, рассматриваем его и кладем обратно в мешок. Вытащив два раза шар из мешка, мы хотим знать, вытащили ли мы одинако­вые шары или один и тот же шар.

Если все шары одного размера и веса и отличаются только цве­том, вытащив подряд два черных шара, мы можем определенно утверждать, что шары равны. Ответить на вопрос, вытащили ли мы один и тот же шар, невозможно. Ответить на этот вопрос мож­но, если, например, все шары пронумерованы.

Точно так же, если программа обращается к двум объектам, она может сравнить все известные атрибуты объектов и определить, равны ли они. Для того чтобы сравнивать объекты на тождество, необходимо, чтобы у любого объекта существовала некоторая уни­кальная характеристика.

Во многих случаях один из атрибутов объекта по определению является уникальным. Например, для всех счетов в банковской системе атрибут «номер счета» должен быть уникальным, т.е. не может существовать двух счетов с одинаковым номером. Кроме того, как мы уже отмечали, номер является неизменяемым атрибутом объекта. Сравнив номера у двух счетов, можно однозначно сде­лать вывод о тождественности этих объектов.

Разумеется, чтобы такое сравнение работало, необходимо при­нять определенные меры. Создавая новый счет, необходимо при­сваивать ему номер, отличный от номеров всех существующих в настоящий момент счетов. Необходимо обеспечить неизменяе­мость номера счета при всех преобразованиях состояния объек­та. В таком случае ответственность за правильность идентифи­кации объекта лежит на программисте, разрабатывающем сис­тему.

Перекладывая ответственность на разработчика, среда програм­мирования создает возможности для ошибок.

Многие объектные модели предлагают встроенные методы идентификации объектов. При создании любого нового объекта ему присваивается уникальный идентификатор, отличающийся от идентификаторов всех остальных имеющихся в системе объектов. Форма этого идентификатора может быть различной.

Особое значение правильность идентификации объектов при­обретает в распределенных системах, в которых программы, рабо­тающие на разных компьютерах, независимо друг от друга в про­извольное время создают и уничтожают объекты.

4. Интерфейс объекта (поведение).

Важнейшей характеристикой объекта является описание того, как он может взаимодействовать с окружающим миром. Это опи­сание называется интерфейсом объекта.

Объекты взаимодействуют между собой с помощью сообщений. Принимая сообщение, объект выполняет соответствующее действие. Эти действия обычно называются методами.

В нашем примере работы банкомата у объекта «счет № 66579801» имеются действия «снять деньги со счета» и «положить деньги на счет». Эти два действия (метода) и составляют интерфейс объекта. У объекта «клиент Иванов» имеется метод «сообщить свой код». У объекта «банкомат на Тверской» есть методы «начать работу», «принять деньги», «выдать деньги».

У объекта «счет» есть еще и атрибут - «баланс». Является ли атрибут частью интерфейса? Интерфейс - это внешнее описание объекта.

Наряду с методами и атрибутами, входящими в интерфейс и доступными другим объектам, у объекта могут быть методы или атрибуты, предназначенные для «внутреннего употребления», к которым может обращаться только сам объект.

Например, у банкомата имеется довольно сложная внутренняя структура и соответственно методы, заставляющие эти составные части работать вместе. Однако для банковской системы они не важ­ны, и ни клиент, ни объект «счет» не могут к ним обращаться. Они не входят в интерфейс объекта «банкомат».

Подводя итог, можно сказать, что объект известен другим объек­там только по своему интерфейсу. Внутренняя структура его скры­та. Важным следствием является возможность изменения внутрен­ней структуры объекта независимо от других взаимодействующих с ним объектов. Если какая-либо часть банкомата будет заменена, в работе всех остальных участников банковской системы никаких изменений не произойдет.

Поведение объекта определяется выполняемыми над ним операциями и его состоянием.

Операции:
- модификатор – операция, которая изменяет состояние объекта;
- селектор – операция, считывающая состояние объекта, но не  меняющая это состояние;
- итератор – операция, позволяющая организовать доступ ко всем  частям объекта в строго           
                     определённой  последовательности.


Универсальные операции:
- конструктор – операция создания объекта и/или его инициализации;
- деструктор – операция освобождающая состояние объекта и/или разрушающая сам объект.

Приведем еще один пример. При разработке модели автомоби­ля нас может интересовать как внешнее поведение машины, так и ее структура. Внешнее поведение автомобиля описывается стиму­лами или сообщениями, ему посылаемыми, и реакцией автомобиля на эти сообщения. Поворот руля вызывает изменение направления движения, нажатие на тормоз - замедление движения, нажатие на педаль газа - ускорение. Для внешнего мира (для человека, управ­ляющего автомобилем) автомобиль представляется объектом, у ко­торого есть несколько методов: «повернуть руль», «нажать на тор­моз», «прибавить газ» и т.д., и состоянием: направлением движе­ния и скоростью.

Автомобиль в свою очередь состоит из узлов: двигателя, колес, коробки передач, руля и т.д. В ответ на внешнее сообщение автомо­биль, рассматриваемый как система, передает необходимые сооб­щения внутренним узлам. Эти крупные узлы в свою очередь состо­ят из более мелких узлов и деталей.

Взаимозаменяемость узлов и деталей определяется тем, что но­вый узел обладает тем же самым интерфейсом, что и старый. Таким образом, определив интерфейс объекта на определенном уровне, мы добиваемся независимости реализации поведения объекта. При нажатии на газ любая машина должна разгоняться, а при нажатии на тормоз - замедляться, хотя, быть может, и с разной скоростью.

Если модель автомобиля используется в тренажере, замена од­ной модели другой не представляет труда до тех пор, пока обе они поддерживают один и тот же интерфейс. В свою очередь объект «ав­томобиль» является композицией других объектов, также взаимо­заменяемых при сохранении интерфейса.

Хотя из приведенных примеров интуитивно ясно, что такое объект, дать его четкое и приемлемое для всех определение доста­точно сложно. Объект - это слишком общее понятие.
У объек­та есть состояние, поведение и возможность отличить его от других объектов.

Немного другое определение объекта: «Объект - это сущность, способная сохранять свое состояние (ин­формацию) и обеспечивающая набор операций (поведение) для проверки и изменения этого состояния».

Объект - это модель или абстракция реальной сущности в про­граммной системе. Предмет моделирования при построении объек­та может быть различным и можно говорить о разных типах абстракции, используемой при построении объекта:

  • объект - это модель какого-то понятия предметной области;
  • объект объединяет набор операций для выполнения какой-либо функции;
  • объект объединяет операции, которые используются другими, более высокими уровнями абстракции;
  • объект объединяет не связанные между собой операции.

 

Среда, 08.05.2024, 06:41
Приветствую Вас Гость