На этом шаге рассмотрим понятие состояния объекта.
Рассмотрим торговый автомат, отпускающий шоколадки. Как правило, после того как покупатель внесет деньги и нажмет кнопку, такой объект выдает выбранный продукт. Что произойдет, если покупатель сначала нажмет кнопку выбора шоколадки, а потом опустит деньги? Большинство автоматов при этом просто возвращают деньги и ничего не делают, так как пользователь нарушил основные правила их работы. Иначе говоря, автомат находился в определенном состоянии (ожидал внесения денежных средств), которое пользователь проигнорировал (нажав кнопку выбора в неподходящий момент).
Предположим теперь, что покупатель не обратил внимание на предупреждающий сигнал "Без сдачи" и опустил в автомат лишнюю сумму денег. В большинстве случаев автомат проглатывает лишние деньги.
В каждой из таких ситуаций на поведение объекта влияет его предыстория, т.е. последовательность совершаемых над ним действий. Такая зависимость поведения от событий и времени объясняется тем, что объект имеет внутреннее состояние. Например, одно из основных состояний торгового автомата определяется суммой денег, опущенных покупателем до нажатия кнопки выбора. Другое важное свойство автомата определяется количеством сдачи и шоколадок, имеющихся в его распоряжении. Этот пример позволяет сформулировать следующее определение. Состояние объекта характеризуется перечнем всех (как правило, статических) свойств данного объекта и текущими (как правило, динамическими) значениями каждого из этих свойств.
Одним из свойств торгового автомата является способность принимать дененые средства. Это статическое (фиксированное) свойство, т.е. оно представляет собой существенную характеристику торгового автомата. С другой стороны, этому свойству соответствует динамическое значение, характеризующее количество денежных средств, принятых в данный момент времени. Эта сумма увеличивается, когда покупатель вносит деньги в автомат, и уменьшается, когда кассир забирает деньги из автомата.
В некоторых случаях значения свойств объекта могут быть статическими, поэтому в определении использован термин "как правило, динамическими". Например, заводской номер торгового автомата является как статическим свойством, так и статическим значением.
Свойствами объекта называются отличительные характеристики, черты, качества или особенности, обеспечивающие его уникальность. Например, для лифта характерным является то, что он перемещается только вверх и вниз, а не в горизонтальном направлении. Свойства, как правило, являются статическими, поскольку они образуют неизменяемую природу объекта.
Оговорка "как правило" означает, что в некоторых ситуациях свойства объекта могут изменяться. Рассмотрим в качестве примера автономный робот, обладающий возможностью самостоятельного изучения окружающей среды. Сначала он рассматривает объект как фиксированный барьер, а затем, после самообучения, обнаруживает, что это дверь, которую можно открыть. В этом случае по мере получения новых знаний концептуальная модель мира, создаваемая роботом, приобретает новые свойства.
Все свойства имеют значения, которые могут быть простыми количественными характеристиками или обозначать другой объект. Например, состояние лифта может описываться числом 3, означающим номер текущего этажа. С другой стороны, состояние торгового автомата описывается в терминах других объектов, например, имеющихся в наличии шоколадок. Конкретные шоколадки, по существу, являются самостоятельными объектами. Их свойства отличаются от свойств торгового автомата (например, запас шоколадок может закончиться, а автомат не прекращает свое существование). Кроме того, над шоколадками и торговым автоматом выполняются разные операции. Таким образом, объекты и простые значения отличаются друг от друга: простые количественные характеристики (например, число 3) не зависят от времени, не изменяются и не принимают других значений, тогда как объекты существуют во времени, изменяются, имеют состояние, принимают разные значения, а также могут создаваться, уничтожаться и использоваться совместно [Lippman, S. 1989. C++ Primer. Reading, MA: Addison-Wesley, p. 185.].
Тот факт, что каждый объект имеет состояние, означает, что любой <>bобъект занимает определенный объем пространства (физического или в памяти компьютера).
Все объекты в системе инкапсулируют некое состояние, и все состояния в системе инкапсулируются объектами. Инкапсуляция состояния объекта — это необходимое, но не достаточное условие полного описания предназначения абстракции, выявленной на этапе проектирования.
Рассмотрим в качестве примера абстракцию личного дела сотрудника. На рис. 1 показана абстракция, описанная в виде класса с помощью унифицированного языка моделирования UML.
Рис.1. Абстракция СЛУЖАЩИЙ
Каждый компонент абстракции обозначает конкретное свойство личного дела служащего. Эта абстракция не является объектом, поскольку она не представляет собой конкретный экземпляр личного дела. Конкретизируя эту абстракцию, можно создать два разных объекта, например, Иванов и Петрова, занимающих определенный объем памяти (рис. 2).
Рис.2. Объекты ИВАНОВ и ПЕТРОВА
Каждый из этих объектов занимает свою собственную область памяти, хотя они очень похожи. Следовательно, их состояния имеют общее представление.
На практике принято инкапсулировать состояние объекта, а не открывать его для всех сущностей. С учетом сказанного изменим абстракцию (класс) следующим образом (рис. 3).
Рис.3. Класс СЛУЖАЩИЙ с защищенными атрибутами и открытыми операциями
Эта абстракция ненамного сложнее предыдущей, но по ряду соображений гораздо предпочтительнее. В частности, ее внутренняя реализация скрыта от внешних клиентов (т.е. защищена, что обозначается символом #). Если представление абстракции будет изменено, то придется повторно скомпилировать часть кода, но, с семантической точки зрения, на внешних клиентов это изменение никак не повлияет (иначе говоря, существующий код останется неизменным).
Кроме того, в данном представлении решена проблема занимаемой объектом памяти за счет явного определения операций (обязанностей), которые клиенты могут выполнять над объектами данного класса. В частности, все клиенты имеют право узнать имя, ИНН и место работы сотрудника (открытые операции обозначены символом +).
На следующем шаге рассмотрим понятие поведения объекта.