Форум Сообщества Аналитиков

×


Просмотр сообщений

В этом разделе можно просмотреть все сообщения, сделанные этим пользователем.


Сообщения - Vadim

Страницы: « 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 »
166
Конкретный синтаксис с несколькими предысториями допускает толкование, что для каждого способа входить в состояние по предыстории (в Вашем примере от 16.06 таких способов у State1 два -- левый и правый) есть отдельная память, ведущая независимую историю. Т. е. при входе слева срабатывает левая предыстория, справа -- правая. Если бы "вертолётная площадка" была одна, повода для такого толкования не возникало бы.
Когда "вертолётная площадка" одна, то и история одна, причём как она изменяется (до сих пор мы больше внимания уделяли тому, как история используется) тоже понятно: если выход через финальное состояние, то история обнуляется, если нет, то в историю записывается та конфигурация, из которой произошёл выход (в случае неглубокой истории из этой конфигурации будет использоваться только верхний уровень).
Если считать, что для каждого способа входить в состояние по предыстории есть отдельная память, то нужно определить как на каждую из этих "памятей" влияет выход из композитного состояния. На примере диаграммы: если произошёл выход из State1, конфигурация могла быть State2, а могла и State3. Как это повлияет на историю левого исторического и как это повлияет на историю правого исторического (ведь выход из State2 не означает, что вход был через левое историческое)? Может считать, что влияние оказывается на ту историю, через которую произошёл вход? Но вход мог произойти и без истории (в примере этого нет, но могло бы быть)!
Остаётся вариант, что история композитного состояния одна общая (это согласуется и с тем случаем, когда имеются по одному псевдосостоянию и глубокой и неглубокой истории - история у них общая).
Замечу, что у Харела (автора предысторий) во всех его примерах в "площадку" обязательно входит звено. То есть, у него это не совсем тэг.
Здесь в "площадку" звенья ни входят, ни выходят (правда это не Харел и не UML) http://matlab.exponenta.ru/stateflow/book1/2.php
Общий недостаток нотации начальных и исторических псевдосостояний вижу в том, что для обозначения дефолтных состояний (начального по умолчанию, истории по умолчанию) используются звенья. Визуально такие звенья мало чем отличаются от обычных и хочется повесить на них триггер, к примеру. Но стандарт не велит. Если бы такие псевдозвенья выглядели бы не так, как обычные, запреты стандарта были бы подкреплены конкретным синтаксисом. Придумался простой способ достичь этого. Псевдопереходы из начальных и исторических псевдосостояний нужно рисовать пунктиром. Связать пунктир с невозможностью повесить триггер легко.
Конкретный синтаксис это вообще субъективно. Тут бы с абстрактным синтаксисом (где всё сводится к "да" или "нет") разобраться.
"Математическая" трактовка почти та же, что у протокольных диаграмм состояний. А протокольные финальные состояния нечем не отличаются от обычных.
Я понимаю "математический" автомат, как что-то похожее на https://ru.wikipedia.org/wiki/Конечный_автомат
К финальному состоянию стандарт привязывает специфический аспект -- генерацию события завершения для региона. Схожий с завершением, на мой взгляд, момент связан с терминацией (terminate-псеводостоянием). Только terminate прибивает всю машину. Представим, что есть два вида таких псевдосостояний: первый (обычный) -- для завершения региона, второй (со *) -- для завершения всей машины. Т. е. я хочу подвести к тому, что финальное состояние региона -- это, по смыслу, псевдосостояние, т. к. это условное обозначение.
Рассуждения о том, что финальное состояние -- стабильная вершина, как мне кажется, схоластичны. Если регион достиг финала, то нет никакой разницы, считаем ли мы "текущим" одно из его финальных состояний или никакое из его подсостояний, поскольку он завершён. Понятие стабильной вершины само по себе вызывает вопросы. Простое состояние без do-деятельности с переходом из него, запускаемым по завершению, стабильно лишь фиктивно. При работе машины оно проскакивается. Т. е. стабильность определяется работой автомата, а не на уровне синтаксиса. Псевдосостояния -- это спец. обозначения. Именно этим они отличаются от состояний. То, что псевдосостояния нестабильные вершины, не отделяет их от состояний (которые тоже могут быть нестабильны).
Состояния могут быть нестабильными, а псевдосостояния нестабильны всегда.
В примере 2-я диаграмма - состояние State6 определяет 3 стабильные конфигурации ({State7, State9},{State7, final},{final, State9}) и одну нестабильную - {final, final}. А если не будет исходящего без триггера перехода из State6 - 4 стабильные? А если такой переход будет, но с условием (которое может и выполняться, и невыполняться) - и то проскакивается, то не проскакивается?

