Автор Тема: Внутренний переход параллельного композитного состояния  (Прочитано 13285 раз)

Vadim

  • Full Member
  • ***
  • Сообщений: 150
  • Рейтинг читателей: 30
    • Просмотр профиля
Есть известная диаграмма (во вложении).
Если в состоянии DisplayAlarmTime & PlayingCD происходит событие Radio, то в какое наступит состояние:
  • DisplayAlarmTime & PlayingRadio (правило: если во внутреннем переходе для региона нет никаких указаний, то текущее состояние в регионе не изменяется)
  • DisplayCurrentTime & PlayingRadio (правило: если в переходе в параллельное композитное состояние для региона нет никаких указаний, то текущее состояние в регионе определяется начальным псевдосостоянием)?
« Последнее редактирование: 31 Марта 2016, 08:51:43 от Vadim »


Vadim

  • Full Member
  • ***
  • Сообщений: 150
  • Рейтинг читателей: 30
    • Просмотр профиля
Наверно, что-то не так сделал - ни одного ответа. А как правильно - не знаю...

Леонид

  • Hero Member
  • *****
  • Сообщений: 506
  • Рейтинг читателей: 61
    • Просмотр профиля
Наверно, что-то не так сделал - ни одного ответа.

Лично я ничё не понял. Можно по-русски все это повторить?

Vadim

  • Full Member
  • ***
  • Сообщений: 150
  • Рейтинг читателей: 30
    • Просмотр профиля
Есть диаграмма автомата (в стартовом сообщении).
Необходимо разобраться:
  • что произойдет (в соответствии с диаграммой), если в состоянии (композитном) DisplayAlarmTime & PlayingCD наступит событие Radio;
  • почему произойдет именно так (какое состояние станет активным и по какому правилу).

Григорий Печенкин

  • Member of CAR
  • Hero Member
  • *****
  • Сообщений: 1330
  • Рейтинг читателей: 58
    • Просмотр профиля
    • http://www.greesha.ru
Прекрасная иллюстрация случая, когда от диаграммы больше вреда, чем пользы.
greesha.ru

Реальность - это убийство прекрасной теории бандой мерзких фактов. (Роберт Гласс)

Galogen

  • Member of CAR
  • Hero Member
  • *****
  • Сообщений: 6060
  • Рейтинг читателей: 192
  • Аксакал
    • Просмотр профиля
    • Профиль в Моем Круге
Прекрасная иллюстрация случая, когда от диаграммы больше вреда, чем пользы.
Мне понравилась там метка от CUSTIS :)

Ну, в определенных условиях эта диаграмма вполне себе хороша. Хотя изобразить ее можно было бы более понятно.
Для меня очевидно, что при переходе из выключенного во включенное состояние
1. загорается и отображается текущее время - это начальное состояние в композите
2. не совсем ясно, но возможно (на что указывает неглубокая история) включается и играет радио

Если же устройство на момент вопроса отображало время будильника и проигрывало музыку CD и возникло событие Radio - включена кнопка - то вероятно CD отключается, начинает играть Радио, а система отображает время будильника.

Впрочем, признаюсь, такие сложные автоматы не моделировал, но можно попробовать в спарксе проиграть эту диаграммку

[прилетело НЛО и...]

  • Full Member
  • ***
  • Сообщений: 213
  • Рейтинг читателей: 26
    • Просмотр профиля
Здесь нет внутренних переходов. Переходы, начинающиеся с границы состояния On являются не внутренними, а локальными (и групповыми).
По стандарту владельцем перехода является регион. Может быть, этим и руководился Мартин Фаулер, приведший в своём "дистиллированном UML" эту диаграмму. Предположительно, он посчитал, что локальный переход по событию Radio относится только к его владельцу (нижнему региону) и подсостояниям, заключённым в нём.  По этой трактовке выходит, что DisplayAlarmTime & PlayingCD --Radio--> DisplayAlarmTime & PlayingRadio. Но в стандарте при описании групповых переходов ничего не говорится о регионах, а подчёркивается, что групповой переход исходит из (всего) композитного состояния. Поэтому возможна другая трактовка, по которой происходит выход из DisplayAlarmTime, т. е. групповой переход действует на все  подсостояния из обоих регионов On. И получается, что эта диаграмма ill formed.
Замечу, что попадается более прозрачная версия той же диаграммы, лишённая к тому же недостатка, из-за которого из PlayingRadio по событию Radio приходится выходить и тут же возвращаться обратно.
[...и улетело НЛО.]

[прилетело НЛО и...]

  • Full Member
  • ***
  • Сообщений: 213
  • Рейтинг читателей: 26
    • Просмотр профиля
