Skip to content

Latest commit

 

History

History
63 lines (50 loc) · 6.55 KB

File metadata and controls

63 lines (50 loc) · 6.55 KB

OOP Patterns Suggestions

Ниже — адресные предложения по паттернам под текущую структуру проекта. Это ориентиры, без изменений кода.

Strategy — управление (реализовано частично)

  • Файлы: logic/movements.*, logic/logic.*.
  • Статус: DeadzoneBaseControlStrategy для базового движения уже внедрён; можно расширить новыми стратегиями под разные раскладки и фильтры.
  • Что даст: отсутствие #define внутри настроек, лёгкое переключение/тестирование разных раскладок, возможность подмешивать фильтры (smoothing, ramping) отдельными стратегиями.

Command — навигация (не реализовано)

  • Файлы: logic/navdialog.*.
  • Идея: операции FollowWaypoints, GoThroughPoses, ClearGoals, Patrol оформить как команды INavCommand с единым исполнителем/очередью.
  • Что даст: логирование/отмена/повтор, единая точка отправки в gRPC, защита от параллельных запросов.

Observer / Pub-Sub — обновления данных (реализовано частично)

  • Файлы: network/client.cpp, logic/navdialog.cpp, logic/mapwidget.cpp.
  • Статус: сигналы mapUpdated/sensorsUpdated от grpcClient + подписка NavDialog; таймер всё ещё работает, можно убрать или упростить поллинг.
  • Что даст: меньше поллинга, меньше гонок по мьютексам, возможность легко подменить источник данных (реплей, симулятор).

Builder — сборка proto (реализовано частично)

  • Файлы: logic/navdialog.cpp, logic/movements.cpp.
  • Статус: NavCommandBuilder уже используется для follow/go-through; для completeness можно добавить builder для базового управления/камеры.
  • Что даст: меньше дублирования set_x()/set_orientation_*, все инварианты в одном месте, безопасное расширение сообщений.

State — соединение и UI (реализовано частично)

  • Файлы: network/networkcontroller.*, threads/session.*, logic/navdialog.cpp (статус задач).
  • Статус: NavDialog использует простые состояния Idle/Ready/Busy для кнопки отправки задач; сетевой слой пока без FSM.
  • Что даст: предсказуемое восстановление после обрывов, простые реакции UI на статус, меньше условных блоков в одном методе.

Factory Method / Abstract Factory — инициализация сервисов (реализовано частично)

  • Файлы: network/networkcontroller.cpp, joystick/joystick.cpp.
  • Статус: NetworkFactory для client/server, JoystickFactory для адаптера; нет фабрик под разные транспорты/симулятор.
  • Что даст: минимизация #ifdef, удобная подмена транспорта/ввода в тестах.

Adapter — границы с proto (реализовано частично)

  • Файлы: network/protobuf/*.protologic/navdialog.cpp, logic/movements.cpp, mapwidget.
  • Статус: NavigationAdapter::fromPoint покрывает позы для нав-команд; остальные сообщения (base control, сенсоры) без адаптеров.
  • Что даст: UI/логика не завязаны на схему proto, проще мигрировать протокол или менять единицы.

Template Method — потоки/воркеры (реализовано частично)

  • Файлы: threads/worker.*, threads/session.*.
  • Статус: WorkerBase с onStart/onTick/onStop; Session пока не использует его и не управляет набором воркеров.
  • Что даст: единый контроль жизненного цикла, меньше дублирования подключений сигналов/слотов.

Decorator / Composite — оверлеи карты (реализовано частично)

  • Файлы: logic/mapwidget.*.
  • Статус: слойная отрисовка через вектор лямбда-слоёв; нет явных классов IMapLayer, можно вынести слои в отдельные объекты и конфигурацию.
  • Что даст: расширяемость (trajectory/costmap/локальные цели) без роста paintEvent, гибкое управление видимостью.

Dependency Injection — тестируемость (не реализовано)

  • Файлы: конструкторы NavDialog, NetworkController, воркеры.
  • Идея: принимать интерфейсы (IMapProvider, ISensorStream, ICommandSender) и время жизни через DI-контейнер или вручную.
  • Что даст: лёгкие моки/стабы в тестах, меньше скрытых глобальных зависимостей.

Memento — история целей (реализовано)

  • Файлы: logic/navdialog.*.
  • Статус: NavGoalsHistory добавлен, поддерживает Undo/Redo списка целей.
  • Что даст: удобное откатывание/повтор маршрутов, безопасное редактирование.

Guarded Suspension / Monitor Object — синхронизация (реализовано частично)

  • Файлы: network/client.cpp (доступ к proto), logic/mapwidget.cpp.
  • Статус: NavDialog использует std::scoped_lock для одновременного доступа к map/sensors; остальное можно покрыть RAII-обёртками.
  • Что даст: меньше риска забытых блокировок и гонок, ясные владения данными.