Графы получились симпатичные. Попался таки не ленивый человек, smur! Хотя, для такой простой задачи, они скорее усложняют восприятие.
smur писал(а): События типа - Пуск, Стоп, Препятствие нужно убрать на более низкий уровень.
В приведенном мной примере подход событийный. Где, инициатором любого действия или последовательности действий, является событие. Событийным подходом мы часто пользуемся, когда пишем оконные приложения. Форма всегда находится в ожидании события: щелчка на кнопке, ввода текста и т.д. Робот, в программном смысле для нас тоже является объектом, со своими методами свойствами и событиями. Т.е. такой подход к нему тоже применим. (Это я не поучаю, а для себя пытаюсь сделать какие-то обобщения
) Проблема такого подхода, что при сложной, разветвленной логике, когда одно событие может генерировать десяток различных действий, в зависимости от дополнительных условий, теряется нить последовательности происходящего. Появляется знаменитый switch, а те же таблицы переходов, как мы видели, окончательно убивают читабельность программы. Хотя, конечно, делают код более компактным. Так же меня всегда напрягало то обстоятельство, что уже выполняющийся участок кода м.б. запущен повторно при возникновении того-же события. Та же кнопка ПУСК. Значит на событие придется ставить защелку- триггер, который потом придется сбрасывать.
Другой подход, когда событие изменяет свойство (состояние) робота, при этом не генерируя непосредственно ни каких действий. Т.е. робот стоял, а теперь он двигается. Та часть программы, которую мы называем сценарием, периодически опрашивает состояние робота и исходя из результатов, принимает решение, что делать дальше. Получается последовательное представление действий, а не параллельное. Что гораздо лучше воспринимается. Но, и тут есть свои недостатки. Например состояние ПРЕПЯТСТВИЕ приходится опрашивать весьма часто, что приводит к умельчению шагов.
Видимо самый правильный - это комплексный подход, концепцию которого я и хотел тут выработать.
Идея всей этой темы была изначально очень простая: Та часть кода, в которую возможно предстоит вносить изменения во время эксплуатации робота, или его развитии, находится в отдельном месте (классе, вкладке, файле) и оформляется по определенным правилам, гарантирующим быстрое ее понимание, как создателем, так и сторонним пользователем. Т.е. отладили навигацию по карте - забыли про нее. Пусть она будет где-то в недрах твоей программы и устроена как угодно хитро. А помним только про функцию, которая нам говорит куда по этой карте ехать и зачем.
Я, в принципе, так и стараюсь делать. Все настройки робота, которые возможно надо будет менять при эксплуатации, хранятся в отдельном классе, а свойства тех классов, где они используются, загружают эти настройки при инициализации. Фразы для робота тоже хранятся отдельно, чтобы не искать по всему коду, где их поменять. И т.д. Я подозревал, что все именно так и поступают, и просто хотел выяснить кто как пишет то, что я называю сценарием.
Добавлено спустя 55 минут 19 секунд:Как развитие этой темы, появляется другая интересная возможность, о которой тоже тут говорили. Если мы оформляем этот самый сценарий в виде отдельного файла и, соответственно, пишем к нему интерпретатор. То сценарии сможет писать любой желающий и в том числе сам робот. Ничего фантастического в этом не вижу. Например, собирался провести такой эксперимент с Ванессой: для того, чтобы добраться до места назначения она рассчитывает оптимальный маршрут по карте, по принципу ближайшего расстояния. Это уже можно назвать генерацией сценария поведения. Можно его сохранить в файл и считать сценарием проезда из пункта А в Б. Далее, робот обнаруживает, что на самом коротком маршруте стало появляться не обозначенное на карте препятствие в одном и том же месте. Т.е. маршрут уже не очень оптимальный. Робот запоминает это обстоятельство (опыт) и вносит изменения в собственные сценарий. Конечно, робот может хранить свой опыт и маршруты во внутренней БД и не считать это сценарием. Прелесть сценария в том, что пользователь, может его легко прочитать, наблюдая за "полетом мысли и фантазии" своего робота.