Шаг 34.
Унифицированный язык моделирования UML.
Поведение объекта

    На этом шаге рассмотрим понятие поведения объекта.

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

    Поведение — это действия и реакции объекта, выраженные через изменения состояния объекта и передачу сообщений.

    Иначе говоря, поведение объекта — это его видимая извне деятельность.

    Операцией называется определенное воздействие одного объекта на другой с целью вызвать некую реакцию. Например, клиент может активизировать операции append и pop, чтобы увеличить или уменьшить объект-очередь. Кроме того, выполнив операцию length, клиент может определить размер очереди, но не может изменить ее состояние.

    В языке Java операции, которые может выполнить клиент, называются методами. Используя терминологию языков, являющихся наследниками процедурно- ориентированных языков программирования, например, языка C++, говорят, что один объект вызывает функцию-член другого. В чистых объектно-ориентированных языках, таких как Smalltalk, это явление описывается как передача сообщений между объектами. Сообщение — это операция, которую один объект выполняет над другим, хотя механизмы диспетчеризации сообщений и операции отличаются друг от друга. В дальнейшем будем считать термины операция и сообщение синонимами.

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

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

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

    Операция — это услуга, которую класс оказывает своим клиентам. На практике клиент обычно совершает над объектами операции пяти видов. Ниже перечислены три наиболее распространенных вида операции:

  1. Модификатор: операция, изменяющая состояние объекта.
  2. Селектор: операция, имеющая доступ к состоянию объекта, но не изменяющая его.
  3. Итератор: операция, обеспечивающая доступ ко всем частям объекта в строго определенном порядке.

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

  1. Конструктор: операция, создающая объект и/или инициализирующая его состояние.
  2. Деструктор: операция, стирающая состояние объекта и/или уничтожающая сам объект.

    В языке C++ конструктор и деструктор являются частью определения класса, а в языке Java есть конструкторы, но нет деструкторов. В языке Smalltalk эти операции обычно образуют часть протокола метакласса (т.е. класса классов).

    Совокупность всех методов, связанных с конкретным объектом, образует его протокол. Таким образом, протокол объекта описывает поведение объекта и содержит все его статические и динамические свойства. Работая со сложными абстракциями, полезно разделять протокол на логические группы свойств. Эти свойства описывают роли, которые может исполнять объект. Роль — это маска, которую носит объект [Adams, S. 1993. Private communication.]. Она определяет контракт абстракции с ее клиентами.

    "Обязательства объекта выражают смысл его предназначения и место в системе. Обязательства — это совокупность всех услуг, предусмотренных во всех контрактах" [Wirfs-Brock, R., Wilkerson, В., and Wiener, L. 1990. Designing Object-Oriented Software. Englewood Cliffs, NJ: Prentice Hall, p. 61.]. Иначе говоря, можно сказать, что состояние и поведение объекта совместно определяют исполняемые им роли, а те, в свою очередь, обеспечивают выполнение обязанностей данной абстракции.

    Действительно, подавляющее большинство интересных объектов исполняют на протяжении своего существования самые разные роли. Рассмотрим следующие примеры [Rubin, K. 1993. Private communication.]:

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

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

    Наличие внутреннего состояния объектов означает, что порядок выполнения операций имеет большое значение. Это обстоятельство наводит на мысль представить объект в качестве маленького независимого автомата [Macintosh MacApp 1.1.1 Programmer s Reference. 1986. Cupertino, CA: Apple Computer, p. 4.]. Действительно, для ряда объектов временное расписание событий настолько важно, что наилучшим способом их формального описания является эквивалентный конечный автомат.

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

    Таким образом, активные объекты системы — это источники управляющих воздействий (roots of control). Если в системе существуют несколько потоков управления, то в ней обычно действуют несколько активных объектов. С другой стороны, в последовательных системах в каждый момент времени существует, как правило, только один активный объект, например, диспетчер, распределяющий сообщения. В таких архитектурах все остальные объекты являются пассивными, а их поведение изменяется только тогда, когда они получают сообщение от активного объекта.

    В последовательных архитектурах другого типа (например, в системах обработки транзакций) нет явного центра активности, и управление распределено среди пассивных объектов системы.

    На следующем шаге рассмотрим понятие индивидуальности объекта.




Предыдущий шаг Содержание Следующий шаг