|
Написание клеточного автомата. | ☑ | ||
---|---|---|---|---|
0
Torquader
19.09.16
✎
12:41
|
Столкнулся с необходимостью реализации алгоритма в виде клеточного автомата (это такая система, которая находится в одном из нескольких состояний).
Обычно, клеточный автомат описывается через серию меток (одна на каждое состояние) и операторов Goto. Второй общеупотребимый вариант - использование таблицы функций из которой выбирается функция, соответствующая состоянию, так как в 1С указателей на функции нет, а использование "Выполнить" вызывает компиляцию заключённого в него выражения, то этот метод отпадает. Конечно, часто используется Switch, то опять же, в 1С его нет и он не сильно отличается по смыслу от goto. Просто, хотелось бы понять, есть ли способ описания, который по пониманию не сильно отличается от goto (последние в коде 1С смотрятся не очень). Заранее благодарен за ответы. |
|||
1
Fragster
гуру
19.09.16
✎
12:42
|
Если ... ИначеЕсли и есть switch и при этом СИЛЬНО отличается от goto...
|
|||
2
Fragster
гуру
19.09.16
✎
12:43
|
вернее по классике switch как раз и был с goto в конец, если-инаечеесли этого лишен, и правильно.
|
|||
3
Torquader
19.09.16
✎
12:44
|
(1) По производительности тоже отличается, так как если состояний больше десяти, то при каждом переходе будет выполняться сравнение всех от начала.
|
|||
4
Fragster
гуру
19.09.16
✎
12:47
|
(3) у тебя сравнение состояния выполняется по времени сопоставимо с "действием"? тогда проведи частотный анализ и наиболее массовые "позитивные" условия вынеси вверх. В switch сравнение также происходит последовательно.
|
|||
5
Torquader
19.09.16
✎
12:47
|
(2) Как бы, аналог switch:
Пока Истина Цикл Если СостояниеАвтомата=Состояние1 Тогда // что-то выполняем Продолжить; КонецЕсли; Если СостояниеАвтомата=Состояние2 Тогда // что-то выполняем Продолжить; КонецЕсли; Сообщить("Неизвестное состояние:"+СостяниеАвтомата); Прервать; КонецЦикла; |
|||
6
Torquader
19.09.16
✎
12:49
|
(4) Естественно - автомат проверяет некоторые данные, которые изменяются из-вне и переходит в состояния - данных - там несколько ячеек памяти через COM-объект.
На некоторые состояния система начинает выполнять действие, но периодически должна проверять, что "ничего не случилось". |
|||
7
Fragster
гуру
19.09.16
✎
12:50
|
(5) не совсем верно.
полный аналог очень кривой, так как без продолжить и без проверки "последующих условий", т.е. Если Условие 1 гоуту метка 1 Если Условие 2 гоуту метка 2 ... метка 1 действие 1 метка 2 действие 2 ... и если действие 1 не включает в себя переход в конец, то действие2 при условии 1 также будет выполнено (6) тогда в чем проблема-то? чего не хватает? разницы же нет. |
|||
8
Torquader
19.09.16
✎
12:51
|
Видимо, часть "быстрых" проверок придётся вынести в COM-объект, где на Си прекрасно пишется с goto, а то, что останется в 1С, можно и через Если ИначеЕсли сделать.
|
|||
9
Torquader
19.09.16
✎
12:54
|
с goto получается так:
goto НачальноеСостояние; Метка Состояние1: // какой-то код Если Условие1()=ИСТИНА Тогда goto Состояние2; КонецЕсли; // ещё какой-то код Если Условие2()=ИСТИНА Тогда goto Состояние3; КонецЕсли; Метка Состояние2: // какой-то код Метка Состояние3: // какой-то код Просто, над каждой меткой можно написать комментарий о состоянии, и попадать в это состояние можно из любого места кода. |
|||
10
Garykom
гуру
19.09.16
✎
12:55
|
Клеточный автомат прекрасно через объекты, списки, таблицы и переменные описывается в виде графа направленного.
|
|||
11
Torquader
19.09.16
✎
12:55
|
Просто, хотелось бы, чтобы если кто-то в этом коде начал копаться, он хоть как-то мог понять, что этот код делает.
|
|||
12
Fragster
гуру
19.09.16
✎
12:55
|
(9) так в 1с все также реализовывается на ИначеЕсли
|
|||
13
Torquader
19.09.16
✎
12:56
|
(10) Ну, и где это в 1С ?
|
|||
14
DailyLookingOnA Sunse
19.09.16
✎
12:56
|
(13)
Структуры и соответствия. |
|||
15
Garykom
гуру
19.09.16
✎
12:57
|
(10)+ https://habrahabr.ru/post/65367/
(11) Нафуя? К примеру regexp все по сути конечные (а не "клеточные") автоматы но ни одно ни другое мало кто осилил )) |
|||
16
DailyLookingOnA Sunse
19.09.16
✎
12:57
|
Ну и до кучи: конечный автомат.
Клеточный автомат - это про другое. |
|||
17
Garykom
гуру
19.09.16
✎
12:57
|
(13) ТЗ и переменные есть в 1С ))
|
|||
18
Torquader
19.09.16
✎
12:58
|
Просто вариант вида:
Пока лбРаботает=ИСТИНА Цикл Если(СостояниеАвтомата>=МинимальноеСостояние)И(СостояниеАвтомата<=МаксимальноеСостояние)Тогда Выполнить("ОбработкаСостояния"+Формат(СостояниеАвтомата,"ЧГ=0;ЧН=0;")); КонецЕсли; КонецЦикла; // как-то не очень понятным кажется. |
|||
19
Torquader
19.09.16
✎
13:01
|
(17) Ну, понятно, что можно взять таблицу или список, где записан код состояния и вызываемая функция и просто менять текущую строку этого списка, но это примерно тоже самое, что и (18).
Опять же, можно даже исхитриться и запихать в таблицу условия, чтобы сам код был интерпретатором того, что написано в таблице - но - добавит ли это понимания. С таблицей, просто, не меняя код, можно новое состояние добавить - но, вопрос, в скорости работы. Это же, всё-таки, не JavaScript - где и вопросов не возникает, как реализовывать. |
|||
20
Fragster
гуру
19.09.16
✎
13:01
|
Если Состояние = Состояние 1 Тогда
ДействияСостояния1(); ИначеЕсли Состояние = Состояние 2 Тогда ДействияСостояния2(); ИначеЕсли Состояние = Состояние 3 Тогда ДействияСостояния1(); // ну хз, зачем, но автор, видимо, хочет ДействияСостояния3(); ... |
|||
21
Torquader
19.09.16
✎
13:03
|
(20) У меня такая "фигня" была, когда я в DOS-приложении Wizzard писал - он как раз конечным автоматом и являлся и, по сравнению с нажатием кнопок пользователем, всё остальное было не существенно.
|
|||
22
Garykom
гуру
19.09.16
✎
13:04
|
(19) В 1С есть ООП в виде объектов (справочники, документы, обработки) кто мешает заюзать?
И будет КА в виде справочников к примеру с ТЧ где другие следующие справочники )) |
|||
23
Torquader
19.09.16
✎
13:07
|
(22) Ты предлагаешь сразу писать КА, который будет пользователем настраиваться.
Понятно, что справочник - это состояния, а в табличных частях можно написать условия перехода и ссылки на новые состояния. Всё будет красиво и просто и даже таблицу потом по состояниям можно распечатать, чтобы пользователю удобно было. Но, мы-то пишем код для программистов, пользователю вообще не нужно знать, что там что-то работает - ему нужен результат. |
|||
24
1dvd
19.09.16
✎
13:07
|
(20) +1
(21) не пойму чего тебе не нравится |
|||
25
Torquader
19.09.16
✎
13:11
|
(24) Просто, (20) нужно заворачивать в цикл.
Просто, к сожалению, состояние не одной переменной определяется - If-ы будут вложенные. В общем, я понял, всем нравится (20) - значит, в коде будет (20) - по крайней мере, если кто-то встретит, все будут понимать, что тут происходит. А вот над (22) и (23) подумаем на будущее - программируемый исполнитель - это тоже очень хорошо. |
|||
26
Garykom
гуру
19.09.16
✎
13:15
|
(25) Ну вот изобрел бизнес процессы и диаграммы
|
|||
27
Garykom
гуру
19.09.16
✎
13:16
|
(26)+ Если 8-ка то кстати бизнес-процессы пойдут на ура, это в 77 повозиться пришлось бы
|
|||
28
Torquader
19.09.16
✎
13:19
|
(26) Карта маршрута бизнет-процесса доступна только в конфигураторе - пользователи ей только пользуются.
|
|||
29
Fragster
гуру
19.09.16
✎
14:02
|
(28) а мужики-то не знают...
|
|||
30
Torquader
19.09.16
✎
15:29
|
(29) Бизнес-процесс - это МНОЖЕСТВО процессов, каждый из которых может находиться в каком-то состоянии, согласно маршруту.
Понятно, что через неё можно описать автомат или её саму рассматривать как автомат, но изменение состояния процесса - запись в базу данных - точно не быстрая операция. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |