Appearance
Принципы
1. У данных есть владелец
Посты принадлежат data/posts, комментарии — data/comments. Не создавайте общий data/common для несвязанных бизнес-данных.
2. Внешнее значение сначала unknown
Нельзя считать внешний объект корректным только потому, что ему назначили тип. Valibot должен проверить значение во время выполнения.
3. Зависимости направлены вниз
txt
app → pages → components → data → sharedВерхний слой может собирать нижние. Нижний не должен знать верхний.
4. Структура растёт по факту
Начинайте slice плоско. Добавляйте model/, types/, schema/ и другие технические папки только когда файлов действительно стало много. Если технические папки уже появились, *.types.ts храните в types/, а не в model/.
5. Domain slices независимы
data/posts не импортирует data/authors только ради одного экрана. Для совместного представления создаётся отдельный владелец композиции.
6. MobX store хранит состояние, а React рисует UI
Store не возвращает JSX и не знает о React Router. React-компонент не становится местом для DTO-mapping.
7. Public API явный
Внешний код импортирует @/data/posts, а не внутренние файлы slice.
8. DTO остаётся на границе data
Компоненты и pages работают с типами приложения.
9. Lifecycle определяет экземпляр store
Глобальный для приложения store может иметь один экземпляр. Состояние конкретной страницы или формы создаётся рядом с её владельцем и очищается вместе с ним.
10. React Hook Form владеет формой
Значения полей, touched/dirty и ошибки формы не дублируются в MobX без отдельной причины.
11. Valibot schema формы и schema внешнего ответа — разные контракты
Даже если поля сейчас похожи, у них разные владельцы и причины изменяться.
12. React Router владеет route-контрактом
Параметры URL читаются на уровне page или route-композиции и передаются дальше как обычные значения.
13. Smart и dumb UI выполняют разные роли
Smart-компонент может читать MobX store. Dumb-компонент получает props и проще переиспользуется.
Короткая проверка
Перед merge спросите:
- понятно ли, кто владеет новым кодом;
- проверяются ли внешние значения Valibot;
- не вышел ли DTO в UI;
- не импортирует ли нижний слой верхний;
- не дублирует ли MobX состояние React Hook Form;
- проходит ли внешний импорт через public API.