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

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

  • Sr. Member
  • ****
  • Сообщений: 298
  • Рейтинг читателей: 27
    • Просмотр профиля
Недопустимое сочетание: пусть есть одна глубокая и две неглубокие истории - получается глубокая совместна с каждой неглубокой, а неглубокие между собой нет!
Да. Получается. А что в этом недопустимого? Содержание то у глубокой и неглубокой (если они осмысленно используются) может быть разным и меняться в разные моменты. Совместность означает, что мы работаем на обоих уровнях.
Не то чтобы я настаиваю на единственности/зависимости памятей. Но для меня "вертолётная площадка" - это не признак "отдельной" истории, а признак обращения к "общей" истории, а звено, выходящее из "вертолётной площадки" - указание что делать, если в этой "общей" истории ничего не записано (или записано "особое" значение).
При таком подходе, я полагаю, "площадка" становится чем-то вроде оперения у стрелки псевдозвена. (Как у некоторых математиков стрелки из ниоткуда помечали начальные состояния автоматов. У Харела кружок начального состояния столь мал, что похож на оперение стрелки.) Но в оперение-"площадку" входит переход. Т. е. она -- вершина. А зачем одну общую предысторию представлять несколькими разными вершинами? Как глазом увидеть, что она общая? Почему видимые несколько "площадок" надо в голове объединять? Разве это наглядно?
Как-то не очень хорошо выглядит - при одних входах работаем ровно с одной памятью, а при других - со всеми памятями. Да и что называем "входом" - пересечение границы композитного состояния снаружи внутрь, которое заканчивается на "вертолётной площадке" или ещё где-нибудь?
Называем любой вход в состояние и любой вход в предысторию. Если не хочется работать с двумя памятями, можно ввести понятие памяти по умолчанию и метить её спецтегом. Например, правую пометим спецтегом. Далее, если не знаем, куда писать (вошли не в предысторию), то пишем по дефолту вправо.)
У Харела в статьях про Statemate и Rhapsody явно говорится, что "площадка" в состоянии одна, на минуточку. В тех же статьях, кстати, есть двузубцы с choice/junction, растущие из начальных состояний. Привет от Харела составителям стандарта [и мне].))

А как воспринимать звено, которое заканчивается на "вертолётной площадке", но не пересекает границы композитного состояния (Harel "STATECHARTS: A VISUAL FORMALISM FORCOMPLEX SYSTEMS*" Fig.14)?
Как переход в запомненное в истории состояние. Или в дефолтную предысторию, если ничего не запомнено. Или в [дефолтное] начальное состояние, если дефолтной предыстории нет, или не можем понять, какая она.
Попутно вопрос по этой диаграмме: вместо использования конструкции с историческим псевдосостоянием можно завести внутренний переход в состоянии update (хотя бы в UML)?
у него там, как я понял, идея в том, чтобы параметризовать эффект такого перехода (в зависимости от состояния апдейтить разные переменные). Почему там важно оставаться внутри композитного состояния, я не уяснил, но пусть так. В UML придётся завести по локальному переходу со своим эффектом в каждом подсостоянии. Если эффект одинаков, то локальный переход может быть общим и лежать в композитном состоянии. 
[...и улетело НЛО.]


Vadim

  • Full Member
  • ***
  • Сообщений: 202
  • Рейтинг читателей: 34
    • Просмотр профиля
Но в оперение-"площадку" входит переход.
В общем случае - не менее одного перехода. Причём это правило действует на все вершины (состояния и псевдосостояния), кроме начального (у начального своё правило - если оно относится к композитному состоянию, не менее одного перехода к этому композитному состоянию). Смысл - любая вершина должна быть достижимой.
Т. е. она -- вершина. А зачем одну общую предысторию представлять несколькими разными вершинами?
Для того, чтобы показать разные варианты поведения (когда историческая память не содержит никакого значения).
Как глазом увидеть, что она общая? Почему видимые несколько "площадок" надо в голове объединять? Разве это наглядно?
То, что она общая - заложено в семантике (в одной из возможных семантик).
Мне подумалось, что ограничение на единственность исторического псевдосостояния в рамках композитного состояния (в разных источниках) обусловлена тем, что:
  • прагматичность нескольких исторических псевдосостояний невелика
  • определить предпочтительную семантику при нескольких исторических псевдосостояниях нелегко
