вторник, 13 февраля 2018 г.

[prog.thoughts] Начинаю вспоминать, почему в свое время параллельные состояния не попали в SObjectizer :)

Параллельные состояния -- это одна из фишек иерархических конечных автоматов. Параллельность означает, что КА находится сразу в нескольких состояниях. Допустим, у КА есть ортогональные состояния A и B, а в состоянии B есть два параллельных состояния C и D. Получается, что КА может быть либо в состоянии A, либо же сразу в двух состояниях B.C и B.D.

Но самая жесть начинается когда параллельные состояния начинают вкладываться друг в друга. Простенький пример:

+==========================+
| A                        |
|   +===================+  |
|   | B                 |  |
|   |   +===========+   |  |
|   |   | C         |   |  |
|   |   +===========+   |  |
|   |                   |  |
|   |- - - - - - - - - -|  |
|   |   +===========+   |  |
|   |   | D         |   |  |
|   |   |  +=====+  |   |  |
|   |   |  | E   |  |   |  |
|   |   |  +=====+  |   |  |
|   |   |- - - - - -|   |  |
|   |   |  +=====+  |   |  |
|   |   |  | F   |  |   |  |
|   |   |  +=====+  |   |  |
|   |   |           |   |  |
|   |   +===========+   |  |
|   |                   |  |
|   +===================+  |
|                          |
|   +===================+  |
|   | G                 |  |
|   +===================+  |
|                          |
+==========================+

Есть состояние A, в нем есть два ортогональных подсостояния B и G. Внутри B есть два параллельных состояния C и D. Внутри D еще два параллельных подсостояния E и F.

Как вы думаете, в каких состояниях может находится КА?

Он может находиться либо в состоянии A.G, либо... Тра-та-та-там! A.B.C + A.B.D.E + A.B.D.F.

И ведь это еще не самый сложный случай :) Гораздо круче было бы, если бы в A.B.C были еще и свои параллельные состояния.

Приходится возвращаться к теме параллельных состояний поскольку ради этого и затевается работа над SObjectizer-5.5.22. Но вот задумываясь как же искать обработчик для сообщения, когда агент одновременно находится в состояниях A.B.C, A.B.D.E и A.B.D.F вызывает непроизвольный ужас.

Отдельный ужас возникает от мысли о том, как потом объяснять пользователю как этот поиск происходит. И почему у него вызывается обработчик из A.B.C, когда он думал, что агент находится в A.B.D.F...

Хотя да, фича, наверное полезное. Даже примеры, где она может потребоваться, не так уж сложно придумать. Но пока как-то многовато белых пятен в ней.

Комментариев нет: