Home
dump -0f - /dev/mind
Баечки о мобильной связи (GSM, CDMA) и IT индустрии
Автоматическая генерация sequence diagram 
12th-Oct-2007 12:18 am
Умные люди придумали много разных формальных нотаций для моделирования процессов и систем (например, UML и IDEFx) . Другие умные люди написали гору софта, который призван облегчать работу по созданию этих самых моделей в выбранной нотации.

Казалось бы, выбирай нотацию, подбирай софт поудобнее - и вперед, рисовать схемы по захвату мирового господства. Да вот незадача - софт подобрать не так-то и легко. Он либо настолько простой и одноклеточный, что через 5 минут ты начинаешь упираться в его ограничения на каждом шагу и биться головой об стену, либо такой сложно-наворочено-всесторонний, что через полтора часа после запуска ты обнаруживаешь, что добраться до собственно моделирования процессов не так уж и легко. Сначала надо закончить создание оргструктуры организации (поскольку создавать актеров на ходу нельзя, а можно только выбирать уже описаных), заполнить базу глоссария (поскольку программа не допускает использования незнакомых аббревиатур), сложить в правильные места еще 65535 безумно ценных кусочков метаданных, и, опять-таки, постараться не убиться головой об стену.

Возьмем, к примеру, рисование sequence diagram. Если не злоупотреблять строгим следованием канонам UML - то замечательная нотация для описания бизнес- и технических процессов, позволяющая легко показывать временные зависимости и последовательности действий. Я люблю рисовать sequence diagram-ы на бумаги, но в скором времени мне предстоит нарисовать несколько десятков диаграмм в электронном виде.

"Ага!", - подумал я, - "самое время разжиться инструментом".

Несколько дней расслабленных поисков показали, что счастья нет. Либо приходится руками расставлять все элементы диаграммы (привет, Visio!), содрогаясь от одной только мысли о том, что "вот сюда надо будет вставить еще одно сообщение, сюда - объектик, а все остальное подвинуть вниз и вправо", либо же софт будет делать "все красиво", но при условии, что вы продадите душу и тело той методологии моделирования, которая реализована в софте, и будете использовать ее на всю катушку. То есть, например, вы должны будете строго следовать UML, а софт будет за этим следить. И на диаграмме у вас могут быть только объекты (вот в это диалоговое окошко впишите имя класса, тип наследования, предков, партийность и национальность), а посылаемые ими сообщения должны быть явно описаны в виде методов этих объектов (пожалуйста, вот сюда - сигнатурку метода, а сюда пишите код), т.д. и т.п.

Есть, конечно, редкие исключения, но они и стоят соответственно, и, опять-таки, не без изъяна.

И тут я решил вернуться к старой-старой идее сделать себе свой лунный модуль, с блэк-джеком и ш инструмент. И сделал. Теперь буду хвалиться :)

Что умеет инструмент? Инструмент умеет генерировать диаграмму из текстового описания. Слева - пример описания, справа - результат. Как видно, сущности/актеры были автоматически упорядочены так, чтобы уменьшить длину стрелочек и повысить читаемость.

a -> b: catch a ball!
b -> c: i'll pass it along
c: what to do next?
c -> a: lets throw it back again
a: not fair!
a -> c: find someone else!
c -> d: ok, here you go
d: zZzZzZzZzzz.....


Синтаксис, думаю, в формальном описании не нуждается - все должно быть понятно и так :)

На самом деле, генерацией картинки занимается сторонняя программа - "dot" из пакета утилит для рисования графов GraphViz, а моя утилита (названная "flow2dot") просто готовит для нее текстовое описание того, что надо нарисовать.

Работа только с текстовыми форматами дает определенную гибкость. Во-первых, если хочется изменить что-то в самой картинке, то можно выбирать между изменением кода flow2dot, ручной или автоматической правкой генерируемого dot-файла, или вставкой инструкций для dot прямо в описание диаграмы (все, что flow2dot не смог распарсить, будет перенесено в выходной файл без изменений).

Во-вторых, можно пользоваться препроцессором (m4 или стандартным cpp) и выносить общие части диаграм во включаемые файлы.

В-третьих, можно использовать grep для поиска нужных диаграм и sed/perl для их массового редактирования (вы никогда не пробовали исправить опечатку в одну букву в десятке диаграмм, нарисованных в Visio?).

Короче говоря, мне нравится :)

Если вам тоже нравится - берите, пользуйтесь. Код лежит по адресу http://adept.linux.kiev.ua/repos/flow2dot/ , при наличии клиента darcs его можно вытянуть оттуда командой "darcs get http://adept.linux.kiev.ua/repos/flow2dot/".

Код на Haskell, уж не обессудьте :)
Comments 
11th-Oct-2007 09:40 pm (UTC)
Ничего не могу с собой поделать, нравятся мне тихие сумашедшие, думающие на языках типа хаскела, луа, или даже эрланга. На блаженных мир держится, чтобы всяким плюсанутым сишникам пусто не было. Если слишком заумно,- это я так длинно выразил своё "уважаю" ;-)
11th-Oct-2007 09:58 pm (UTC)
плюсадин
11th-Oct-2007 10:17 pm (UTC)
J, J забыл.
14th-Oct-2007 05:39 pm (UTC)
Lua в этом списке лишнее, мне кажется =)
11th-Oct-2007 10:17 pm (UTC)
Зашибись штука.
11th-Oct-2007 10:21 pm (UTC)
Прикольно :) Из юзабилити, я бы предложил ещё paging добавить, если нету - чтобы можно было делать нарезать частями 1-10, 11-20, etc.
12th-Oct-2007 01:13 pm (UTC)
И то, и другое можно получить при помощи dot на этапе генерации картинки. Примера не приведу, но в доке по dot их есть достаточное кол-во.
11th-Oct-2007 10:30 pm (UTC)
Есть такая штука http://www.mcternan.me.uk/mscgen/. И у неё есть огромный плюс - интеграция с doxygen. Ну и он такой же простой, как 7 копеек.