167
Так перемыть косточки UML у меня даже с коллегами на работе не получалось.
Цель - не наехать, а выбрать или скомпоновать для себя подходящее средство для использования. У меня нет большого опыта практического использования диаграмм состояний UML, а диаграмм классов - есть. И тут UML - явный лидер по возможностям, опережая и "сущность-связь", и Object Role Modeling, и EXPRESS, и других (хотя в отдельных аспектах может им уступать).
Это так, но, вероятно, придётся прописать такое положение в языке. Сделать это формально (на OCL) затруднительно.
Убрать из 14.5.8.6 первые 2 ограничения.
Сама нотация может обескураживать: несколько псевдосостояний предыстории  изображают одну предысторию и несколько меток для состояний, являющихся предысторией по умолчанию.
Просто каждый вход в композитное состояние может иметь своё отношение к обработке истории (строго говоря каждый вход внутрь и одно общее на все входы на границу композитного состояния): будет ли учитываться предыдущее посещение композитного состояния и, если да, то что делать, если предыдущего посещения не было.
Мне кажется, что такая пометка состояния могла бы делаться не звеном из "вертолётной площадки", а тегом на самом состоянии. Хотя такой вариант, скорее всего менее нагляден, чем стандартный.
Когда-то такой знак "вертолётной площадки" и был тэгом на композитном состоянии (без входящих и исходящих переходов),  что означало, что любой повторный вход в композитное состояние означает продолжение с места прерывания. Потом стало ясно, что это слишком узко, что иногда надо продолжить, а иногда и начать по новой.
Мне интересно, откуда появилась в UML такая трактовка? Уж не от неудавшегося сращивания диаграмм состояний с диаграммами деятельности в 1-й версии UML? Ведь в "математических" автоматах финальное состояние -- обычное состояние с дополнительным свойством, т. е. у математиков оно в каком-то смысле больше, чем обычное состояние, а не наоборот.
В "математических" автоматах финальное состояние играет другую роль: если обработка последовательности сигналов завершилась в финальном состоянии, то последовательность "правильная".

168
Сначала о глобальном - мне нравится, как проходит обсуждение, поэтому появились вопросы:
  • есть ли в интернете другие места (лучше русскоязычные), где обсуждения похожих тем (нюансы языков моделирования) происходят так же конструктивно?
  • почему молчит остальная аудитория форума, варианты:
    • джуниоры пытаются разобраться в том, что все уже давно знают - пусть разбираются сами, лучше усвоят;
    • очень важная, но сложная тема - сказать по ходу нечего, дождёмся результатов;
    • то, что обсуждают, никому никогда не понадобится, но влезать - себе дороже?
От предыстории по умолчанию можно избавиться, заведя переменную-признак "были ли мы в State1", добавить действия по её инициализации и изменению, раздвоить переходы в State1 через choice/junction со сторожем, который при истинности признака ведёт нас в единое псевдосостояние истории, при ложности -- в нужное подсостояние внутри State1. Понятное дело, что с помощью введения переменной можно вообще избавиться от исторических псевдосостояний.
Наличие и трактовка перехода из исторического псевдосостояния как раз направлены на избавление от такой переменной-признака. Избавление от переменных оправдано тем, что переменные сильно снижают наглядность диаграммы: места, где они изменяются и проверяются ничем визуально не связаны, кроме имени переменной.
Должен сработать компромисс -- усложняя нотацию, соизмеряем, оправдывает ли более трудночитаемое описание языка выгоды от более лаконичных диаграмм в особых случаях.
Несколько псевдосостояний истории в регионе - изменение только в одном месте синтаксиса (0-1 на 0-*), но не семантики (неважно сколько исторических псевдосостояний, при выполнении можем одновременно добраться только до одного).
Как я писал выше, смыслы финального состояния в стандарте не прояснены должным образом. Возможно, что допущение явных переходов из финальных состояний (а также do-деятельностей в них, внутренних переходов) не усложнит язык, а лишь очистит его от лишних запретов. Некоторое затруднение может быть связано с устоявшимся стереотипом, что явных переходов из финального состояния не бывает.
Финальное является именно состоянием, а не псевдосостоянием потому, что автомат может находиться именно в нём (особенно, если это финальное состояние композитного состояния). Отсутствие в финальном состоянии do-деятельностей и внутренних переходов обусловлено тем, что хочется подчеркнуть, что ничего существенного (с точки зрения региона/состояния, к которому относится финальное состояние) уже произойти не может - только выход, причём это будет и выход из региона/состояния. Но оказалось, что в случае композитного ортогонального (в отличие от неортогонального) состояния появляется новая ситуация - часть регионов достигла финального состояния, а часть - нет.