Можно прибавить, что в книге Блахи и Рамбо есть пример другой диаграммы с такими же групповыми локальными переходами (стр. 151, рис. 6.11). Пример трактуется так же как у Фаулера.
P. S. Если бы на диаграмме Фауле переход был бы не локальным, а внешним, то после него была бы активной конфигурация состояний DisplayCurrentTime & PlayingRadio.
[...и улетело НЛО.]

[прилетело НЛО и...]

  • Full Member
  • ***
  • Сообщений: 213
  • Рейтинг читателей: 26
    • Просмотр профиля
Дефектом обоих вариантов диаграммы является отсутствие в нижнем регионе начального состояния и перехода из него в историческое псевдосостояние. Т. о. в любом случае диаграмма ill formed.
[...и улетело НЛО.]

Galogen

  • Member of CAR
  • Hero Member
  • *****
  • Сообщений: 6060
  • Рейтинг читателей: 192
  • Аксакал
    • Просмотр профиля
    • Профиль в Моем Круге
Читаем книгу UML. Основы, 3-е издание, М. Фаулера стр. 134, рис. 10.5. Текст

" Состояния могут быть разбиты на несколько параллельных состояний, запускаемых одновременно. На рис. 10.5 показан трогательно простой будильник, который может включать либо CD, либо радио и показывать либо текущее время, либо время сигнала. "

Хотелось бы остановиться на этой части. Как из представленной диаграммы следует, что будильник включается через CD или радио.
Правильно ли я понимаю, что это показывается тем фактом, что переход ON - вызывает включение или радио, или СД, И отображения времени? Как можно вообще понять что нижний регион это ИЛИ, а не И например?

Перевод текст отдельная тема для дискуссии, но

"Рис. 10.5 включает также состояние предыстории (history pseudostate). Это означает, что когда включены часы, опция радио/CD переходит в состояние, в котором находились часы, когда они были выключены. Стрелка, выходящая из предыстории, показывает, какое состояние существовало изначально, когда отсутствовала предыстория."

Разве из диаграммы следует что часы буду проигрывать или СД, или радио при включении.

И вновь - это небрежность Фаулера? Его ассистентов? Это не знание нотации Фаулером? Или это ошибка переводчика?

[прилетело НЛО и...]

  • Full Member
  • ***
  • Сообщений: 213
  • Рейтинг читателей: 26
    • Просмотр профиля
В исходном тексте:"Figure 10.5 shows a pathetically simple alarm clock that can play either CDs or the radio and show either the current time or the alarm time." То есть, имелось в виду, что когда будильник срабатывает (событие on), то может либо заиграть CD, либо заработать радио.
Второй фрагмент: "Figure 10.5 also includes a history pseudostate. This indicates that when the clock is switched on, the radio/CD choice goes back to the state the clock was in when it was turned off. The arrow from the history pseudostate indicates what state to be in on the first time when there is no history." То есть, переводчик снова отличился.

Пусть текущее состояние Off и происходит событие on. Совершается переход в композитное состояние с 2-мя ортогональными регионами. В этом переходе неявный fork, то есть, текущим станет сочетание из двух подсостояний, взятых из разных регионов. В верхнем регионе есть начальное псевдосостояние, следовательно, можно определить, что текущим станет DisplayTime. В нижнем регионе начального состояния нет. Значит, диаграмма ill formed. То, о чём пишет Фаулер, было бы справедливо, если бы нижний регион содержал начальное состояние. См. приложенный вариант. Подобные ошибки (псевдосостояние истории есть, а переходов в него нет) содержатся в книге Леоненкова.
На счёт И и ИЛИ стандарт указывает, что составные диаграммы как бы порождают И-ИЛИ дерево, описывающее какие конфигурации состояний допустимы. Для рассматриваемого примера дерево будет:
OR
 Off
 On
  AND
   OR
    DisplayTime
    DisplayAlarmTime
   OR
    PlayCD
    PlayRadio

Отдельно замечу, что на диаграмме отсутствуют действия и деятельности. То есть, работа радио, CD, отображение времени -- всё это в воображении. Автомат лишь переключается между состояниями, и больше ничего не делает. Тут было бы уместно вспомнить тему про то, чему не следует учить.
[...и улетело НЛО.]

Vadim

  • Full Member
  • ***
  • Сообщений: 150
  • Рейтинг читателей: 30
    • Просмотр профиля
