Дж. Рамбо, М. Блаха - UML 2.0 - Объектно-ориентированное моделирование и разработка (1158633), страница 31
Текст из файла (страница 31)
Шкаф опять начал делать полный поворот, но вы не дали ему закончить оборот, уперевшись в него плечом. Друг передал вам свечу, и вместе вам удалось провернуть шкаф назад на пол-оборота. В результате друг остался за шкафом, а вы перед ним. Вы вставили свечу в подсвечник. Шкаф начал поворачиваться, вы вынули свечу и шкаф остановился на четверти оборота. Вы вместе вошли в коридор и отправились на поиски приключений. Подготовьте диаграмму состояний системы управления книжным шкафом, которая описывала бы приведенный выше пример. Что нужно было сделать с самого начала, чтобы войти в коридор без всяких проблем г Углубленное моделирование состояний Обычных диаграмм состояний достаточно для описания простых систем, но для сложных задач нужны средства помощнее.
Для моделирования сложных систем можно использовать вложенные диаграммы состояний, вложенные состояния, обобщение сигналов и параллелизм. Эта глава содержит сложный материал, который при первом чтении можно пропустить. 6.1. Вложенные диаграммы состояний 6.1.1.
Задачи с одноуровневыми диаграммами состояний Диаграммы состояний часто критикуются, потому что они якобы непрактичны для больших задач. Это верно для плоских, бесструктурных диаграмм состояний. Рассмотрим объект, имеющий и логических атрибутов, влияющих на управление. Представление такого объекта на одной плоской диаграмме потребовало бы 2" состояний. При разбиении состояния на и независимых диаграмм состояний потребовалось бы всего 2" состояний. Другой пример — диаграмма с рис.
6Д, на которой и' переходов соединяют все состояния попарно. Если переформулировать эту модель с использованием структуры, количество переходов можно снизить вплоть до и. Сложные системы обычно содержат много избыточной информации, которую можно исключить при помоши структурирования. 6.1.2. Разложение состояний Одним из способов организации модели является применение диаграммы вьы сокого уровня, отдельные состояния которой раскрываются на поддиаграммах.
Принцип аналогичен подстановке макросов в языках программирования. 6.2. Вложенные состояния 139 На рис. 6.2 показана такая диаграмма для торгового автомата. Изначально автомат находится в бездействии. Когда человек кидает монету в автомат, тот добавляет ее цену к обшему балансу. Положив несколько монет, человек может выбрать товар. Если данный товар кончился или денег для него недостаточно, автомат ждет, пока человек выберет что-иибудь другое. В противном случае автомат выдает товар и возврашает остаток с баланса. Рис.
6.1. Комбинаторный взрыв переходов на плоских диаграммах состояний Рис. 6.2. Диаграмма состояний торгового автомата На рис. 6.3 раскрывается состояние Жпмггм (Выдача). Вложенная диаграмма состояний называется зибгласлгюе (вложеииый конечный автомат). Вложенный автомат может вызываться как часть другого конечного автомата.
Для вызова вложенного автомата иа диаграмме указывается название состояния, после которого ставится двоеточие и название вложенного автомата. С концептуальной точки зрения вложенная диаграмма заменяет состояние внешней диаграммы. Фактически, вложенный конечный автомат — это нечто вроде подпрограммы для диаграммы состояний. 6.2. Вложенные состояния Состояние можно структурировать, а ие только заменять его вложенной диаграммой состояний. Вложение состояний может использоваться для выделения их обших черт и совместного использования поведения.
(В соответствии с ()МЕ2 140 Глава б ° Углубленное моделирование состояний мы не применяем к состояниям термин обобщение. Подробнее см. раздел Библиографические замечания в этой главе.) Рис. 6.3. Вложенный конечный автомат торгового автомата На рис. 6А представлена упрощенная модель телефонной линии нз главы 5. Один переход из Асйов (Активна) в И1е (Отключена) заменяет переходы из всех состояний в состояние И!в. Все состояния из главы 5, за исключением И1е, теперь становятся вложенными состояниями состояния Асг(ое. Осуществление события опНоо!г (наРычаг) в любом из вложенных состояний вызывает переход в И!е.
Название составного или комлозитного соолояния (сошрозйе агате) относится ко внешнему контуру, который охватывает все вложенные состояния. Таким образом, Асг(гм оказывается композитным состоянием со вложенными состояниями Риг1Топв (Гудок), Т1теоиг (Тайм-аут), Рга1(нд (НаборНомера) и т.
д. Состояния могут образовывать иерархию произвольной глубины вложенности. Каждое вложенное состояние получает исходящие переходы от содержащего его композитного состояния. Входящие переходы обязательно должны быть направлены в конкретное вложенное состояние, в противном случае возникает неоднозначность. На рис. 6.5 показана диаграмма состояний автоматической коробки передач.
Рукоятка коробки может находиться в трех положениях: назад, нейтраль и вперед. Если рукоятка находится в положении вперед, сама коробка передач может включать первую, вторую нли третью скорость. Состояния Г(гз! (Первая), БесоЫ (Вторая) и ТлЫ (Третья) являются вложенными по отношению к состоянию Гопвагг( (Вперед).
Каждое из вложенных состояний имеет общие с композитным состоянием исходящие переходы. На какой бы передаче вы ни переключились на нейтраль, переход будет выполнен. Переход из состояния Гопвагг! (Вперед) в состояние №игга! (Нейтраль) подразумевает целых три перехода, по одному с каждой из передач на нейтраль. При переключении с №игга! на Гопвап! происходит переход в состояние Гопвап1. Однако само состояние Гопвап1 является абстрактным, тогда как управление должно обязательно находиться в конкретном состоянии, поэтому реальный переход происходит в одно из вложенных состояний, а именно в состояние Ятг, потому что оно является начальным состоянием по умолчанию. Это показывает переход без названия из закрашенного кружка внутри контура состояния Гопвагг(.
По событию угор все три вложенных состояния переходят в состояние Г(гзг, что показывает переход с контура Гопвап1 в состояние Г(гзг. Это означает, что остановка машины приводит к переключению на первую передачу, на какой бы передаче мы перед этим ни ехали. Система обозначений позволяет описать более сложные ситуации, например явный переход из вложенного состояния в состояние, внешнее по отношению 6.2. Вложенные состояния 141 Рнопеыпв опНооз!61зсоппесН.'пе Ш1в Асзмв Т)твои! бо ! зоипбсоибВеер 01аПопе бо / зоипб01а1Топе 1)твои) Ууагп1пд бо / р1аумеззаде 619)11п) гзпеоиГ 6!ддГп) 0!а!!од Несом!во Мазза )пиз1ЫНитоег бо ) Р1ауМеззад питевгвизу уедбйипаег де е ВизуТопе бо l з1оаВизутопе Соппвсбпд бо Iдпбсоппесаоп Разгнизутопв бо l 1аМВизуТопе теззадепопе ггипяВизу й1пд)пд бо l пп9Ве11 сздебРЛопеЯпевегз / соппесд.!пе Соп пес!во сз))ебРЛопвНзпдзУр I бпсоп пес!Ыпе 01зсоппесзеб Рис.
6.4. Диаграмма состояний телефонной линии с вложенными состояниями к композитному состоянию, или явный переход из вложенного состояния на контур внешнего состояния. В подобных случаях все состояния должны находиться на одной диаграмме. В простых случаях, когда взаимодействие ограничивается запуском и завершением, вложенные состояния можно изображать на отдельных диаграммах и ссылаться на них, как на вложенные автоматы (см. пример на рис.
6.2). В простых задачах вложенные состояния можно реализовать, сделав диаграммы состояния плоскими. Можно также сделать каждое состояние классом, однако при этом важно следить за тем, чтобы не потерять индивидуальность объектов. Операция Ьесотез в языке Вша!!га)к позволяет объекту изменять класс, не теряя при этом индивидуальность, что облегчает преврашение состояния в класс.
Однако затраты на выполнение операции Ьесотез могут стать серьезной проблемой при частой смене состояний. Преврашение операции в класс оказывается невыгодным в С++, если не использовать сложные методы, подобные описанным в 1Сор11еп-92]. 1ауа в этом отношении так же неудобна, как и С++. 142 Глава б ° Углубленное моделирование состояний Деятельность при входе и при выходе особенно полезна на диаграммах с вложенными состояниями, потому что с ее помощью можно выражать состояние (в некоторых случаях — целую вложенную диаграмму) в терминах соответствуюшей деятельности при входе и при выходе, не заботясь о том, что происходило и будет происходить, когда состояние не активно.
Переход во вложенное состояние или из него может приводить к выполнению последовательности деятельности при входе и при выходе, если переход пересекает несколько уровней вложенности. Деятельность при входе осуществляется от внешних состояний к внутренним, а деятельность при выходе — наоборот. Это позволяет реализовать поведение, подобное поведению вызовов вложенных подпрограмм. Рмс. 6.5. Диаграмма состояний автоматической коробки передач 6.3.
Обобщение сигналов Сигналы могут образовывать иерархию обобшений, наследуя от предков свои атрибутьь На рис. 6.6 изображена часть дерева входных сигналов рабочей станции. Сигналы МоизеВиггоп (КнопкаМыши) и Кеубоагг(СБагасгег (КлавишаКлавиатуры) являются разновидностями пользовательского ввода. Оба сигнала наследуют атрибут Ивисе (устройство) от сигнала Пет!прис (ПользовательскийВвод) — корня дерева.
Сигналы МоизеВиггопОоит (КнопкаМышиВниз) и МоизеВиггопУр (КнопкаМышиВверх) наследуют атрибут 1осайоп (координаты) от сигнала МоизеВиггоп (КнопкаМыши). Класс КеуЬоап1СЬагасгег (КлавишаКлавиатуры) может быть разделен на Сопле! (Управляюгцая) и Сгарй(с (Графическая). В конечном итоге любой сигнал можно считать листом дерева обобщений сигналов. На диаграмме состояний сигнал может переключать переходы, в определении которых указаны сигналы, являюшиеся его предками.
Например, нажатие клавиши а вызовет переход, переключаемый сигналом А1рйаУитепс (АлфавитноЦифровая), а также переход, переключаемый сигналом КеуЬоагс(СЬагасгег (КлавишаКлавиатуры). Мы рекомендуем делать все сигналы-предки абстрактными, как и при обобшении классов. Иерархия сигналов позволяет использовать в модели разные уровни абстракции.
Например, некоторые состояния могут одинаково обрабатывать все входяшие символы, тогда как другие могут обрабатывать управляюшие символы иначе, чем печатные, а третьи могут интерпретировать каждый нажатый символ по-своему. 6А. Параллелизм 143 Рис. 6.6.