169
Но стандарт ограничивает количество исходящих переходов из исторического псевдосостояния, ничего не говоря об обязательном наличии хоть одного входящего.
Хоть не запрещает.
Я полагаю, то "звено со знаком вертолётной площадки" это условное обозначение вроде "звена с кружком". Поэтому в этом случае я за стандарт в плане ограничений (но не в плане объяснений-описаний).
На картинке - верхний автомат: как добиться того же эффекта с одним историческим (то, что триггер "a" на горизонтальных стрелках, а триггер "b" на вертикальных - случайное совпадение)?
Я имел в виду лишь то, что из финального состояния нельзя явно рисовать переходы.
На картинке - нижний автомат: как добиться того же эффекта без перехода из финального состояния (последовательность триггеров "аа" приводит к State8, "ab" и "ba" - к State10)?

170
P. S. И вообще, попалась тут книга, автор которой призывает использовать UML нестандартно, творчески.) Обдумываю это предложение.)
  • подскажите что за книга
  • когда диаграммы используются для непосредственного общения или для размышления - вполне нормально отступить от стандарта, но если речь идет о документировании - отступать от какого-то единого понимания стандарта нельзя
  • если нестандартно, творчески означает: в рамках стандарта (или единого понимания стандарта), но не примитивно, то это не может не приветствоваться
Например, мне претит, когда есть историческое псевдосостояние, но нет входов в него
Вы и Харел считаете, что историческое псевдосостояние должно иметь входы. Я согласен, да и стандарт не против. Но тогда появляется вопрос: может ли композитное неортогональное состояние (или регион ортогонального состояния) иметь одновременно псевдосостояния глубокой и неглубокой истории? Стандарт и я считаем, что да (14.5.8.6 первые 2 ограничения). Более того, я (но не стандарт) считаю, что псевдосотояний глубокой (неглубокой) истории может быть несколько - лишь бы их исходящие переходы отличались хоть чем-нибудь (целевым состоянием или деятельностью на переходе).
из финального нельзя явно выйти
Если речь идет о композитном ортогональном состоянии (с 2 регионами), то переход из финального состояния одного из регионов за пределы этого композитного ортогонального состояния легко интерпретируется: срабатывание триггера имеет результат, если в первом регионе достигнуто финальное состояние, а во втором регионе состояние может быть любым. Причем заменить финальное состояние первого региона обычным состоянием нельзя: есть переход без триггера от композитного состояния - значит в каждом регионе должно быть финальное состояние.
Да, такой подход может иметь место. Но к чему он приводит? Насколько он прагматичен? Состояние (с пустой деятельностью и переходом по завершению) превращается не в способ поведения объекта, а в промежуточную проскакиваемую вершину. Такой конструкции легко найти замену -- тот же junction, например. Оправдать использование такой избыточной, по-моему, конструкции затруднительно. Для детерминированного автомата такое требование разумно.
Дам разъяснение: Харел даёт хорошее, но неформальное описание, стандарт пытается дать формальное, но хорошим его не назовёшь. Я пробую (пока для себя) построить модель (в виде диаграммы классов) абстрактного синтаксиса автомата и если что-то плохо укладывается (вызывает усложнение диаграммы), пытаюсь изменить абстрактный синтаксис автомата (не потеряв ничего существенного).

