DRAKON.SU

Текущее время: Понедельник, 20 Январь, 2020 09:26

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 11 ] 
Автор Сообщение
СообщениеДобавлено: Вторник, 04 Сентябрь, 2012 01:02 

Зарегистрирован: Вторник, 20 Ноябрь, 2007 10:45
Сообщения: 31
Здравствуйте,

занимаясь разработкой "клиентских" приложений для всяких Web 2.0 часто приходится писать компоненты-контроллеры (С в шаблоне MVC), которые выполняют последовательные, но асинхронные действия, и во время ожидая завершения асинхронной операции дергать их за методы, изменяющие их состояние не желательно (можно конечно, но это сильно усложняет компонент). Хорошей абстракцией для таких контроллеров является детерминированный конечный автомат, и в Драконе, с помощью силуэта, хорошо изображать диаграмму переходов такого автомата, правда с асинхронностью проблемы, но если сразу принять что все события асинхронны, то жить можно.

Одна проблема - если в автомате больше 5-7 состояний то его диаграмма превращается в этакую ленту (малая высота, большая ширина), с которой не удобно работать. Я проанализировал свои контроллеры и заметил что часто встречаются состояния, переход в которые происходит только из одного предшествующего состояния, по сути были бы переходы синхронными это было бы одно состояние. Такие состояния я называю "вспомогательными".

Например, в браузере достаточно сложно, иногда невозможно, сделать настоящий модальный диалог (если мы хотим чтобы приложение было одинаково совместимо со всеми браузерами), и допустим у нас выполняется некий асинхронный XHR (XmlHttpRequest) запрос к серверу, во время запроса, наш вид (V в MVC) мирно показывает индикатор выполнения запроса, и вдруг сервер "отвалился" (у пользователя кратковременно пропала связь с сетью), в таком случае контроллер, у меня, показывает модальное сообщение: "дескать нет соединения с сервером, не желает ли пользователь запрос повторить?". Пользователь в свою очередь может либо нажать кнопку "Повторить", либо "Отменить" операцию. При успешном завершении или отмене операции вид переключается в изначальное состояние, показывает какую нибудь форму ввода данных вместо индикатора выполнения запроса. Здесь - ожидание выполнения запроса сервером, и показывание предупреждения пользователю - два разных состояния контроллера. Пример диаграммы для контроллера формы сброса пароля пользователя дан ниже.
Вложение:
PasswordResetLinear.png
PasswordResetLinear.png [ 67.68 КБ | Просмотров: 6925 ]
Тут простым состоянием является (Prompting for retry).

Запрос на сброс пароля достаточно простой, сервер может вернуть 3 класса ответов:
  • успех
  • ошибка - сервер на обслуживании
  • ошибка - любая другая (которая не факт что проявится при следующем запросе, запрос мог не пройти, сервер мог не успеть запрос обработать, словить исключение из-за недостатка памяти, и т.д., т.е. такая ошибка которая не зависит от данных переданных клиентом и может быть исправлена повторным запросом).
Проблемы начинаются когда бизнес логика достаточно сложная и сервер может возвращать ошибки с разными кодами, на каждый из которых надо как-то уведомлять пользователя. Например, при аутентификации пользователя, в приложении над которым я сейчас работаю, сервер может вернуть ошибки:
  • неверные логин/пароль
  • неверный пароль и осталось попыток N из M
  • неверный пароль и пользователь заблокирован (и теперь должен пароль сбрасывать и восстанавливать)
  • требуется ввести код доступа полученный по SMS
  • требуется ввести код доступа со скрэтч-карты
  • пользователь заблокирован администратором
  • пользователь опознан, но он ещё не завершил процесс активации
  • пользователь может аутентифицироваться только по SSO (через OpenID или SAML)
8 - вариантов, 8 - вспомогательных состояний, диаграмма переходов превращается в ленту (почти Мёбиуса), работать неудобно ;)

Мое предложение - изображать такие вспомогательные состояния в той же ветке силуэта что и состояние из которого совершается переход во вспомогательное так, как показано ниже, см. ветку (Requesting):
Вложение:
PasswordResetPlanar1.png
PasswordResetPlanar1.png [ 77.09 КБ | Просмотров: 6925 ]
В таком случае диаграмма может принять вид более близкий к листу или области просмотра / редактирования редактора диаграмм.

Если присмотреться, то в диаграммах выше есть ещё одно вспомогательное состояние - (Prompting for email), если также вынести его предложенным способом, то получается вот такая диаграмма:
Вложение:
PasswordResetPlanar2.png
PasswordResetPlanar2.png [ 78.1 КБ | Просмотров: 6925 ]

Предложенным способом мы сохраняем асинхронную природу диаграммы и автомата, но прячем вспомогательные состояния на более низкий уровень, тем самым снижая уровень шума, привносимый ими в диаграмму, ну или просто более равномерно используем ограниченное горизонтальное и вертикальное пространство. Прошу высказываться ;) Спасибо.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 04 Сентябрь, 2012 12:18 
Аватара пользователя

