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

×


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

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


Сообщения - Vadim

Страницы: « 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 »
151
Ситуации, по которым есть мнение по допустимости: да, да, да, нет.
Понятно, что диаграммы неполные - нет переходов в псевдосостояние истории, нет псевдосостояния начала в композитных состояниях и т.д.

152
Переход от псевдосостояния истории не должен выходить за рамки композитного состояния, к которому это псевдосостояние истории относится (хотя в UML 2.5 нет такого ограничения) - его целью является что-то внутри этого композитного состояния (внутри не обязательно непосредственно внутри - целью может быть и подсостояние подсостояния).
Не имеет смысла, чтобы целью такого перехода было псевдосостояние истории, которое относится к тому же самому композитному состоянию (само исходное или другое псевдосостояние истории - UML 2.5 не запрещает наличие 2 псевдосостояний истории, лишь бы одно из них было глубоким, а другое нет).
А возможен ли переход от псевдосостояния истории к псевдосостоянию истории композитного подсостояния?
Думаю, что ответ на этот вопрос зависит от вот какого момента в семантике: если происходит выход из композитного состояния через финальное состояние, то история этого композитного состояния сбрасывается, а вот сбрасываются ли истории его композитных подсостояний?

153
Добавил только choice, сложность существенно увеличилась.

154
почему outgoingtransition - это не transition?
outgoingtransition - это transition, но на диаграмме этого сразу не видно, а хотелось бы!
begintransaction - что это за понятие? и не кажется ли вам, что оно выпадает из общей сравнительной классификации:
начальный переход
внешний переход
внутренний переход

и разве начальный переход не подвид внешнего перехода?
По UML-стандарту начальный переход это подвид внешнего перехода, хотя некоторые UML-инструменты имеют визуальный элемент, который объединяет и начальное состояние, и переход из него. Но в данной теме хотелось обсуждать не это, а диаграммирование конкретной ситуации, а названия классов могли быть просто a, b, c, d, e, f.

155
Ссылку поправил, но по ней можно не ходить - это не принципиально.
Принципиально - уменьшить недостатки диаграммы.
Например диаграмма во вложении частично преодолевает указанный в исходном топике недостаток (явно видно, что Transition обобщает IncomingTransition), но вносит новый недостаток - теряется симметричность диаграммы, хотя исходная проблема явно симметрична. По-прежнему все SetGeneralization полные (complete) и непересекающиеся (disjoint).

156
В процессе проработки http://www.uml2.ru/forum/index.php?topic=6532.msg40739#msg40739всплыл вопрос о лучшем диаграммировании ситуации из вложения.
Все SetGeneralization полные (complete) и непересекающиеся (disjoint).
Недостаток: Transition обобщает IncomingTransition и OutgoingTransition, а на диаграмме этого явно не видно.

157
Добавил внутренние переходы, разграничил буферизируемые и запускающие переходы триггеры. Сложность возросла раза в два. Появилась (точнее ещё раз всплыла тема уже по диаграмме классов - дерево? подклассов Transition http://www.uml2.ru/forum/index.php?topic=6583.msg40740#msg40740).

158
Во вложении первый результат "модели (в виде диаграммы классов) абстрактного синтаксиса автомата".
Ограничено только простыми состояниями, поэтому отсутствуют псевдосостояния deepHistory, shallowHistory, join, fork, entryPoint, exitPoint, terminate (пока не нужны) и junction, choice (легко не получается, а диаграмма итак не простая).
Есть и другие недостатки (преодолимые, но за счёт усложнения диаграммы):
  • нет внутренних переходов (локальных пока и быть не может)
  • нет гарантии достижимости состояний - наличие хотя бы одного входящего перехода является необходимым, но недостаточным условием
  • одно и тоже событие (trigger) может и запустить переход, и являться буферизируемым
  • допустимы явно ненужные ситуации, например: сразу из начального переход в финальное или в состоянии без do-деятельности есть исходящий переход без триггера
  • действительно ли из состояния должен исходить хотя бы один переход (действительно ли всегда должна быть возможность покинуть состояние, если оно не финальное)

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

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

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

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

163
Необязательно. Можно считать, что разноуровневые истории работают совместно, а одноуровневые независимы.)
Недопустимое сочетание: пусть есть одна глубокая и две неглубокие истории - получается глубокая совместна с каждой неглубокой, а неглубокие между собой нет! Допустимы сочетания:
  • разноуровневые истории работают совместно, и одноуровневые совместно (одна общая история на все "вертолётные площадки")
  • разноуровневые истории работают независимо, а одноуровневые совместно(одна общая история на все "глубокие" "вертолётные площадки" и одна общая история на все "неглубокие" "вертолётные площадки")
  • разноуровневые истории работают независимо, и одноуровневые независимо (своя история на каждую "вертолётную площадку")

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

