Как стать автором
Обновить

Комментарии 12

НЛО прилетело и опубликовало эту надпись здесь
Ну зачем сразу в массы то :) Так для развития. Статья на самом деле очень поверхностно касается того, чем занимался Шалыто. Это больше похоже на Event-driven Finite State Machine на ООП.
От Шалыто можно дождаться многого…
Да кто спорит. Может я не корректно выразился. У Шалыто — научная работа на 600 страниц и куча публикаций. А тут — автомагнитола на шаблоне «Посетитель» :)
вы случайно все не из итмо?
кто бы мог подумать :)
Из ИТМО, но к Шалыто отношения не имею :)
Уже года 2 использую для рисования автоматов cmaptools.

На основании полученного файла генерирую код переходов и подключаю к классу, в котором объявлены функции y0, y1,...yn и z0, z1,...zn для обработки соответственно состояний и действий при переходах.

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

Плюс всегда остаётся подробнейшая документация к коду, в которой можно без труда разобраться и через дцать лет.
Не могли бы вы объяснить, чем вызвано такое написание циклов:
for (;!pool.isEmpty() || started;) {
            for (;!pool.isEmpty();) {
                GramophoneEvent event = pool.poll();
                event.apply(handler);
            }

? Довольно странная конструкция, на мой взгляд. Почему не while?
Если вопрос заключается в том «почему не while», то отвечу просто — я так привык писать и в итоге все странслируется в один и тотже код (что и был бы с while).

Два волженных цикла нужны для «зависания» потока обработки. Там ниже, в первом есть секция synchronized, на которой поток подвисает, жо тех пор пока его не разбуит вновь поступившее событие в очередь. (см код dispatch())

И я сделал так, что поток работает до тех пор, пока не выгребет все события из очереди, даже если его остановили раньше (методом disable())
Чего только не встретишь. :)
Вопрос заключался именно в «почему не while». У меня просто немного голова заболела, когда я прочел
«для (ничего; пока очередь не пуста; ничего не делать) { //тело цикла }»;
вместо
«пока (очередь не пуста) { //тело цикла }» в случае с while(!pool.isEmpty()) {}

:)
У такого подхода есть слабая сторона — система закрыта для расширений пространства событий — т.к. при добавлении нового придется переписывать интерфейс GramophoneHandler, а также его наследники RadioHandler и CDHandler.
Зарегистрируйтесь на Хабре , чтобы оставить комментарий

Публикации

Истории