Skip to content

Принципы

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.