171
какой автомат мы описываем: детерминированный/недетерминированный/блокирующийся
точно не недетерминированный, скорее всего детерминированный (не нашёл что такое блокирующийся).
из начального псевдосостояния (единственный, без сторожа, с возможным эффектом)
обязательно должен быть
из псевдосостояния истории (для обозначения предыстории по умолчанию: единственный, без сторожа, с возможным эффектом)
а этот уже необязательный (бывают автоматы, в которых достигнуть исторического псевдосостояния возможно только когда композитное состояние исторического псевдосостояния уже посещалось - пример на рис. 21 из "Statecharts in the Making": историческое из checkEnvironment доступно только из  paused, в которое можно попасть только побывав в checkEnvironment)
Только в случаях спец. обозначений (т. е. начального и исторического) накладываются ограничения единственности и отсутствия сторожа.
Вместо ограничения отсутствия сторожа можно использовать ограничение, что все сторожа взаимно исключающие, но полностью перекрывающие все возможности, особенно если у junction и choice псевдосостояний нет ограничения, что сторожа всех исходящих переходов взаимно исключающие, но полностью перекрывающие все возможности. Если у junction и choice псевдосостояний такое ограничение есть, то проще сделать единственный переход от начального/исторического к junction/choice, а от junction/choice уже несколько переходов.
из простого состояния, если в нем есть do-деятельность
немного странно - если есть деятельность, то она может закончиться, а если нет - то и никакого события не возникает. Может правильней иметь событие со смыслом, что уже ничего больше делать не надо (или что всё уже сделано), тогда если do-деятельность пуста, считать что это событие наступает, когда состояние становится активным. Такое поведение будет похоже на поведение с финальным состоянием композитного состояния - если у композитного состояния есть исходящий переход без триггера и с "подходящим" сторожем, то финальное состояние как бы "проскакивается".
из композитного неортогонального состояния, если в нем есть хоть одно финальное состояние
из композитного ортогонального состояния, если в каждом его регионе есть одно (или более чем одно) финальное состояние
все исходящие переходы без триггера (как и переходы с совпадающим триггером) должны иметь взаимоисключающие сторожа

172
А вот можно ли рисовать от начального псевдосостояния N-зубец с ромбиком, это вопрос открытый. Параграф 14.2.3.7 говорится, что из него может идти один переход (одно звено?) без сторожа и триггера, на OCL это продублировано в 14.5.6.6 (в другом месте 14.2.4.7 можно указать триггер, если это событие создания экземпляра, а начальное псевдосостояние лежит на верхнем уровне). Куда может идти это звено, об этом не сказано, но можно предположить, что, чтобы ограничения не теряли силу, кончаться оно должно на границе состояния, или псевдосостояния истории. Схожее ограничение есть на переход из псевдосостояния истории. Предположительно, из него тоже нельзя растить многозвенный переход.
Может далее не будем особо ориентироваться на стандарт - пытаясь улучшить и формализовать Харела он и не улучшил, и не формализовал (формализация без полноты и непротиворечивости не нужна).
Опираться можно на Харела и на здравый смысл (почти цитата получилась :) ).
Где возможны (и даже обязаны быть) переходы без триггера?
  • из начального псевдосостояния
  • из композитного неортогонального состояния, если в нем есть хоть одно финальное состояние
  • где-то ещё
Вопрос: что должно выполняться для исходящих переходов без триггера (из начального псевдосостояния и композитного неортогонального состояния, если в нем есть хоть одно финальное состояние):
  • ровно один переход, без сторожа
  • несколько со сторожами - взаимно исключающими, но полностью перекрывающими все возможностм
  • что-то ещё
Ещё вопрос: может ли совсем не быть исходящих переходов без триггера из композитного неортогонального состояния, если в нем есть хоть одно финальное состояние