В тех же статьях, кстати, есть двузубцы с choice/junction, растущие из начальных состояний. Привет от Харела составителям стандарта [и мне].))
Если имеется в виду Fig. 18. из "The Rhapsody Semantics of Statecharts", то всё нормально - из начального псевдосостояния ровно одно звено, без триггера и условия.
у него там, как я понял, идея в том, чтобы параметризовать эффект такого перехода (в зависимости от состояния апдейтить разные переменные). Почему там важно оставаться внутри композитного состояния, я не уяснил, но пусть так. В UML придётся завести по локальному переходу со своим эффектом в каждом подсостоянии. Если эффект одинаков, то локальный переход может быть общим и лежать в композитном состоянии. 
Сформулирую вопрос по другому - если композитное состояние имеет внутренний переход, то это:
  • недопустимо
  • означает, что все подчиненные состояния имеют такой внутренний переход
  • означает, что все подчиненные состояния имеют внешний переход в себя с указанными свойствами (триггер, условие, действие). Этот вариант мне не нравится, да и Харел моделирует его локальным переходом к историческому псевдосостоянию (Fig. 34. "STATECHARTS: A VISUAL FORMALISM FOR COMPLEX SYSTEMS*")

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

  • Sr. Member
  • ****
  • Сообщений: 298
  • Рейтинг читателей: 27
    • Просмотр профиля
В общем случае - не менее одного перехода. Причём это правило действует на все вершины (состояния и псевдосостояния), кроме начального (у начального своё правило - если оно относится к композитному состоянию, не менее одного перехода к этому композитному состоянию). Смысл - любая вершина должна быть достижимой.
Хорошо бы описать, что такое вершина, что общего между разными типами вершин, и обосновать дискриминацию разных типов вершин.

Для того, чтобы показать разные варианты поведения (когда историческая память не содержит никакого значения).
Может быть, рассмотреть другой способ?

То, что она общая - заложено в семантике (в одной из возможных семантик).
Мне подумалось, что ограничение на единственность исторического псевдосостояния в рамках композитного состояния (в разных источниках) обусловлена тем, что:
  • прагматичность нескольких исторических псевдосостояний невелика
  • определить предпочтительную семантику при нескольких исторических псевдосостояниях нелегко
Мне понравился прагматизм Рамбо, высказавшегося в своём интерью, что стандартизация языку моделирования не обязательна. Для каких-то задач множественные исторические псевдосостояния могут быть полезны. В этих случаях оправдано расширить язык. Сделать свой DSL для моделирования автоматов.
Поиски примеров диаграмм с глубокой и неглубокой предысторией в одном состоянии привели к задаче из студенческого quiz-а, не имеющей никакого смысла, кроме проверки знаний. Интересно найти что-то более жизненное для множественных предысторий.

Если имеется в виду Fig. 18. из "The Rhapsody Semantics of Statecharts", то всё нормально - из начального псевдосостояния ровно одно звено, без триггера и условия.
Как мы обсуждали, в стандарте нет явной градации на звенья и переходы. Диаграмму можно трактовать так, что из начального состояния выходит один составной переход, на котором есть сторожа.

Сформулирую вопрос по другому - если композитное состояние имеет внутренний переход, то это:
  • недопустимо
  • означает, что все подчиненные состояния имеют такой внутренний переход
  • означает, что все подчиненные состояния имеют внешний переход в себя с указанными свойствами (триггер, условие, действие). Этот вариант мне не нравится, да и Харел моделирует его локальным переходом к историческому псевдосостоянию (Fig. 34. "STATECHARTS: A VISUAL FORMALISM FOR COMPLEX SYSTEMS*")
Я уверен в ответе 2 (с уточнениями). Обоснование видел в "A Crash Course in UML State Machines" M. Samek. Там есть пример с перекрывающимися разноуровневыми локальными переходами у вложенных состояний.
[...и улетело НЛО.]

Vadim

  • Full Member
  • ***
  • Сообщений: 202
  • Рейтинг читателей: 34
    • Просмотр профиля