164
Каждый выход происходит после какого-то входа. Часть входов происходит по левому пути (через левую память), часть по правому. Через какую память входили, в ту и пишем.
Ответ:
Если считать, что для каждого способа входить в состояние по предыстории есть отдельная память, то нужно определить как на каждую из этих "памятей" влияет выход из композитного состояния. На примере диаграммы: если произошёл выход из State1, конфигурация могла быть State2, а могла и State3. Как это повлияет на историю левого исторического и как это повлияет на историю правого исторического (ведь выход из State2 не означает, что вход был через левое историческое)? Может считать, что влияние оказывается на ту историю, через которую произошёл вход? Но вход мог произойти и без истории (в примере этого нет, но могло бы быть)!
Правила для обслуживания нескольких исторических псевдосостояний должны быть такими, чтобы если будет только одно историческое псевдосостояние обслуживание происходило так, как это описано в стандарте или у Харела. Я вижу 2 варианта:
  • любой выход оказывает влияние на все истории
  • выход оказывает влияние только на историю, по которой произошёл вход, а если вход произошёл без истории, то на все истории
Критерием, который мог помочь при выборе между этими вариантами, могло быть описание поведения, если композитное состояние одновременно имеет и глубокую, и неглубокую историю. Но у Харела таких случаев я не нашел, и в стандарте тоже (хотя в 14.5.8.6 первые 2 ограничения записаны так, что это возможно). Моя позиция - любой выход оказывает влияние на все истории (но подкрепить её нечем).
P. S. Выходила книга Бьянкуцци, Уорден. Пионеры программирования. В ней помимо всего прочего "трое друзей" рассказывают про историю UML, критикуют и предсказывают ему будущее. Pdf-ка гуляет по сети.
Читал: объясняет, почему плохо, но неясно как будет хорошо.

165
Другой вариант, что, если непонятно в какую память записывать, то записывать в обе.)
Дело в том, что всегда непонятно в какую память записывать, поэтому если записывать в обе,то обе памяти оказываются идентичными.
Вот у Харела предлагалось использовать в сторожевых условиях темпоральную логику, сведения о текущем состоянии в ортогональном регионе и т. п. В таком же духе можно от общей одной "вертолётной площадки" провести пунктиры к разным дефолтным предысториям и на пунктирах этих написать "сторожей", проясняющих выбор дефолтной предыстории.
Да, это формально допустимый вариант, но он требует введения переменной, которая будет содержать информацию для работы "сторожей". А переменная требует инициализации значения и ...(выше уже говорилось: "переменные сильно снижают наглядность диаграммы"). Другое дело, если переменные уже существуют для обслуживания автомата - например используются в каких-то деятельностях (entry, exit, do или на переходах).
По поводу пунктиров: они будут выражать невозможность повесить триггер, но есть и другие ограничения, например обязательное отсутствие сторожа и/или деятельности на переходе. Есть еще одно соображение (не против визуального выделения, а против именно пунктира) - когда рисуешь от руки на бумаге, то часто сначала ясно, что нужна соединительная линия, а только потом ясно, какого она типа. А превратить нарисованную сплошную в пунктирную достаточно затратно, уж лучше бы сделать какую-нибудь пометку. Но это опять про конкретный синтаксис ;)

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