Супер! Обсуждение стало конструктивным и результативным.
Цитировать
Переходы, начинающиеся с границы состояния On являются не внутренними, а локальными
Мой косяк :'(
Цитировать
Замечу, что попадается более прозрачная версия той же диаграммы, лишённая к тому же недостатка, из-за которого из PlayingRadio по событию Radio приходится выходить и тут же возвращаться обратно.
Эти диаграммы эквивалентны только тогда, когда нет действий (по терминологии Рамбо и Блаха) или активностей (по терминологии Фаулера) ни при выходе из состояния, ни при входе в состояние, ни при переходе. Например: пусть при входе в состояние Play(ing)Radio происходит настройка на "любимую" станцию. В одной диаграмме настройка будет происходить при любом событии Radio, а в другой - только если состояние Play(ing)CD.
Цитировать
В нижнем регионе начального состояния нет. Значит, диаграмма ill formed. То, о чём пишет Фаулер, было бы справедливо, если бы нижний регион содержал начальное состояние. См. приложенный вариант. Подобные ошибки (псевдосостояние истории есть, а переходов в него нет) содержатся в книге Леоненкова.
Многие источники (не только Фаулер) считают, что историческое псевдосостояние без входящего перехода, но с исходящим переходом заменяет начальное псевдосостояние, когда происходит первый вход. То есть, при первом входе в состояние On текущим состоянием в нижнем регионе становится Play(ing)Radio.
Интересная тема: возможные варианты сочетания начального и исторического псевдосостояний в одном регионе и наличия (отсутствия) исходящих (входящих) переходов исторического псевдосостояния (с начальным всё ясно: не более одного, никаких входящих и ровно один исходящий)!
« Последнее редактирование: 08 Апреля 2016, 09:02:20 от Vadim »

Galogen

  • Member of CAR
  • Hero Member
  • *****
  • Сообщений: 6060
  • Рейтинг читателей: 192
  • Аксакал
    • Просмотр профиля
    • Профиль в Моем Круге

А если, например, включение радио или CD происходит в зависимости от истории. Как это показать? Да, и все-таки, радио или CD включается всегда при включение будильника, или в момент возникновения события будильника? На диаграмме, например можно предположить отражение текущего времени, включения сигнала будильника (т.е. радио или плеера :)

Vadim

  • Full Member
  • ***
  • Сообщений: 150
  • Рейтинг читателей: 30
    • Просмотр профиля
Цитировать
радио или CD включается всегда при включение будильника
Когда текущим является композитное состояние с ортогональными регионами (On), тогда в каждом из регионов (верхний и нижний) текущим будет ровно одно из состояний региона (для верхнего: DisplayCurrentTime или DisplayAlarmTime, для нижнего: PlayRadio или PlayCD). А конкретный выбор в каждом случае и определяется наличием в регионах начальных и исторических псевдосостояний и переходами из них. То есть если будильник включен, то либо включено радио, либо включено CD.
Цитировать
А если, например, включение радио или CD происходит в зависимости от истории. Как это показать?
На диаграмме(ах) показано, что выбор, радио или CD будет включено при включении будильника, зависит от того, что было включено при выключении будильника (наличие исторического псевдосостояния). А то, что включается радио, если выключений будильника пока не было, показывает исходящий из исторического псевдосостояния переход. Такая на диаграмме(ах) зависимость от истории. Если нужна другая, то надо разобрать какая,

[прилетело НЛО и...]

  • Full Member
  • ***
  • Сообщений: 213
  • Рейтинг читателей: 26
    • Просмотр профиля
Эти диаграммы эквивалентны только тогда, когда нет действий (по терминологии Рамбо и Блаха) или активностей (по терминологии Фаулера) ни при выходе из состояния, ни при входе в состояние, ни при переходе. Например: пусть при входе в состояние Play(ing)Radio происходит настройка на "любимую" станцию. В одной диаграмме настройка будет происходить при любом событии Radio, а в другой - только если состояние Play(ing)CD.
Точно замечено.
Поэтому разумнее рассматривать примеры с действиями, что, возможно, расходилось с целью книги Фаулера -- дать беглый обзор языка.
Многие источники (не только Фаулер) считают, что историческое псевдосостояние без входящего перехода, но с исходящим переходом заменяет начальное псевдосостояние, когда происходит первый вход. То есть, при первом входе в состояние On текущим состоянием в нижнем регионе становится Play(ing)Radio.
Интересная тема: возможные варианты сочетания начального и исторического псевдосостояний в одном регионе и наличия (отсутствия) исходящих (входящих) переходов исторического псевдосостояния (с начальным всё ясно: не более одного, никаких входящих и ровно один исходящий)!
Если опираться на стандарт, то такие трактовки следует отвести. Псевдосостояние истории сродни начальному состоянию в том смысле, что это специальные обозначения, что (непосредственно) внутри региона их не может быть больше одного. Но назначения у них разные. Если нет входящих переходов в историческое псевдосостояние, то оно лишь указывает, что автомат запоминает историю, но воспользоваться этой историей в своём поведении он не может.
Вокруг начального много накручено. Несколько исходящих, случай, когда допускается триггер...
[...и улетело НЛО.]