🧠 Что это
Навык Coding Standards & Best Practices (JP) — это сборник универсальных правил и шаблонов для TypeScript, JavaScript, React и Node.js. Он не привязан к конкретному проекту и даёт единый стандарт кода: от именования переменных до архитектуры API и тестов. Разработчик может обращаться к нему как к чек-листу или при ревью пул-реквестов.
⚙️ Как работает
Навык разделён на логические блоки, каждый из которых содержит краткое правило, пример «хорошо» ✅ и «плохо» ❌. Это не догма, а проверенные практики, которые делают код читаемым, предсказуемым и безопасным.
📏 Принципы качества кода
- Читаемость важнее всего — код пишут один раз, читают десятки раз. Имена переменных и функций должны быть самодокументируемыми.
- KISS (Keep It Simple, Stupid) — выбирайте самое простое работающее решение. Избегайте преждевременных оптимизаций и «сложно, зато красиво».
- DRY (Don't Repeat Yourself) — выносите повторяющуюся логику в функции, хуки и утилиты. Копипаста — зло.
- YAGNI (You Aren't Gonna Need It) — не пишите код под гипотетические будущие требования. Добавляйте сложность только когда она реально понадобится.
🏷️ TypeScript / JavaScript — именование
- Переменные — существительные:
marketSearchQuery, isUserAuthenticated, totalRevenue. Не q, flag, x.
- Функции — глагол+существительное:
fetchMarketData(id), calculateSimilarity(a, b), isValidEmail(email). Не market(id), similarity(a, b).
- Булевы переменные — с префиксом
is, has, can: isValid, hasPermission.
🔒 Иммутабельность (критично!)
Всегда используйте spread-оператор (...) для обновления объектов и массивов. Никогда не мутируйте напрямую:
// ✅ Правильно
const updatedUser = { ...user, name: 'New Name' }
const updatedArray = [...items, newItem]
// ❌ Неправильно
user.name = 'New Name'
items.push(newItem)
⚠️ Обработка ошибок
Любая асинхронная операция должна быть обёрнута в try/catch. Ошибки нужно логировать (console.error) и пробрасывать с осмысленным сообщением. Не оставляйте fetch без проверки response.ok.
⚡ Async/Await — параллельное выполнение
Не делайте последовательные запросы, если они независимы. Используйте Promise.all:
// ✅ Правильно: запросы выполняются одновременно
const [users, markets, stats] = await Promise.all([
fetchUsers(),
fetchMarkets(),
fetchStats()
])
🛡️ Типобезопасность
Избегайте any. Используйте строгие типы и интерфейсы. Для валидации данных на границе системы (например, тела запроса) — Zod:
const CreateMarketSchema = z.object({
name: z.string().min(1).max(200),
description: z.string().min(1).max(2000),
// ...
})
🧩 React — компоненты и хуки
- Компоненты — функциональные с явным интерфейсом пропсов (
interface ButtonProps { ... }).
- Хуки — с префиксом
use, типизированы (useDebounceT``).
- Состояние — используйте функциональное обновление, чтобы не получить stale closure:
setCount(prev => prev + 1).
- Условный рендеринг — через
&&, избегайте глубоких тернарников.
🗄️ API и модели данных
- REST-эндпоинты именуются по стандарту:
GET /api/markets, POST /api/markets/:id.
- Ответы — единая структура:
{ success, data, error, meta }.
- Валидация входящих данных — через Zod перед бизнес-логикой.
📁 Файловая структура
Типовой проект на Next.js:
src/
├── app/ # App Router
├── components/ # UI, forms, layouts
├── hooks/ # Кастомные хуки
├── lib/ # API-клиенты, утилиты
├── types/ # TypeScript-типы
└── styles/ # Глобальные стили
Компоненты — в PascalCase (Button.tsx), хуки — camelCase с use (useAuth.ts), утилиты — camelCase (formatDate.ts), типы — с суффиксом .types.ts.
📝 Комментарии и JSDoc
Комментируйте почему (WHY), а не что (WHAT). Код должен говорить сам за себя.
JSDoc обязателен для публичных API-функций: описание, параметры, возврат, исключения, пример использования.
🚀 Производительность
- useMemo — для тяжёлых вычислений.
- useCallback — для колбэков, передаваемых в дочерние компоненты.
- lazy + Suspense — для ленивой загрузки тяжёлых компонентов (графики, редакторы).
- В запросах к базе данных выбирайте только нужные колонки, не
select *.
🧪 Тестирование
- AAA-паттерн: Arrange → Act → Assert.
- Имена тестов — описательные: что проверяем, при каких условиях.
- Избегайте тестов с именами
'works', 'test search'.
🐞 Код-смеллы (антипаттерны)
На что обращать внимание при ревью:
- Длинные функции — больше 50 строк → разбивайте на несколько.
- Глубокая вложенность — больше 4 уровней → используйте ранние возвраты (early return) и guard clauses.
- Магические числа — выносите в именованные константы:
const MAX_RETRIES = 3.
✅ Когда использовать
- На старте нового проекта, чтобы сразу договориться о стиле.
- Для код-ревью: сверяйтесь с навыком, когда видите
any, мутации или глубокую вложенность.
- Как чек-лист для автоподчинки кода: замените
let на const, добавьте типы, уберите магические числа.
- В онбординге новых разработчиков — дать прочитать как гайд за 30 минут.
📌 Важно знать
- Навык — не специфичен для одного фреймворка: React-правила можно адаптировать под Vue или Svelte, но примеры даны на React.
- Основа — TypeScript с strict mode. Если проект на чистом JS, правила именования и DRY всё равно актуальны.
- Правила про иммутабельность и
Promise.all — это не рекомендации, а стандарт: они предотвращают целый класс багов.
- Для работы навык не требует установки: его можно использовать как Markdown-файл в репозитории или как страницу в Wiki.
Комментарии
Комментариев пока нет. Будьте первым.