173
Просто я подумал, что Рамбо не зря на рис. 6.11 часть переходов (по set day, set clock, view program) нарисовал от границы между регионами, часть (по run program, power on) -- от границы суперсостояния. Или это совпадение.)
Рисуя переход от границы суперсостояния Рамбо, скорее всего, имел в виду то же самое, что и рисуя от границы региона:
  • регион Night light switch не имеет начального псевдосостояния, а это делает невозможным повторный вход в регион - это нужно для перехода от границы суперсостояния (хотя здесь, скорее всего, ошибка - на стр. 149 есть фраза:"Подсветка управляется выключателем, поэтому начальное значение для нее не имеет смысла". Желание правильное, то есть в диаграмме должно что-то быть, но не исключение начального состояния, а, например, псевдосостояние решения "ромбик" после начального)
  • нигде ранее ничего на эту тему не говорится
  • рисуя переход от границы региона подчеркивается идея того, что переход внутри суперсостояния это переход внутри региона. Да и любая точка на границе суперсостояния относится ровно к одному региону

174
В принципе можно было бы в конкретном синтаксисе установить, что переход от пунктирной линии, разделяющей регионы "принадлежит" региону, а от сплошной границы суперсостояния -- суперсостоянию.
Переход, который "принадлежит" региону (и идущий от пунктирной линии) нужен только тогда, когда относится ко ВСЕМ без исключения состояниям региона. Если не ко всем, то приходится всё равно заводить композитное состояние (принадлежащее региону), в которое включать только те состояния региона, к которым относится переход. Примеры:
  • У Рамбо и Блахи в их книге "UML 2.0. Объектно-ориентированное моделирование и разработка" рис. 6.11 - регион InteractiveDisplay, композитное состояние Setup, переход after (90 sec without input)
  • У Харела в "STATECHARTS: A VISUAL FORMALISM FOR COMPLEX SYSTEMS" Fig. 28. регион chime-status, композитное состояние enabled, переход d (in chime.on) 

175
Если диаграмма нарисована в соответствии с замыслом Фаулера, то она выглядит так как в приложении.
Получается, что Фаулер ошибся - если надо, чтобы переход затронул только один регион (но для нескольких состояний этого региона), то в соответствии с UML надо завести композитное состояние на эти состояния и делать переходы от этого композитного состояния (у вас это пунктирная линия).
Я имел в виду, что локальность перехода лучше (разумнее) определять для него самого, а не для его возможных связок с переходами из начальных состояний.
Я тоже это имел в виду - обязательность наличия начального состояния это дополнительное ограничение.
Локальность/внутренность -- это поведение и свойство первого звена.
Да, причем свойства определяются для каждого звена отдельно. То, что мы называем звеном в стандарте (в метамодели) обозначено transition. Мне давно хотелось поднять вопрос о терминологии:
  • в описании (спецификации, диаграмме) автомата есть vertex (состояния и псевдосостояния) и transition (звенья)
  • при работе автомата есть конфигурации (как допустимые сочетания состояний, но не псевдосостояний) и переходы (смена одной конфигурации на другую). На самом деле это не совсем точно - например не учитывается "историчность".

176
Разбираемый пример показывает, что описание локальных и внутренних переходов в стандарте дано неаккуратно и не отражено должным образом в метамодели. Так мне кажется.
Так и мне кажется, а раз я/Вы не один, то "кажется" уже слишком скромно.
Очевидно, что нет особой необходимости запрещать рефлексивные локальные переходы. Если составителю диаграммы нужно, чтобы осуществлялся выход из всех вложенных подсостояний, но не выход композитного, он нарисует стрелкой рефлексивный локальный переход. Если не нужно -- он напишет текстом внутренний переход.
Хороший пример, вызвал вопрос - в примере из предыдущего сообщения (рис. 14.34 с состоянием s2) какими (локальными или внешними) будут переходы, если бы они были нарисованы внутри s0 (мой вариант в скобках):
  • из s0 в s0 (локальный, он и нарисован слева внизу)
  • из s0 в s1 (локальный, он и нарисован слева в середине)
  • из s1 в s0 (не знаю!, стандарт считает внешним)
  • из s1 в s2 (внешний)
К сказанному Вами замечу, что мы не можем считать переход внутренним или локальным не по его свойствам, а по наличию/отсутствию начального псевдосостояния в суперсостоянии и перехода из него. Так мне кажется.)
Переход внутренний или локальный сам по себе, но для локального перехода, целью которого является композитное состояние, это композитное состояние должно иметь начальное псевдосостояние (также, как для внешнего перехода, целью которого является композитное состояние, это композитное состояние должно иметь начальное псевдосостояние).