А если возможностей не хватает, то http://sdedit.sourceforge.net/index.html Quick Sequence Diagram Editor. Там уже и группировки, и мультитрединг и т.п.
12th-Oct-2007 01:12 pm (UTC)
Угу, я на mscgen посматривал. Мне не понравилось: 1)малое кол-во ручек для настройки вывода; 2)не поддерживает русский ваааще.

А sdedit - уж больно "низкоуровневый". Мне все больше актеры и системы нужны, а не объекты, сообщения и треды. Лично мне тяжело писать "клиент:банк.оплатитьСчет" (кстати, как сюда тиснуть пробел?).


11th-Oct-2007 11:11 pm (UTC) - еще вариант
12th-Oct-2007 01:05 pm (UTC) - Re: еще вариант
Вон, в следующем комментарии мои впечатления.
12th-Oct-2007 02:56 am (UTC)
http://www.spinellis.gr/sw/umlgraph/doc/indexw.html - крути ниже, где-то с с середины страницы описывается рисование sequence diagram с помощью gnu plotutils.

12th-Oct-2007 03:49 am (UTC)
helge9210
Ну и как всегда не забываем, что у пакета Graphviz периодически встречаются родовые травмы в области использования шрифтов для кириллического текста.

Из последних травм вспоминается:
1) Необходимость откатиться на предыдущую относительно Debian Unstable версию Graphviz из-за желания последней версии использовать только встроенный шрифт Times (без кириллицы).
2) Необходимость использования цепочки dot > файл svg > Inkscape > файл PostScript для получения файла PostScript с правильными шрифтами и кириллицей.
(no subject) - helge9210 Expand
12th-Oct-2007 04:15 am (UTC)
Чудесная штука! Спасибо.
12th-Oct-2007 05:43 am (UTC)
Как видно, сущности/актеры были автоматически упорядочены так, чтобы уменьшить длину стрелочек и повысить читаемость.

по-моему, если поменять местами a и d, или выстроить в порядке a c b d, то суммарная длина стрелочек уменьшится на две "единицы"
(no subject) - Anonymous Expand
12th-Oct-2007 06:48 am (UTC)
кстати, если прижмет и надо будет пользоваться чем-то интерактивным - советую поиграться с sybase powerdesigner - я в свое время им активно пользовался почти 2 года для моделирования БД, проектирования софта и т.п. - у него богатые средства генерации выходных данных по диаграммам, так что можно писать свое, если понадобится.
а для БД там вообще немерянные возможности, к тому же он знает разные варианты БД, например Оракл, и пользователю дает только те возможности, которые поддерживаются выбранной версией - например, сегментирование и т.п.
12th-Oct-2007 08:54 am (UTC)
Надо на hackage выложить...
12th-Oct-2007 09:51 am (UTC)
есть, кстати, ещё вариант: воспользоваться Functional MetaPost'ом, если тебе сами графы не особо нужны. Правда он корявый немного (устарел) и его надо чуть проапдейтить.

да, поддерживаю идею про hackage.
12th-Oct-2007 02:59 pm (UTC)
А ведь где-то есть стандарт на XML описание Sequence диаграм. И к этому можно было бы применить XSL и получить, напр. SVG
13th-Oct-2007 02:44 pm (UTC)
Я совсем недавно начал изучать Хаскель (до монады State я еще не дошел).
Посмотрел твой код, а там всё в императивном стиле написано, хотя,
по-моему, задача 100% функциональная.
Почему был выбран такой подход? Или пойти лучше сначала доучиться?
13th-Oct-2007 05:33 pm (UTC)
Всё было хорошо. До последнего предложения :)
22nd-Oct-2007 11:09 am (UTC)
из клана микрософтовцев - я как-то пробовал генерить sequence diagram при помощи Rational XDE, на базе прогона юнит-теста - в принципе, получилось, но толку нет - диаграмма слишком детальная, а уменьшать ее - ручная работа

вот если бы тулзы для сбора информации умели бы как-то редуцировать диаграмму, находить только ключевые вызовы...
13th-Feb-2008 07:46 am (UTC) - о как :)
Дим, на образовательной конференции в Переславле приезжали Непейводы :) и Непейвода-младшая делала доклад на тему "Автоматизированное построение сетевого графика проекта" (два ФП -- не помню точно, чем данные разбирали, а чем обрабатывали -- и C(++?) с OpenGL на выходе). Также сетовала, что не хватает прикладных задач на подсовывать студентам, чтоб наглядно видели, где функциональные языки хороши. Тезисов настрелять? (пока не вижу опубликованных, только бумажные с собой)

А вообще надо будет в альт запаковать, только с текущим местным ghc-6.4.2:
./Dot.hs:47:0:
    Illegal instance declaration for `UsesDotEnv (State DotEnv)'
        (The instance type must be of form (T a b c)
         where T is not a synonym, and a,b,c are distinct type variables)
    In the instance declaration for `UsesDotEnv (State DotEnv)'
20th-Mar-2008 06:10 pm (UTC) - Русский язык
Anonymous
"описания бизнесовых и технических процессов"

Фраза как-то режет слух (глаз), вам не кажется?
По-моемому нет такого слова "бизнесовых", должно быть "бизнес процессов".
Или это уже "новый русского языка"?
1st-May-2008 10:22 am (UTC)
Спасибо, попробую в следующий раз, как придется рисовать!
This page was loaded May 22nd 2008, 6:47 pm GMT.