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:
Mikhail Kilin
2026-02-05 11:30:29 +03:00
parent 776271ff36
commit bccf07501f

View File

@@ -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