Зарегистрирован: Вторник, 04 Октябрь, 2011 17:45
Сообщения: 536
Уважаемый MaximGB!

Зверскую выразительную силу конечных автоматов недооценивают. В том числе и потому,
что их не всегда удобно рисовать. К счастью, ДРАКОН хорошо помогает в этом деле.

Вы показали отличный пример изображения конечного автомата в ДРАКОНе.

Но есть небольшое замечание.
Я категорически против помещения пары икон "Конец ветки" ("Адрес") и "Начало ветки" в середину ветки.
Задача иконы "Конец ветки" -- показать, что это конец. Всё. Ниже ничего уже нет.
Глаз прочно связывает форму иконы и её смысл. Это один из секретов удобства ДРАКОНа.

Если поставить икону "Конец ветки" в середину, то читатель будет думать: "это конец или ещё нет?".
Читатель будет напряжённо думать о схеме, а не об алгоритме.

Кроме того, на вашей диаграмме нарушается важное правило ДРАКОНа о том, что внутрь ветки есть только
один вход -- через её начало. Такое нарушение есть, например, во вспомогательной ветке "Prompting for retry".

Тем не менее, ваша идея о вспомогательных состояниях -- отличная вещь.
Предлагаю небольшое косметическое улучшение ваших диаграмм.
Вместо пары "Конец"-"Начало" можно поставить икону-комментарий. Тогда и волки сыты
(идея подсостояния наглядно выражена). И овцы целы (принципы ДРАКОНа не нарушаются).


Вложения:
PasswordResetPlanar2_corrected.png
PasswordResetPlanar2_corrected.png [ 81.84 КБ | Просмотров: 6900 ]
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 04 Сентябрь, 2012 21:14 

Зарегистрирован: Вторник, 20 Ноябрь, 2007 10:45
Сообщения: 31
Степан, спасибо за Ваш ответ ;)

Степан Митькин писал(а):
Вы показали отличный пример изображения конечного автомата в ДРАКОНе.

Спасибо ;)
Степан Митькин писал(а):
Но есть небольшое замечание.
Я категорически против помещения пары икон "Конец ветки" ("Адрес") и "Начало ветки" в середину ветки.
Задача иконы "Конец ветки" -- показать, что это конец. Всё. Ниже ничего уже нет.
Глаз прочно связывает форму иконы и её смысл. Это один из секретов удобства ДРАКОНа.

Если поставить икону "Конец ветки" в середину, то читатель будет думать: "это конец или ещё нет?".
Читатель будет напряжённо думать о схеме, а не об алгоритме.

Возможно, но мне всё-таки кажется, что размещение сразу под иконкой "адрес" иконки "имя ветки" и соединение их линей такой же толщины что и основа силуета решает эту проблему.
Степан Митькин писал(а):
Кроме того, на вашей диаграмме нарушается важное правило ДРАКОНа о том, что внутрь ветки есть только один вход -- через её начало. Такое нарушение есть, например, во вспомогательной ветке "Prompting for retry".

Да, тут согласен, но это легко исправляется, см. пример ниже.
Вложение:
PasswordResetPlanar2b.png
PasswordResetPlanar2b.png [ 79.86 КБ | Просмотров: 6878 ]

Степан Митькин писал(а):
Тем не менее, ваша идея о вспомогательных состояниях -- отличная вещь.

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

С вашем предложением не согласен. Во-первых, иконка комментария в Драконе мне не очень нравится, я предпочитаю использовать UML'ый вариант начертания, но это субъективно, во-вторых, да это способ обозначить вспомогательное состояние, но таким же образом, комментариями, можно обозначать вообще что угодно, также мы теряем аналогию с обозначением других "основных" состояний автомата.

Могу предложить аналогичный способ - ввести дополнительную иконку, "короткое замыкание":
Вложение:
addressSc.png
addressSc.png [ 6.48 КБ | Просмотров: 6878 ]

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 05 Сентябрь, 2012 10:41 

Зарегистрирован: Воскресенье, 01 Ноябрь, 2009 05:13
Сообщения: 1443
В общем, тоже элементы "примитивизации" силуэта, если о форме?..
Содержательно - тут вроде как вопрос декомпозиции сложного автомата?..


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 05 Сентябрь, 2012 15:03 

Зарегистрирован: Вторник, 20 Ноябрь, 2007 10:45
Сообщения: 31
Здравствуйте,
Владислав Жаринов писал(а):
В общем, тоже элементы "примитивизации" силуэта, если о форме?..
Скорее перекомпоновки
Владислав Жаринов писал(а):
Содержательно - тут вроде как вопрос декомпозиции сложного автомата?..
Да, для не примитивных КА "ленточные" силуэты получаются почти всегда, и сделать их (КА) примитивными либо не всегда понятно как, либо получаем "муку" из классов вместо "кирпичей" (строительных блоков). В общем, я пытаюсь найти баланс между количеством классов и размером диаграмм путём добавления вертикальных уровней в силуэт.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 05 Сентябрь, 2012 19:08 

