OberonCore https://forum.oberoncore.ru/ |
|
Cхематические таблицы https://forum.oberoncore.ru/viewtopic.php?f=121&t=4635 |
Страница 2 из 2 |
Автор: | PSV100 [ Вторник, 31 Декабрь, 2013 00:20 ] |
Заголовок сообщения: | Re: Cхематические таблицы |
Ещё один пример, на этот раз отражающий функцию как конструктор данных. Возьмём этот архивный рисунок: Вложение: Пусть возникает потребность в вариантах конструктора: "тело" файла может быть либо списком записей (их много), или только одна запись. Также "конец файла" необязателен. Для этого введём две опции типа Bool: UseList и NeedEOF. Псевдокод (допуская, что язык поддерживает метапрограммирование): Код: type Record = (Description, Operator) type EOF = (Symbol1, Symbol2) type File = ( Head, List[Record], #[if UseList] Record, #[if not UseList] EOF #[if NeedEOF] ) Р-схема: Вложение: file_schm.PNG [ 10.36 КБ | Просмотров: 5059 ] Подставляя значения опций (аргументов) функции редуцируем нужный вариант, с возможностью "компактификации": Вложение: file_single.PNG [ 8.31 КБ | Просмотров: 5059 ] Ещё пару вариантов: Вложение: Схематическая таблица: Вложение: file_s_tbl.png [ 11.07 КБ | Просмотров: 5059 ] В общем, как и Р-схемы, схемтаблицы можно нагружать произвольной семантикой. |
Автор: | PSV100 [ Пятница, 25 Апрель, 2014 14:20 ] |
Заголовок сообщения: | Re: Cхематические таблицы |
Пример выше связан с целью -- сформировать принцип построения шаблонных Р-схем, похожий на механизм ряда текстовых шаблонных движков. Пусть имеется абстрактная схема-шаблон (неважно, что именно она отражает), где через спецвершины выделена секция -- это структура, которая должна быть продублирована (или 0 повторений) для каждого входного целевого элемента (см. ниже). Через "#{...}" указаны значения для подстановки, "#[...]" -- условие для включения элемента (альтернатива -- использование спецвершины для дуги): Вложение: Подаём на вход шаблонизатора массив из 2-х элементов, у второго "включена вторая дуга": Код: Data = { d1 = {aa: some}, d2 = {pa: p1; aa: a1; use_b: true; pb: p2; ab: a2} } Итоговая схема (для первого элемента не указана надпись над дугой, т.к. для нее не определен предикат): Вложение:
|
Автор: | PSV100 [ Пятница, 25 Апрель, 2014 14:29 ] |
Заголовок сообщения: | Re: Cхематические таблицы |
По поводу схематических таблиц. Размышляя над тем, как улучшить их вид, пришёл к понимаю того, что для Р-схем схематические таблицы не нужны -- они сами по себе обладают всеми необходимыми от этих таблиц свойствами (и даже больше). Возьмем исходный пример в этом сообщении, первый рисунок, выделю схематическую таблицу отдельно: Вложение: Определим функцию "damage" (её два варианта в зависимости от первого аргумента, также два варианта ф-ции "power"), в отличие от оригинала -- добавлена обработка сигнала об ошибке: Код: type Attack = Magic | Melee power: (Attack) -> int power = (Magic) -> 5 power = (Melee) -> 4 damage: (Attack, bool, int) -> float error Invalid(float) = SetVal(float) | SetDef damage = (Magic, surprise, defense | Invalid) -> koef = 3 if surprise else 2 effectiveness = power(Magic) * koef out = effectiveness - defense case of | out <= 0 => out = 0 | out >= 1 => _ | else try Invalid(out) handle SetVal(x) => out = x SetDef => out = 0.5 out damage = (Melee, surprise, defense) -> koef = 3 if surprise else 2 effectiveness = power(Melee) * koef out = effectiveness / defense * 2 out Р-схема, где отражена общая картина сформированного вычислительного процесса с выделенными фазами: Вложение: Явно указано, что расчёт "effectiveness" одинаков (можно выносить в отдельную ф-цию) в двух вариантах процесса (в зависимости от значения "attack"), причём в этом расчёте выделены свои две фазы. При желании возможен аналог функциональной схемы, когда через вспомогательные линии выделяются связи между входными аргументами и операциями (т.е. аргументы на вход операции подаются линиями, см. рисунок исходной схемтаблицы). По сравнению с оригинальными схематическими таблицами Р-схемы имеют фундаментальное преимущество -- структурность (графические структуры). В исходных схемтаблицах крайне проблематично выделять блоки, циклы, движения назад, аварийные или досрочные выходы и т.п. |
Автор: | PSV100 [ Пятница, 25 Апрель, 2014 14:42 ] |
Заголовок сообщения: | Re: Cхематические таблицы |
В дополнение. Р-схемы в подобном стиле, как приведено выше, могут заменить ряд UML-схем. Например, здесь есть диаграмма последовательностей и временная диаграмма. Сделаем аналоги. Прежде всего, обращаю внимание на то, что алгоритмические Р-схемы по своей сути есть и диаграммы действий, и диаграммы состояний "в одном флаконе". И отдельно фантазировать над каким-нибудь state diagram нет необходимости (здесь отражена разница "state diagrams versus flowcharts"). В этой выдержке (отсюда) пример Р-схемы, где условные состояния заданы явно (только подписаны не как спецвершины). Выделю отдельно рисунок самой схемы: Вложение: r_algstate.PNG [ 23.63 КБ | Просмотров: 4975 ] Возможны вложенные (внешние) состояния -- через блоки (например, здесь подробнее об общих состояниях): Вложение: r_specst.jpg [ 4.91 КБ | Просмотров: 4975 ] Итак, составим некий аналог вот такой временной диаграммы из примера выше по ссылке: Вложение: Р-схема примерно будет такая: Вложение: где в первом условном столбце выделены "роли" -- значения предикатов начальных дуг. Далее весь процесс разделяется на фазы, которые задаются в заголовке столбца: в скобках -- состояние, надпись над линией -- время, подпись -- сущность фазы. Описывать фазы можно как угодно, например, указывать только состояния, добавлять информацию о типах данных, контрольные выражения ("assert") и т.п. При желании, для выделения времени можно нарисовать отдельную шкалу над схемой. Или же включить время и/или иные важные показатели в значение условного состояния. Тогда, фактически, возможен универсальный формат заголовка фазы: в скобках -- состояние, надпись -- идентификатор фазы, подпись -- контрольное выражение (тип данных, assert). Любой элемент может отсутствовать. В 4-м столбце (фаза 3) не указано общее состояние в заголовке, а для каждой дуги через спецвершину определено своё состояние в этой фазе (для каждой роли). Для подобной диаграммы последовательности операций: Вложение: требуется дополнительный "финт" -- введение отложенной связи между вершинами, задаваемой пунктирной линией: Вложение: Здесь через первый столбец введены "акторы", в первой фазе одновременно выполняют действия акторы 1 и 2 (над дугами нет предикатов-условий), в фазе 2 работает актор 3, где по результатам при каких-то условиях согласно предикату дуги возможен переход на фазу 1 и повтор действий, в фазе 3 -- актор 2, и завершает актор 1, при этом возможна развилка его действий. Опять же, как можно заметить, преимущество Р-схем в структурности. В UML-диаграммах невозможно выделять ветвления, циклы, блоки и т.п., или приходится довольствоваться кашей, как interaction overview diagram. |
Страница 2 из 2 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |