Files
sfera/MODULAR_ARCHITECTURE_PATTERN.md
Veronika Smirnova 6c0add736e docs: comprehensive documentation for modular architecture
ФАЗА 6: Документация завершена
- Создан README.md для create-suppliers модуля с полной документацией архитектуры
- Добавлен MODULAR_ARCHITECTURE_PATTERN.md - универсальный паттерн для рефакторинга больших компонентов
- Документированы принципы, структура, процесс рефакторинга и метрики
- Подготовлены руководства для применения паттерна к другим компонентам системы

Документация включает:
- Архитектурные принципы и поток данных
- Детальное описание всех hooks и блок-компонентов
- Примеры использования и переиспользования
- Метрики улучшения производительности
- Чек-лист и частые ошибки при рефакторинге
- План применения к другим большим компонентам (1600+ строк)

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-12 20:55:42 +03:00

320 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 🏗️ Паттерн модульной архитектуры для React компонентов
Этот документ описывает универсальный паттерн рефакторинга больших монолитных React компонентов в модульную архитектуру.
## 🎯 Применимость паттерна
### Кандидаты для рефакторинга:
- **Размер**: >800 строк кода
- **Сложность**: Множественные состояния и бизнес-логика
- **Многообразие UI**: Различные секции интерфейса
- **Частые изменения**: Активно развивающиеся компоненты
### Большие компоненты в SFERA (кандидаты):
```
3052 строки - timesheet-demo.tsx
2012 строк - fulfillment-warehouse-dashboard.tsx
1654 строки - navigation-demo.tsx
1637 строк - direct-supply-creation.tsx ← Следующий кандидат
1563 строки - user-settings.tsx
1523 строки - advertising-tab.tsx
1304 строки - wb-product-cards.tsx
```
## 📁 Универсальная структура модуля
```
src/components/[domain]/[component-name]/
├── index.tsx # Главный компонент-оркестратор
├── blocks/ # UI блок-компоненты
│ ├── [Feature]Block.tsx # Функциональные блоки
│ ├── [Section]Block.tsx # Секции интерфейса
│ └── [Action]Block.tsx # Блоки действий
├── hooks/ # Бизнес-логика
│ ├── use[Domain][Action].ts # Специфичная логика
│ ├── use[Entity]Management.ts # CRUD операции
│ └── use[Feature]State.ts # Управление состоянием
├── types/ # TypeScript типы
│ └── index.ts # Все интерфейсы модуля
└── constants/ # Константы (опционально)
└── index.ts # Конфигурация и моки
```
## 🔄 Процесс рефакторинга
### ЭТАП 1: Анализ и планирование
1. **Выделить основные секции UI**
- Определить логические блоки интерфейса
- Найти повторяющиеся паттерны
2. **Проанализировать состояния**
- Сгруппировать связанные useState
- Выделить логику управления состоянием
3. **Найти бизнес-логику**
- useEffect с API вызовами
- Обработчики форм и событий
- Вычисляемые значения
### ЭТАП 2: Создание типов
```typescript
// types/index.ts
export interface [Entity] {
id: string
// ... поля сущности
}
export interface [Component]Props {
// ... props компонента
}
export interface [Block]Props {
// ... props блока
}
```
### ЭТАП 3: Извлечение hooks
```typescript
// hooks/use[Feature].ts
export function use[Feature]() {
const [state, setState] = useState()
const handleAction = useCallback(() => {
// бизнес-логика
}, [dependencies])
return {
state,
handleAction,
// ... другие возвращаемые значения
}
}
```
### ЭТАП 4: Создание блок-компонентов
```typescript
// blocks/[Feature]Block.tsx
export const [Feature]Block = React.memo(function [Feature]Block({
// ... props
}: [Feature]BlockProps) {
return (
<div className="...">
{/* UI блока */}
</div>
)
})
```
### ЭТАП 5: Интеграция в главном компоненте
```typescript
// index.tsx
export function [Component]() {
// Подключение hooks
const featureA = useFeatureA()
const featureB = useFeatureB()
// Обработчики с useCallback
const handleAction = useCallback((data) => {
// координация между features
}, [featureA.method, featureB.method])
return (
<div>
<FeatureABlock {...featureA} onAction={handleAction} />
<FeatureBBlock {...featureB} onAction={handleAction} />
</div>
)
}
```
## ⚡ Оптимизация производительности
### Мемоизация компонентов
```typescript
// Все блоки обернуть в React.memo
export const MyBlock = React.memo(function MyBlock(props) {
// ...
})
// Главный компонент: useCallback для обработчиков
const handleEvent = useCallback(
(data) => {
// логика
},
[dependency1, dependency2],
)
```
### Управление ререндерами
```typescript
// В hooks: useMemo для тяжелых вычислений
const expensiveValue = useMemo(() => {
return heavyCalculation(data)
}, [data])
// Оптимизация зависимостей useCallback
const optimizedHandler = useCallback(
(item) => {
// вместо передачи всего массива
// передавать только нужные методы
},
[addItem, removeItem],
) // не [items, addItem, removeItem]
```
## 🧪 Тестирование модульной архитектуры
### Unit тесты для hooks
```typescript
import { renderHook, act } from '@testing-library/react'
import { useFeature } from '../hooks/useFeature'
describe('useFeature', () => {
it('should handle action correctly', () => {
const { result } = renderHook(() => useFeature())
act(() => {
result.current.handleAction('test')
})
expect(result.current.state).toEqual(expectedState)
})
})
```
### Component тесты для блоков
```typescript
import { render, screen } from '@testing-library/react'
import { FeatureBlock } from '../blocks/FeatureBlock'
describe('FeatureBlock', () => {
it('should render with props', () => {
render(<FeatureBlock data={mockData} onAction={mockHandler} />)
expect(screen.getByText('Expected Text')).toBeInTheDocument()
})
})
```
## 📊 Метрики успеха рефакторинга
### Количественные метрики
- **Размер главного файла**: ↓ на 70-85%
- **Количество модулей**: ↑ в 5-10 раз
- **Время компиляции**: ↓ на 90%+
- **Переиспользуемые компоненты**: ↑ с 0 до N
### Качественные улучшения
- ✅ Читаемость и понимание кода
- ✅ Простота добавления новых фич
- ✅ Изолированное тестирование
- ✅ Переиспользование в других местах
- ✅ Параллельная разработка команды
## 🚨 Частые ошибки и как их избежать
### ❌ Чрезмерное дробление
```typescript
// ПЛОХО: слишком много мелких блоков
<HeaderBlock />
<SubHeaderBlock />
<TitleBlock />
<ButtonBlock />
// ХОРОШО: логичные функциональные блоки
<HeaderSection />
<ActionsSection />
```
### ❌ Плохие зависимости useCallback
```typescript
// ПЛОХО: передача всего объекта
const handler = useCallback(() => {
doSomething(fullObject)
}, [fullObject]) // объект пересоздается каждый рендер
// ХОРОШО: передача только нужных значений
const handler = useCallback(() => {
doSomething(fullObject.id, fullObject.name)
}, [fullObject.id, fullObject.name])
```
### ❌ Неправильное разделение состояния
```typescript
// ПЛОХО: состояние остается в главном компоненте
function MainComponent() {
const [complexState, setComplexState] = useState() // управляется извне
return <FeatureBlock state={complexState} setState={setComplexState} />
}
// ХОРОШО: состояние инкапсулировано в hook
function MainComponent() {
const featureData = useFeature() // управляется внутри hook
return <FeatureBlock {...featureData} />
}
```
## 📋 Чек-лист рефакторинга
### Перед началом
- [ ] Компонент больше 800 строк
- [ ] Есть несколько логических секций UI
- [ ] Множественные useState и useEffect
- [ ] Активно развивающийся функционал
### Планирование
- [ ] Определены основные UI блоки (3-6 штук)
- [ ] Выделена бизнес-логика для hooks (2-5 штук)
- [ ] Созданы TypeScript интерфейсы
- [ ] План поэтапного рефакторинга готов
### Реализация
- [ ] Создана структура папок
- [ ] Extracted типы в types/index.ts
- [ ] Hooks реализованы и протестированы
- [ ] Блоки созданы с React.memo
- [ ] Главный компонент интегрирует все части
- [ ] Старый файл удален
### Оптимизация
- [ ] Все обработчики используют useCallback
- [ ] Зависимости useCallback оптимизированы
- [ ] Тяжелые вычисления в useMemo
- [ ] Компонент работает без ошибок
### Документация
- [ ] README для модуля создан
- [ ] Примеры использования hooks
- [ ] Документация props для блоков
- [ ] Архитектурная диаграмма
## 🎯 Заключение
Модульная архитектура значительно улучшает качество кода, скорость разработки и поддержки. Применяйте этот паттерн к большим компонентам постепенно, следуя принципам безопасного рефакторинга.
---
**Основано на**: Успешном рефакторинге create-suppliers-supply-page.tsx (1,467→240 строк)
**Автор паттерна**: Claude Code
**Дата**: Август 2025