docs: add Phase 13 - deep architecture refactoring plan
Added comprehensive plan for refactoring oversized files and God Objects in the codebase. Current critical issues: Critical Problems: - input/main_input.rs: 1199 lines (largest file!) - app/mod.rs: 1015 lines, 116 functions (God Object) - ui/messages.rs: 893 lines - tdlib/messages.rs: 833 lines - config/mod.rs: 642 lines Phase 13 Plan (7 stages): Stage 1: Split input/main_input.rs (1199 → <200 lines) - Create input/handlers/ directory - handlers/chat.rs - open chat input handling (~300-400 lines) - handlers/chat_list.rs - chat list input (~200-300 lines) - handlers/compose.rs - edit/reply/forward modes (~200 lines) - handlers/modal.rs - delete confirm, emoji picker (~150 lines) - handlers/search.rs - search modes (~100 lines) - main_input.rs becomes router only (<200 lines) Stage 2: Reduce app/mod.rs (116 functions → traits) - Create app/methods/ directory with traits: - NavigationMethods (~15 methods) - MessageMethods (~20 methods) - ComposeMethods (~15 methods) - SearchMethods (~5 methods) - ModalMethods (~10 methods) - Keep only core in mod.rs (~30-40 methods) Stage 3: Split ui/messages.rs (893 → <300 lines) - Create ui/modals/ directory: - modals/delete_confirm.rs (~50 lines) - modals/emoji_picker.rs (~100 lines) - modals/search_modal.rs (~80 lines) - modals/profile_modal.rs (~100 lines) - Create ui/compose_bar.rs (~150 lines) - messages.rs keeps main layout (~300 lines) Stage 4: Split tdlib/messages.rs (833 → 2 files) - Create tdlib/messages/ directory: - messages/convert.rs - TDLib conversion (~500 lines) - messages/operations.rs - operations (~300 lines) Stage 5: Split config/mod.rs (642 → 3 files) - config/defaults.rs - all default_* functions (~100 lines) - config/validation.rs - validation logic (~150 lines) - config/loader.rs - file loading (~100 lines) - mod.rs - struct definitions (~200-300 lines) Stage 6: Code Duplication Cleanup - Extract common handler logic - Extract common UI components - Apply DRY principle Stage 7: Documentation Update - Update CONTEXT.md with new structure - Update PROJECT_STRUCTURE.md - Add module-level documentation - Create architecture diagram Success Metrics: Before: 4582 lines in 5 files After: Same lines in ~20+ files Benefits: Better readability, testability, maintainability, SRP compliance Status: PLANNED (comprehensive refactoring plan documented) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
250
ROADMAP.md
250
ROADMAP.md
@@ -425,3 +425,253 @@
|
||||
- `s` / `ы` - остановить воспроизведение
|
||||
- `←` / `→` - перемотка -5с / +5с (во время воспроизведения)
|
||||
- `↑` / `↓` - громкость +/- 10% (во время воспроизведения)
|
||||
|
||||
## Фаза 13: Глубокий рефакторинг архитектуры [PLANNED]
|
||||
|
||||
**Мотивация:** Код вырос до критических размеров - некоторые файлы содержат >1000 строк, что затрудняет поддержку и навигацию. Необходимо разбить монолитные файлы на логические модули.
|
||||
|
||||
**Проблемы:**
|
||||
- `src/input/main_input.rs` - 1199 строк (самый большой файл!)
|
||||
- `src/app/mod.rs` - 1015 строк, 116 функций (God Object)
|
||||
- `src/ui/messages.rs` - 893 строки
|
||||
- `src/tdlib/messages.rs` - 833 строки
|
||||
- `src/config/mod.rs` - 642 строки
|
||||
|
||||
### Этап 1: Разбить input/main_input.rs (1199 → <200 строк) [TODO]
|
||||
|
||||
**Текущая проблема:**
|
||||
- Весь input handling в одном файле
|
||||
- Функции по 300-400 строк
|
||||
- Невозможно быстро найти нужный handler
|
||||
|
||||
**План:**
|
||||
- [ ] Создать `src/input/handlers/` директорию
|
||||
- [ ] Создать `handlers/chat.rs` - обработка ввода в открытом чате
|
||||
- Переместить `handle_open_chat_keyboard_input()`
|
||||
- Обработка скролла, выбора сообщений
|
||||
- ~300-400 строк
|
||||
- [ ] Создать `handlers/chat_list.rs` - обработка в списке чатов
|
||||
- Переместить `handle_chat_list_keyboard_input()`
|
||||
- Навигация по чатам, папки
|
||||
- ~200-300 строк
|
||||
- [ ] Создать `handlers/compose.rs` - режимы edit/reply/forward
|
||||
- Обработка ввода в режимах редактирования
|
||||
- Input field управление (курсор, backspace, delete)
|
||||
- ~200 строк
|
||||
- [ ] Создать `handlers/modal.rs` - модалки
|
||||
- Delete confirmation
|
||||
- Emoji picker
|
||||
- Profile modal
|
||||
- ~150 строк
|
||||
- [ ] Создать `handlers/search.rs` - поиск
|
||||
- Search mode в чате
|
||||
- Search mode в списке чатов
|
||||
- ~100 строк
|
||||
- [ ] Обновить `main_input.rs` - только роутинг
|
||||
- Определение текущего режима
|
||||
- Делегация в нужный handler
|
||||
- <200 строк
|
||||
|
||||
**Результат:** 1199 строк → 6 файлов по <400 строк
|
||||
|
||||
### Этап 2: Уменьшить app/mod.rs (116 функций → traits) [TODO]
|
||||
|
||||
**Текущая проблема:**
|
||||
- God Object с 116 функциями
|
||||
- Сложно найти нужный метод
|
||||
- Нарушение Single Responsibility Principle
|
||||
|
||||
**План:**
|
||||
- [ ] Создать `app/methods/` директорию
|
||||
- [ ] Создать trait `NavigationMethods`
|
||||
- `next_chat()`, `previous_chat()`
|
||||
- `scroll_up()`, `scroll_down()`
|
||||
- `select_chat()`, `open_chat()`
|
||||
- ~15 методов
|
||||
- [ ] Создать trait `MessageMethods`
|
||||
- `send_message()`, `edit_message()`, `delete_message()`
|
||||
- `reply_to_message()`, `forward_message()`
|
||||
- `select_message()`, `deselect_message()`
|
||||
- ~20 методов
|
||||
- [ ] Создать trait `ComposeMethods`
|
||||
- `enter_edit_mode()`, `enter_reply_mode()`, `enter_forward_mode()`
|
||||
- `handle_input_char()`, `move_cursor_left()`, `move_cursor_right()`
|
||||
- ~15 методов
|
||||
- [ ] Создать trait `SearchMethods`
|
||||
- `start_search()`, `search_next()`, `search_previous()`
|
||||
- `clear_search()`
|
||||
- ~5 методов
|
||||
- [ ] Создать trait `ModalMethods`
|
||||
- `show_delete_confirmation()`, `show_emoji_picker()`
|
||||
- `show_profile()`, `close_modal()`
|
||||
- ~10 методов
|
||||
- [ ] Оставить в `app/mod.rs` только:
|
||||
- Struct definition
|
||||
- Constructor (new, with_client)
|
||||
- Getters/setters для полей
|
||||
- ~30-40 методов
|
||||
|
||||
**Структура:**
|
||||
```rust
|
||||
// app/mod.rs - только core
|
||||
impl<T: TdClientTrait> App<T> {
|
||||
pub fn new() -> Self { ... }
|
||||
pub fn config(&self) -> &Config { ... }
|
||||
}
|
||||
|
||||
// app/methods/navigation.rs
|
||||
pub trait NavigationMethods {
|
||||
fn next_chat(&mut self);
|
||||
fn previous_chat(&mut self);
|
||||
}
|
||||
impl<T: TdClientTrait> NavigationMethods for App<T> { ... }
|
||||
|
||||
// app/methods/messages.rs
|
||||
pub trait MessageMethods {
|
||||
async fn send_message(&mut self, text: String);
|
||||
}
|
||||
impl<T: TdClientTrait> MessageMethods for App<T> { ... }
|
||||
```
|
||||
|
||||
**Результат:** 116 функций → 6 trait impl блоков
|
||||
|
||||
### Этап 3: Разбить ui/messages.rs (893 → <300 строк) [TODO]
|
||||
|
||||
**Текущая проблема:**
|
||||
- Весь UI рендеринг сообщений в одном файле
|
||||
- Модалки смешаны с основным рендерингом
|
||||
- Compose bar (input field) в том же файле
|
||||
|
||||
**План:**
|
||||
- [ ] Создать `ui/modals/` директорию
|
||||
- [ ] Создать `modals/delete_confirm.rs`
|
||||
- Рендеринг модалки подтверждения удаления
|
||||
- Обработка y/n input
|
||||
- ~50 строк
|
||||
- [ ] Создать `modals/emoji_picker.rs`
|
||||
- Рендеринг сетки эмодзи
|
||||
- Навигация по сетке
|
||||
- ~100 строк
|
||||
- [ ] Создать `modals/search_modal.rs`
|
||||
- Поиск в чате
|
||||
- Подсветка результатов
|
||||
- Навигация по совпадениям
|
||||
- ~80 строк
|
||||
- [ ] Создать `modals/profile_modal.rs`
|
||||
- Профиль пользователя/чата
|
||||
- Отображение информации
|
||||
- ~100 строк
|
||||
- [ ] Создать `ui/compose_bar.rs`
|
||||
- Поле ввода сообщения
|
||||
- Превью для edit/reply/forward
|
||||
- Курсор, автоматический wrap
|
||||
- ~150 строк
|
||||
- [ ] Оставить в `messages.rs`:
|
||||
- Основной layout сообщений
|
||||
- Рендеринг списка message bubbles
|
||||
- Группировка по дате
|
||||
- Pinned message
|
||||
- ~300 строк
|
||||
|
||||
**Результат:** 893 строки → 6 файлов по <150 строк
|
||||
|
||||
### Этап 4: Разбить tdlib/messages.rs (833 → 2 файла) [TODO]
|
||||
|
||||
**Текущая проблема:**
|
||||
- Смешивается конвертация из TDLib и операции
|
||||
- Большой файл сложно читать
|
||||
|
||||
**План:**
|
||||
- [ ] Создать `tdlib/messages/` директорию
|
||||
- [ ] Создать `messages/convert.rs`
|
||||
- Конвертация MessageContent из TDLib
|
||||
- Парсинг всех типов (Text, Photo, Video, Voice, etc.)
|
||||
- Обработка форматирования (entities)
|
||||
- ~500 строк
|
||||
- [ ] Создать `messages/operations.rs`
|
||||
- send_message(), edit_message(), delete_message()
|
||||
- forward_message(), reply_to_message()
|
||||
- get_chat_history(), load_older_messages()
|
||||
- ~300 строк
|
||||
- [ ] Обновить `tdlib/messages.rs` → `tdlib/messages/mod.rs`
|
||||
- Re-export публичных типов
|
||||
- ~30 строк
|
||||
|
||||
**Результат:** 833 строки → 2 файла по <500 строк
|
||||
|
||||
### Этап 5: Разбить config/mod.rs (642 → 3 файла) [TODO]
|
||||
|
||||
**Текущая проблема:**
|
||||
- Много default_* функций (по 1-3 строки каждая)
|
||||
- Validation logic смешана с определениями
|
||||
- Сложно найти нужную секцию конфига
|
||||
|
||||
**План:**
|
||||
- [ ] Создать `config/defaults.rs`
|
||||
- Все default_* функции
|
||||
- ~100 строк
|
||||
- [ ] Создать `config/validation.rs`
|
||||
- Валидация timezone
|
||||
- Валидация цветов
|
||||
- Валидация notification settings
|
||||
- ~150 строк
|
||||
- [ ] Создать `config/loader.rs`
|
||||
- Загрузка из файла
|
||||
- Поиск путей (XDG, home, etc.)
|
||||
- Обработка ошибок чтения
|
||||
- ~100 строк
|
||||
- [ ] Оставить в `config/mod.rs`:
|
||||
- Struct definitions
|
||||
- Default impls (вызывают defaults.rs)
|
||||
- Re-exports
|
||||
- ~200-300 строк
|
||||
|
||||
**Результат:** 642 строки → 4 файла по <200 строк
|
||||
|
||||
### Этап 6: Code Duplication Cleanup [TODO]
|
||||
|
||||
**План:**
|
||||
- [ ] Найти дублированный код в handlers
|
||||
- Общая логика обработки клавиш
|
||||
- Вынести в `input/common.rs`
|
||||
- [ ] Найти дублированный код в UI
|
||||
- Общие компоненты рендеринга
|
||||
- Вынести в `ui/components/`
|
||||
- [ ] Использовать DRY принцип везде
|
||||
|
||||
### Этап 7: Documentation Update [TODO]
|
||||
|
||||
**План:**
|
||||
- [ ] Обновить CONTEXT.md с новой структурой
|
||||
- [ ] Обновить PROJECT_STRUCTURE.md
|
||||
- [ ] Добавить module-level документацию
|
||||
- [ ] Создать architecture diagram (ASCII)
|
||||
|
||||
### Метрики успеха
|
||||
|
||||
**До рефакторинга:**
|
||||
```
|
||||
input/main_input.rs: 1199 строк
|
||||
app/mod.rs: 1015 строк (116 функций)
|
||||
ui/messages.rs: 893 строки
|
||||
tdlib/messages.rs: 833 строки
|
||||
config/mod.rs: 642 строки
|
||||
ИТОГО: 4582 строки в 5 файлах
|
||||
```
|
||||
|
||||
**После рефакторинга:**
|
||||
```
|
||||
input/handlers/*.rs: ~6 файлов по <400 строк
|
||||
app/methods/*.rs: ~6 traits с impl блоками
|
||||
ui/modals/*.rs: ~4 файла по <150 строк
|
||||
tdlib/messages/*.rs: 2 файла по <500 строк
|
||||
config/*.rs: 4 файла по <200 строк
|
||||
ИТОГО: те же строки, но в ~20+ файлах
|
||||
```
|
||||
|
||||
**Преимущества:**
|
||||
- ✅ Легче найти нужный код
|
||||
- ✅ Легче тестировать модули
|
||||
- ✅ Меньше конфликтов при работе в команде
|
||||
- ✅ Лучше читаемость и поддерживаемость
|
||||
- ✅ Соблюдение Single Responsibility Principle
|
||||
|
||||
Reference in New Issue
Block a user