177
Придумалась казуистическая трактовка, которая бы позволила не считать левый нижний "красный" переход внутренним.
А если так: на рис. 14.34 левый нижний (и верхний) переход не внутренний, а локальный потому, что целью является композитное состояние (s0) и в целевую конфигурацию состояний должно войти то элементарное состояние, на которое есть переход от начального псевдосостояния. Пример: дополним рис. 14.34 состоянием s2 и начальным псевдосостоянием внутри s0 с переходом к s2. Тогда для исходной конфигурации {s0, s1} внутренний переход (для s0!) приведет к той же конфигурации {s0, s1}, а локальный переход - к конфигурации {s0, s2}.

178
Тогда как будет выглядеть ответ на вопрос в первом топике не по стандарту, а по Харелу? (нижний регион будем считать дополненным начальным состоянием с переходом к историческому, как Вы и показывали на примере другой диаграммы из "Ответ #10 : 07 Апреля 2016, 00:57:40")

179
Похоже мы (вдвоем, за стандарт пока утверждать не буду :) ) по-разному понимаем то, что называем состоянием-исходом для перехода:
  • Я называю то единственное состояние, от которого идет линия со стрелкой, обозначающая переход
  • Вы называете то множество состояний, из которых при совершении перехода придется выйти (и совершить exit-действия)
Но мы одинаково понимаем, что произойдет (какие действия выдут выполнены и в каком порядке) при переходе в примерах:
  • exit(C), entry(D)
  • exit(C), exit(B), entry(B), entry(D)
  • exit(C), exit(B), exit(A), entry(A), entry(B), entry(D)
Вы (и Харел :) ) это объясняете тем, что exit выполняется для тех состояний, которые линия перехода пересекает изнутри наружу, а entry выполняется для тех состояний, которые линия перехода пересекает снаружи внутрь (ориентируясь на конкретный синтаксис).
Я (и стандарт) это объясняем тем, что exit выполняется для цепочки подчиненных состояний от исхода до владельца (но не включая его), а затем entry выполняется для цепочки подчиненных состояний от владельца до цели (ориентируясь на абстрактный синтаксис).
Поскольку в отношении внешних переходов конкретный и абстрактный синтаксисы хорошо согласованы - результат у всех получается одинаковый.
А в отношении локальных переходов абстрактный синтаксис подкачал (Харел рулит!) - вот отсюда и проблемы.

180
Ваши 3 примера, как мне кажется, показывают, что это не так. Если локальностью перехода считать то самое "будет ли действие по выходу и прерывание do-деятельности", то выйдет, что внешность/локальность можно определять не только для исхода, но для любого состояния, к которому переход имеет отношение.
Давайте по шагам:
  • Переход имеет ровно одно состояние-исход
  • Внешность/локальность перехода определяется по отношению к переходу целиком
  • Переход внешний рисуется наружу от границы состояния-исхода и не имеет ограничений кто будет состоянием-целью (соответствующий экземпляр метакласса Transition имеет значение атрибута kind равное external).
  • Для внешнего перехода действие по выходу из состояния-исхода осуществляется
  • Переход локальный рисуется внутрь от границы (композитного?) состояния-исхода и состояние-цель не может быть снаружи состояния-исхода (соответствующий экземпляр метакласса Transition имеет значение атрибута kind равное local)
  • Для локального перехода действие по выходу из состояния-исхода не осуществляется - выхода то и нет
Почему бы так и не сказать в стандарте? Всё началось с того, что в примерах Фаулера расположение группового перехода в границах региона не соответствует тому, что этому переходу стандарт предписывает выходы из соседних регионов.
Локальные переходы появились в стандарте не сразу. А то, что сказано в стандарте про владение переходом (14.2.3.8.5 Transition ownership) вполне подходит для внешних переходов.
В стандарте много непонятного. Например полюса ассоциаций между Vertex и Transition обозначены как производные (правила определены в 14.5.13.6 как операции с такими же именами). Такой приём (вычисление полюса ассоциации по значению противоположного полюса) можно использовать вообще для любой ассоциации, но нигде больше такого нет в стандарте.

Страницы: « 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 »