Хорошо бы описать, что такое вершина, что общего между разными типами вершин, и обосновать дискриминацию разных типов вершин.
Вершина (Vertex) = состояние (State) + псевдосостояние (Pseudostate). Потом, при рассмотрении вложенных автоматов (StateMachine), возможно добавятся и ссылки на точки соединения (ConnectionPointReference). А такое дискриминация вершин?
Может быть, рассмотреть другой способ?
Какой (кроме junction/choice после звена из "вертолётной площадки")?
Как мы обсуждали, в стандарте нет явной градации на звенья и переходы. Диаграмму можно трактовать так, что из начального состояния выходит один составной переход, на котором есть сторожа.
В описании (диаграмме) автомата есть только звенья (Transition). У каждого звена ровно 1 вершина-исто(чни)к и ровно 1 вершина-цель.
Я уверен в ответе 2 (с уточнениями). Обоснование видел в "A Crash Course in UML State Machines" M. Samek. Там есть пример с перекрывающимися разноуровневыми локальными переходами у вложенных состояний.
Принято

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

  • Sr. Member
  • ****
  • Сообщений: 298
  • Рейтинг читателей: 27
    • Просмотр профиля
Вершина (Vertex) = состояние (State) + псевдосостояние (Pseudostate). Потом, при рассмотрении вложенных автоматов (StateMachine), возможно добавятся и ссылки на точки соединения (ConnectionPointReference). А такое дискриминация вершин?
Это понятно, но зачем выделяется такая категория? Очевидно же, что автомат лишь визуально состоит из вершин и звеньев, а на самом деле определяет правила переключения между конфигурациями состояний и сопутствующее поведение. У отделённого сиамского близнеца диаграмм состояний -- диаграмм деятельности -- контрольные узлы никто не называет псевдоузлами, например. И не говорит о стабильности.
Дискриминация: кому можно, а кому нельзя entry, exit, do, входящие звенья, исходящие звенья.
Какой (кроме junction/choice после звена из "вертолётной площадки")?
Заручимся тем, что Харел придумал чистить предысторию спец. действием. По его плохому примеру разрешим проверять, пуста ли предыстория в стороже. Тогда, в Вашем примере можно рисовать двузубец с choice, первый зуб которого идёт в "вертолётную площадку" (одну! общую!) и имеет сторожа [not EmptyHistory], второй идёт в предысторию по умолчанию и имеет сторожа [else]. Прелесть в том, что можно рисовать трезубец, n-зубец  и описывать условные дефолтные предыстории.
Другой способ менее выразительный -- разрешить переходам в предысторию иметь второе дополнительное (пунктирное:) остриё, указывающее на дефолтную предысторию для этого перехода. Основное (сплошное) остриё идёт только в "площадку" (которая одна, общая).

В описании (диаграмме) автомата есть только звенья (Transition). У каждого звена ровно 1 вершина-исто(чни)к и ровно 1 вершина-цель.
Такое прочтение возможно. С другой стороны можно видеть (в тексте, не в метамодели!) составные переходы (compound transition) и всюду дальше их первого упоминания подозревать, что транзишэнами называют и их и звенья. Довольно бессмысленно, на мой взгляд, запрещать в стандарте проводить из начального псевдосостояния несколько исходящих звеньев, но разрешать(?) рисовать хареловский эквивалентный им N-зубец с choice/junction.
[...и улетело НЛО.]

Vadim

  • Full Member
  • ***
  • Сообщений: 202
  • Рейтинг читателей: 34
    • Просмотр профиля
