Комментарии 12
НЛО прилетело и опубликовало эту надпись здесь
Ну зачем сразу в массы то :) Так для развития. Статья на самом деле очень поверхностно касается того, чем занимался Шалыто. Это больше похоже на Event-driven Finite State Machine на ООП.
-3
Уже года 2 использую для рисования автоматов cmaptools.
На основании полученного файла генерирую код переходов и подключаю к классу, в котором объявлены функции y0, y1,...yn и z0, z1,...zn для обработки соответственно состояний и действий при переходах.
Таким образом код переходов и обработка переходов в разных местах и я в любой момент могу внести изменения через cmaptools. Естественно нужно поправить затронутый изменениями код обработки, но в целом получается железобетонная система, с помощью которой можно быстро и надёжно решить практически любую достаточно сложную задачу.
Плюс всегда остаётся подробнейшая документация к коду, в которой можно без труда разобраться и через дцать лет.
На основании полученного файла генерирую код переходов и подключаю к классу, в котором объявлены функции y0, y1,...yn и z0, z1,...zn для обработки соответственно состояний и действий при переходах.
Таким образом код переходов и обработка переходов в разных местах и я в любой момент могу внести изменения через cmaptools. Естественно нужно поправить затронутый изменениями код обработки, но в целом получается железобетонная система, с помощью которой можно быстро и надёжно решить практически любую достаточно сложную задачу.
Плюс всегда остаётся подробнейшая документация к коду, в которой можно без труда разобраться и через дцать лет.
+1
Не могли бы вы объяснить, чем вызвано такое написание циклов:
? Довольно странная конструкция, на мой взгляд. Почему не while?
for (;!pool.isEmpty() || started;) {
for (;!pool.isEmpty();) {
GramophoneEvent event = pool.poll();
event.apply(handler);
}
? Довольно странная конструкция, на мой взгляд. Почему не while?
+3
Если вопрос заключается в том «почему не while», то отвечу просто — я так привык писать и в итоге все странслируется в один и тотже код (что и был бы с while).
Два волженных цикла нужны для «зависания» потока обработки. Там ниже, в первом есть секция synchronized, на которой поток подвисает, жо тех пор пока его не разбуит вновь поступившее событие в очередь. (см код dispatch())
И я сделал так, что поток работает до тех пор, пока не выгребет все события из очереди, даже если его остановили раньше (методом disable())
Два волженных цикла нужны для «зависания» потока обработки. Там ниже, в первом есть секция synchronized, на которой поток подвисает, жо тех пор пока его не разбуит вновь поступившее событие в очередь. (см код dispatch())
И я сделал так, что поток работает до тех пор, пока не выгребет все события из очереди, даже если его остановили раньше (методом disable())
-1
У такого подхода есть слабая сторона — система закрыта для расширений пространства событий — т.к. при добавлении нового придется переписывать интерфейс GramophoneHandler, а также его наследники RadioHandler и CDHandler.
0
Зарегистрируйтесь на Хабре , чтобы оставить комментарий
Шаблоны проектирования в автоматном программировании