Ниже — адресные предложения по паттернам под текущую структуру проекта. Это ориентиры, без изменений кода.
- Файлы:
logic/movements.*,logic/logic.*. - Статус:
DeadzoneBaseControlStrategyдля базового движения уже внедрён; можно расширить новыми стратегиями под разные раскладки и фильтры. - Что даст: отсутствие
#defineвнутри настроек, лёгкое переключение/тестирование разных раскладок, возможность подмешивать фильтры (smoothing, ramping) отдельными стратегиями.
- Файлы:
logic/navdialog.*. - Идея: операции FollowWaypoints, GoThroughPoses, ClearGoals, Patrol оформить как команды
INavCommandс единым исполнителем/очередью. - Что даст: логирование/отмена/повтор, единая точка отправки в gRPC, защита от параллельных запросов.
- Файлы:
network/client.cpp,logic/navdialog.cpp,logic/mapwidget.cpp. - Статус: сигналы
mapUpdated/sensorsUpdatedот grpcClient + подписка NavDialog; таймер всё ещё работает, можно убрать или упростить поллинг. - Что даст: меньше поллинга, меньше гонок по мьютексам, возможность легко подменить источник данных (реплей, симулятор).
- Файлы:
logic/navdialog.cpp,logic/movements.cpp. - Статус:
NavCommandBuilderуже используется для follow/go-through; для completeness можно добавить builder для базового управления/камеры. - Что даст: меньше дублирования
set_x()/set_orientation_*, все инварианты в одном месте, безопасное расширение сообщений.
- Файлы:
network/networkcontroller.*,threads/session.*,logic/navdialog.cpp(статус задач). - Статус: NavDialog использует простые состояния Idle/Ready/Busy для кнопки отправки задач; сетевой слой пока без FSM.
- Что даст: предсказуемое восстановление после обрывов, простые реакции UI на статус, меньше условных блоков в одном методе.
- Файлы:
network/networkcontroller.cpp,joystick/joystick.cpp. - Статус:
NetworkFactoryдля client/server,JoystickFactoryдля адаптера; нет фабрик под разные транспорты/симулятор. - Что даст: минимизация
#ifdef, удобная подмена транспорта/ввода в тестах.
- Файлы:
network/protobuf/*.proto↔logic/navdialog.cpp,logic/movements.cpp,mapwidget. - Статус:
NavigationAdapter::fromPointпокрывает позы для нав-команд; остальные сообщения (base control, сенсоры) без адаптеров. - Что даст: UI/логика не завязаны на схему proto, проще мигрировать протокол или менять единицы.
- Файлы:
threads/worker.*,threads/session.*. - Статус:
WorkerBaseс onStart/onTick/onStop;Sessionпока не использует его и не управляет набором воркеров. - Что даст: единый контроль жизненного цикла, меньше дублирования подключений сигналов/слотов.
- Файлы:
logic/mapwidget.*. - Статус: слойная отрисовка через вектор лямбда-слоёв; нет явных классов
IMapLayer, можно вынести слои в отдельные объекты и конфигурацию. - Что даст: расширяемость (trajectory/costmap/локальные цели) без роста
paintEvent, гибкое управление видимостью.
- Файлы: конструкторы
NavDialog,NetworkController, воркеры. - Идея: принимать интерфейсы (
IMapProvider,ISensorStream,ICommandSender) и время жизни через DI-контейнер или вручную. - Что даст: лёгкие моки/стабы в тестах, меньше скрытых глобальных зависимостей.
- Файлы:
logic/navdialog.*. - Статус:
NavGoalsHistoryдобавлен, поддерживает Undo/Redo списка целей. - Что даст: удобное откатывание/повтор маршрутов, безопасное редактирование.
- Файлы:
network/client.cpp(доступ к proto),logic/mapwidget.cpp. - Статус: NavDialog использует
std::scoped_lockдля одновременного доступа к map/sensors; остальное можно покрыть RAII-обёртками. - Что даст: меньше риска забытых блокировок и гонок, ясные владения данными.