Это понятно, но зачем выделяется такая категория? Очевидно же, что автомат лишь визуально состоит из вершин и звеньев, а на самом деле определяет правила переключения между конфигурациями состояний и сопутствующее поведение. У отделённого сиамского близнеца диаграмм состояний -- диаграмм деятельности -- контрольные узлы никто не называет псевдоузлами, например. И не говорит о стабильности.
Зачем вводится понятие "вершина", которое объединяет понятия "состояние" и "псевдосостояние"? У состояний и псевдосостояний много общего (например каждое звено исходит от ровно одного из них и приходит ровно к одному из них).
Заручимся тем, что Харел придумал чистить предысторию спец. действием. По его плохому примеру разрешим проверять, пуста ли предыстория в стороже. Тогда, в Вашем примере можно рисовать двузубец с choice, первый зуб которого идёт в "вертолётную площадку" (одну! общую!) и имеет сторожа [not EmptyHistory], второй идёт в предысторию по умолчанию и имеет сторожа [else]. Прелесть в том, что можно рисовать трезубец, n-зубец  и описывать условные дефолтные предыстории.
Другой способ менее выразительный -- разрешить переходам в предысторию иметь второе дополнительное (пунктирное:) остриё, указывающее на дефолтную предысторию для этого перехода. Основное (сплошное) остриё идёт только в "площадку" (которая одна, общая).
Отразил, как понял в 1 и 2 вложении. Вложение 3 - вариант с запоминанием в переменной c откуда пришли, вложение 4 - провокационная версия того же.
Такое прочтение возможно. С другой стороны можно видеть (в тексте, не в метамодели!) составные переходы (compound transition) и всюду дальше их первого упоминания подозревать, что транзишэнами называют и их и звенья.
Беда стандарта, что в текстовой части смешаны и синтаксис, и семантика (это ещё не беда - так многие источники делают: действительно при первоначальном изучении только так и можно что-то понять), и при этом один и тот же термин "переход" используется и при описании синтаксиса, и при описании семантики, а часть, которая должна однозначно определить синтаксис - метамодель, этой цели не достигает.
Довольно бессмысленно, на мой взгляд, запрещать в стандарте проводить из начального псевдосостояния несколько исходящих звеньев, но разрешать(?) рисовать хареловский эквивалентный им N-зубец с choice/junction.
Согласен, всё равно такой N-зубец надо проверять на полноту выходов. Вложения 3 и 4 содержат пример того же для исторического псевдосостояния. Может это всё для того, чтобы только после choice/junction проверять полноту выходов?

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

  • Sr. Member
  • ****
  • Сообщений: 298
  • Рейтинг читателей: 27
    • Просмотр профиля
Зачем вводится понятие "вершина", которое объединяет понятия "состояние" и "псевдосостояние"? У состояний и псевдосостояний много общего (например каждое звено исходит от ровно одного из них и приходит ровно к одному из них).
Это понятно. Но в том же ключе можно назвать элементы диаграмм классов вершинами [графа, которым является ДК].

Отразил, как понял в 1 и 2 вложении. Вложение 3 - вариант с запоминанием в переменной, откуда пришли, вложение 4 - провокационная версия того же.
Благодарю. В 2 провокационно хотелось  пунктирную часть видеть исходящей из середины сплошной (на манер пунктира класса ассоциации).
Что касается 3.1 (4?), почему бы нет. Junction -- спец. обозначение, позволяющее нарисовать несколько переходов, сэкономив на стрелках-звеньях, дублирующихся сторожах, эффектах, триггерах. Зачем требовать триггер именно на первые звенья? Может быть, требовать, что бы не было более одного триггера на любом из возможных путей?

Беда стандарта, что в текстовой части смешаны и синтаксис, и семантика (это ещё не беда - так многие источники делают: действительно при первоначальном изучении только так и можно что-то понять), и при этом один и тот же термин "переход" используется и при описании синтаксиса, и при описании семантики, а часть, которая должна однозначно определить синтаксис - метамодель, этой цели не достигает.
+1

Согласен, всё равно такой N-зубец надо проверять на полноту выходов. Вложения 3 и 4 содержат пример того же для исторического псевдосостояния. Может это всё для того, чтобы только после choice/junction проверять полноту выходов?
Мудрёно.
[...и улетело НЛО.]

Vadim

  • Full Member
  • ***
  • Сообщений: 202
  • Рейтинг читателей: 34
    • Просмотр профиля
