Контроль качества
Философия: Архитектурные правила не должны существовать только в документации. Нарушения должны автоматически блокироваться на этапе разработки, коммита и CI/CD.
Цель: Предотвратить деградацию архитектуры через автоматизированный контроль.
Временные упрощения (MVP)
Схема принятия решения об упрощениях
MAY
- Допускается для простых проектов (MVP, Landing, прототипов):
- Упрощенная feature-based структура без всех слоев FSD
- Отсутствие слоя
widgets/при небольших композициях UI - Размещение простой логики страниц непосредственно в
pages/ - Отсутствие явного файла
index.tsпри сохранении логического контракта модуля - Менее строгая декомпозиция модулей при малом объёме кода
MUST
- Обязательные ограничения сохраняются даже в MVP:
- Нет циклических зависимостей
- Нет смешивания доменной логики и инфраструктуры
shared/не используется как свалка доменного кода- Импорты между слайсами одного уровня запрещены
Сигналы перехода на полную FSD
MUST: Мигрировать на полную Feature-Sliced Design при появлении:
| Сигнал | Описание | Пример |
|---|---|---|
| Повторно используемые бизнес-сущности | Одни и те же сущности используются в нескольких фичах | User, Article, Order переиспользуются |
| Рост числа фич с общими данными | Увеличилось количество features, работающих с одними entities | 5+ фич работают с Article |
| Появление доменных инвариантов и правил | Появились бизнес-правила сущностей | Валидация email для корпоративных пользователей |
| Рост команды | Началась параллельная разработка | 3+ разработчика работают одновременно |
| Усложнение пользовательских сценариев | Появились сложные многошаговые процессы | Онбординг, чекаут, многошаговые формы |
| MVP превращается в продукт | Проект переходит из прототипа в production | Планируется долгосрочная поддержка |
FORBIDDEN: Временное упрощение не должно закрепляться. Если появились сигналы — мигрируйте на полную FSD.
Контроль и автоматизация
MUST
- Обязательно контролировать следующие правила:
1. Направление зависимостей между слоями
// ❌ FORBIDDEN - нарушение иерар хии
// features/article-list/model/use-articles.ts
import { ArticleListPage } from '@/pages/articles'; // features → pages БЛОКИРУЕТСЯ
// entities/article/lib/format-date.ts
import { useArticleFilter } from '@/features/article-filter'; // entities → features БЛОКИРУЕТСЯ
// shared/lib/helpers.ts
import { Article } from '@/entities/article'; // shared → entities БЛОКИРУЕТСЯ
// ✅ CORRECT - правильное направление
// pages/articles/ui/articles-page.tsx
import { ArticleList } from '@/features/article-list'; // pages → features OK
// features/article-filter/model/use-filter.ts
import { Article } from '@/entities/article'; // features → entities OK
// entities/article/lib/format-date.ts
import { formatDate } from '@/shared/lib/formatters/date'; // entities → shared OK