9.6 KiB
9.6 KiB
F1 План рефакторинга и модульности
Дата: 2026-03-07
Статус: planned
Владелец: Engineering
1) Цель
- Уменьшить размер и связность крупных файлов без изменения поведения приложения.
- Подготовить кодовую базу к быстрому развитию desktop/web/mobile поверх одного Go API.
2) Текущие "горячие" файлы
selective-vpn-gui/vpn_dashboard_qt.py—6103строк (до старта F1.4; после текущего разреза:116+main_window/ui_shell_mixin.py+main_window/singbox/*+main_window/runtime_actions_mixin.py).selective-vpn-gui/api_client.py—2220строк.selective-vpn-gui/dashboard_controller.py—1430строк.selective-vpn-api/app/transport_handlers.go—1984строки.selective-vpn-api/app/server.go(legacy) — центральная связка entrypoints/bootstrap/routes, высокий риск регрессий при точечных изменениях.
3) Принципы разрезания
- Поведение не меняем: сначала вынос кода, потом точечные улучшения.
- Модули режем по domain-границам, а не "по 500 строк".
- Сохраняем один публичный entrypoint (facade) для UI и для backend-router.
- После каждого шага прогоняем существующие smoke/e2e (без новых требований к тестам от пользователя).
4) План разрезания GUI
4.1 vpn_dashboard_qt.py -> gui/main_window/*
- Цель: вынести табы и event-обвязку в отдельные модули.
- Разделение:
main_window.py— сборка окна и общий lifecycle.tabs/status_tab.pytabs/vpn_tab.pytabs/routes_tab.pytabs/dns_tab.pytabs/domains_tab.pytabs/trace_tab.pyservices/events_bridge.py(EventThread, dispatch)services/locations_loader.py(LocationsThread, SWR-ui orchestration)
- Критерий: исходный файл
vpn_dashboard_qt.pyстановится thin-bootstrap. - Статус: выполнено (
2026-03-10). - Уже сделано:
- добавлены
main_window/constants.pyиmain_window/workers.py(shared constants +EventThread/LocationsThread); - вынесен UI shell (
build tabs + helpers + locations/egress) вmain_window/ui_shell_mixin.py; ui_tabs_singbox_mixin.pyдополнительно разрезан наui_tabs_singbox_layout_mixin.pyиui_tabs_singbox_editor_mixin.py;- SingBox-контур дополнительно разрезан на подпакет
main_window/singbox/*(editor,cards,links,runtime) с фасадомmain_window/singbox_mixin.py; - вынесен runtime/refresh/actions контур в
main_window/runtime_actions_mixin.py; - проведён второй проход декомпозиции:
ui_tabs_*,runtime_{state,refresh,auth,ops},singbox/{links_*,runtime_*}; фасады оставлены для совместимости; MainWindowпереведён на наследование mixin-классов, поведение сохранено; в итоге крупные GUI-модули уложены в читаемые размеры (максимум~633строк).
- добавлены
4.2 dashboard_controller.py -> controllers/*
- Разделение:
controllers/status_controller.pycontrollers/vpn_controller.pycontrollers/routes_controller.pycontrollers/dns_controller.pycontrollers/domains_controller.pycontrollers/transport_controller.pycontrollers/trace_controller.py
- Сохраняется фасад
DashboardController(совместимость с текущим UI-кодом). - Статус: выполнено (
2026-03-10). - Что сделано:
- добавлен пакет
selective-vpn-gui/controllers/(core + views + domain mixin-модули); selective-vpn-gui/dashboard_controller.pyпереведён в thin-facade с прежней точкой входа;py_compileи импорты UI-модулей (vpn_dashboard_qt.py,traffic_mode_dialog.py,dns_benchmark_dialog.py) проходят.
- добавлен пакет
4.3 api_client.py -> api/*
- Разделение:
api/client.py(HTTP/SSE base + shared helpers)api/models.py(dataclasses)api/status.py,api/vpn.py,api/routes.py,api/traffic.py,api/dns.py,api/domains.py,api/trace.pyapi/transport.pyfacade +api/transport_clients.py,api/transport_policy.py,api/transport_singbox.py
- Сохраняется фасад
ApiClient(старая точка импорта для UI). - Статус: выполнено (
2026-03-10). - Что сделано:
- добавлен пакет
selective-vpn-gui/api/с доменными mixin-модулями; api_client.pyпереведён в backward-compatible facade (legacy imports сохранены);api/client.pyсокращён до base-слоя, доменные методы вынесены по подпапкам;api/transport.pyразрезан на subdomain-модули с сохранением классаTransportApiMixin.
- добавлен пакет
5) План разрезания Go-ядра
5.1 transport_handlers.go -> app/transport_*
- Разделение:
transport_handlers_clients.go(CRUD/lifecycle/health/metrics)transport_handlers_policy.go(validate/apply/rollback/conflicts)transport_validator.go(normalize + conflict detection)transport_confirm_token.go(token lifecycle)transport_state_store.go(load/save state/snapshots)
- Сохраняем текущие endpoint-path и response-контракт без изменений.
5.2 server.go -> app/entrypoints.go + api_bootstrap.go + api_routes.go
- Цель: развязать entrypoint-логику (
Run*CLI), bootstrap API-сервера и registry маршрутов. - Статус: выполнено (
2026-03-10). - Состав:
entrypoints.go—Run,RunAPIServer,RunRoutesUpdateCLI,RunRoutesClearCLI,RunAutoloopCLI, legacy-dispatch;api_bootstrap.go— bootstrap и lifecycle HTTP-сервера (runAPIServerAtAddr);api_routes.go— thin-facaderegisterAPIRoutes;api_routes_*.go— доменные registrars (core,traffic,transport,trace,dns,vpn) без изменения endpoint-path.
5.3 app/* -> подпакеты runtime (app/cli, app/bootstrap)
- Цель: убрать "кучу" в корне
appи перенести исполнимые runner-модули в отдельные папки, сохранив фасады вapp. - Статус: выполнено (
2026-03-10). - Состав:
app/cli/*—routes-update,routes-clear,autoloopраннеры с dependency-injection (callback deps);app/bootstrap/server_runner.go— единый HTTP server runner;app/entrypoints.goиapp/api_bootstrap.goоставлены thin-facade слоями.
5.4 transport_handlers.go -> модульные transport файлы
- Цель: убрать крупнейший монолит transport control-plane без изменения endpoint-контракта.
- Статус: выполнено (
2026-03-10). - Состав:
transport_shared.go— state/version constants, mutex, общие типы;transport_handlers_clients.go— clients CRUD/lifecycle/netns toggle handlers;transport_handlers_policy.go— policy validate/apply/rollback/conflicts/capabilities handlers;transport_policy_validate.go— normalize/validate/diff/conflict helpers;transport_client_runtime.go— runtime/health/lifecycle/allocation helpers;transport_tokens_state.go— confirm-token и state persistence.
5.5 Подпакеты transport (без циклических зависимостей)
- Цель: выносить переиспользуемые части transport-логики в подпапки только там, где не возникает import-cycle с
app. - Статус: in_progress (
2026-03-10). - Уже вынесено:
app/transporttoken/store.go— confirm-token store (issue/consume/ttl cleanup) и token generator.
- Дальше:
- выделить в подпакеты часть stateless helper-функций (при сохранении фасадов в
app).
- выделить в подпакеты часть stateless helper-функций (при сохранении фасадов в
6) Порядок выполнения (безопасный)
api_client.py(минимальный риск для UI, проще ревьюить).dashboard_controller.py.vpn_dashboard_qt.py(таб за табом).transport_handlers.goв Go.
7) Definition of Done
- Все текущие smoke/e2e проходят:
./tests/run_all.sh- плюс ручная проверка пользователем в desktop приложении.
- Нет изменений API-контракта (
/api/v1/*) и event-kind. - В каждом крупном модуле остаётся читаемый размер (ориентир
< 700строк; предпочтительно< 500).
8) Дополнительно (после F1)
- Добавить settings-механику видимости вкладок протоколов (
SingBox,DNSTT,Phoenix) черезQSettings/profile, чтобы включать только нужные модули UI.