Это понятно. Но в том же ключе можно назвать элементы диаграмм классов вершинами [графа, которым является ДК].
В стандарте используется Vertex, которое переводится как "вершина", вот и стал так называть.
В 2 провокационно хотелось  пунктирную часть видеть исходящей из середины сплошной (на манер пунктира класса ассоциации).
Не смог (инструмент EA12).
Зачем требовать триггер именно на первые звенья? Может быть, требовать, что бы не было более одного триггера на любом из возможных путей?
Именно такой вывод и хотел получить
Мудрёно.
Переходы из одной Vertex не должны "пересекаться" - сработать может только один переход. Но из некоторых Vertex (например начальное псевдосостояние) обязательно надо выйти. Есть 2 способа это обеспечить:
  • обязательное единственное transition без триггера и без условия - наглядно на диаграмме видно, если нарушено
  • непустой набор transition без триггера и с условиями, дополняющими друг друга - ошибки не очень наглядны

Vadim

  • Full Member
  • ***
  • Сообщений: 202
  • Рейтинг читателей: 34
    • Просмотр профиля
Во вложении первый результат "модели (в виде диаграммы классов) абстрактного синтаксиса автомата".
Ограничено только простыми состояниями, поэтому отсутствуют псевдосостояния deepHistory, shallowHistory, join, fork, entryPoint, exitPoint, terminate (пока не нужны) и junction, choice (легко не получается, а диаграмма итак не простая).
Есть и другие недостатки (преодолимые, но за счёт усложнения диаграммы):
  • нет внутренних переходов (локальных пока и быть не может)
  • нет гарантии достижимости состояний - наличие хотя бы одного входящего перехода является необходимым, но недостаточным условием
  • одно и тоже событие (trigger) может и запустить переход, и являться буферизируемым
  • допустимы явно ненужные ситуации, например: сразу из начального переход в финальное или в состоянии без do-деятельности есть исходящий переход без триггера
  • действительно ли из состояния должен исходить хотя бы один переход (действительно ли всегда должна быть возможность покинуть состояние, если оно не финальное)
« Последнее редактирование: 01 Июля 2016, 08:10:06 от Vadim »

Vadim

  • Full Member
  • ***
  • Сообщений: 202
  • Рейтинг читателей: 34
    • Просмотр профиля
Добавил внутренние переходы, разграничил буферизируемые и запускающие переходы триггеры. Сложность возросла раза в два. Появилась (точнее ещё раз всплыла тема уже по диаграмме классов - дерево? подклассов Transition http://www.uml2.ru/forum/index.php?topic=6583.msg40740#msg40740).
« Последнее редактирование: 06 Июля 2016, 11:42:09 от Vadim »

Vadim

  • Full Member
  • ***
  • Сообщений: 202
  • Рейтинг читателей: 34
    • Просмотр профиля
Добавил только choice, сложность существенно увеличилась.
« Последнее редактирование: 07 Июля 2016, 09:25:44 от Vadim »

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

  • Sr. Member
  • ****
  • Сообщений: 298
  • Рейтинг читателей: 27
    • Просмотр профиля
Лето... отпуска... даже у НЛО. Извините, отсутствовало и не отвечало. Теперь вернулось и буду посмотреть. ;D
[...и улетело НЛО.]

Galogen

  • Member of CAR
  • Hero Member
  • *****
  • Сообщений: 6158
  • Рейтинг читателей: 198
  • Аксакал
    • Просмотр профиля
    • Профиль в Моем Круге
Лето... отпуска... даже у НЛО. Извините, отсутствовало и не отвечало. Теперь вернулось и буду посмотреть. ;D
На Альдебаран что ли летало, уважаемое НЛО, хотя почему ое - объект вроде :)?

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

  • Sr. Member
  • ****
  • Сообщений: 298
  • Рейтинг читателей: 27
    • Просмотр профиля
На Альдебаран что ли летало, уважаемое НЛО, хотя почему ое - объект вроде :)?
По поясу астероидов моталось. Ое -- это по стандарту по словарю. )
[...и улетело НЛО.]

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

  • Sr. Member
  • ****
  • Сообщений: 298
  • Рейтинг читателей: 27
    • Просмотр профиля
Попробую на зуб. Сомнительным кажется соединение класса с перечислимым типом с помощью ассоциации (SimpleState-*--*-TypeStateBehaviour). М. б. соединить SimpleState со  StateBehaviour, а TypeStateBehaviour сделать типом квалификатора при этой связи?
Пользуясь случаем врублю офтопик. Стандарт против внутренних переходов по завершению. А, собственно, почему?
[...и улетело НЛО.]