Зарегистрирован: Воскресенье, 01 Ноябрь, 2009 05:13
Сообщения: 1443
Так нужно ли искать баланс между формой и содержанием?.. :) Или у Вас предполагается, что реализация каждой ветки - один класс?..


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 05 Сентябрь, 2012 19:50 

Зарегистрирован: Вторник, 20 Ноябрь, 2007 10:45
Сообщения: 31
Владислав Жаринов писал(а):
Так нужно ли искать баланс между формой и содержанием?.. :) Или у Вас предполагается, что реализация каждой ветки - один класс?..

Нет у меня предполагается что одна диаграмма это один класс, проблема в том что при наличии, скажем 5-10 состояний, в каждое из которых может приходить 1-5 событий, диаграмма становится очень похожей на ленту, с которой очень неудобно работать в редакторе диаграмм, я пользуюсь yEd, но думаю что в специализированных Дракон-редакторах проблема будет такая же, до тех пор пока не будут решены соответствующие проблемы usability: удобная навигация, переход от общего вида к частному, фокусировка на ветке - ветках, в общем большинство из тех предложений для усовершенствования редакторов, что обсуждаются в разделе "Инструменты ДРАКОН-схем".


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 06 Сентябрь, 2012 08:44 

Зарегистрирован: Воскресенье, 24 Февраль, 2008 15:32
Сообщения: 4588
Откуда: Москва
Уважаемый Максим,

у меня два вопроса:

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

Например, если удобно разделить силуэт на две ленточки, то на одном листе бумаги (на одном экране) можно разместить 2 ленточки друг под другом.
Для этого я ввел в графический алфавит ДРАКОНа икону "соединитель" (кружок). Она описана в книгах 2010 и 2012 года.

Преимущество в том, что площадь листа (экрана) используется более рационально.
Как Вы к этому относитесь?

2. Если не трудно, покажите Вашу икону "комментарий". Как она выглядит?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 06 Сентябрь, 2012 11:09 
Аватара пользователя

Зарегистрирован: Вторник, 04 Октябрь, 2011 17:45
Сообщения: 536
MaximGB писал(а):
...до тех пор пока не будут решены соответствующие проблемы usability: удобная навигация, переход от общего вида к частному, фокусировка на ветке - ветках

DRAKON Editor уже может кое-что из этого:
- Просмотр сразу всей диаграммы. Главное меню / View / See all. По этой команде вся диаграмма целиком показывается на экране.
- Переход к началу диаграммы. Правая кнопка мыши / Home.
- Быстрый выбор масштаба 100%. Правая кнопка мыши / Zoom 100%. Зум делается в ту точку, где пользователь щёлкнул правой кнопкой мыши.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 06 Сентябрь, 2012 14:37 

Зарегистрирован: Вторник, 20 Ноябрь, 2007 10:45
Сообщения: 31
Уважаемый, Владимир Даниелович, спасибо за подсказку:
Владимир Паронджанов писал(а):
Уважаемый Максим,

у меня два вопроса:

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

Например, если удобно разделить силуэт на две ленточки, то на одном листе бумаги (на одном экране) можно разместить 2 ленточки друг под другом.
Для этого я ввел в графический алфавит ДРАКОНа икону "соединитель" (кружок). Она описана в книгах 2010 и 2012 года.

Преимущество в том, что площадь листа (экрана) используется более рационально.
Как Вы к этому относитесь?

Своё отношение я пока не сформировал, в данный момент я работаю над диаграммой КА которая как-раз получается ленточной, пока я её перекомпоновал мною предложенным способом, думаю я разрежу её так, как предлагаете Вы, и посмотрю что получится, результаты могу разместить в этой теме для сравнения и обсуждения.

Владимир Паронджанов писал(а):
2. Если не трудно, покажите Вашу икону "комментарий". Как она выглядит?

Икона "комментарий" в UML выглядит как прямоугольник с одним загнутым углом:
Вложение:
comment.png
comment.png [ 1.4 КБ | Просмотров: 6772 ]
мне она кажется визуально более привлекательной чем та, что сейчас введена в Дракон.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 06 Сентябрь, 2012 23:19 
Аватара пользователя

Зарегистрирован: Суббота, 29 Март, 2008 19:27
Сообщения: 1056
Откуда: Россия, Чебоксары
MaximGB писал(а):
Икона "комментарий" в UML выглядит как прямоугольник с одним загнутым углом:... мне она кажется визуально более привлекательной чем та, что сейчас введена в Дракон.
Совершенно согласен!


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 11 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2008-2020, участники конференции «DRAKON.SU», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB