Перейти к основному содержимому

Стиль кода

Структура кода

Код стараемся писать депларативно там где это возможно. Приветствуется реактивность.

Пишем максимально понятный и читаемый код, используем полные названия переменных и функций:

let v; // плохо
let value; // хорошо
function getSigForRefDistr(); // плохо
function getSignatureForReferralDistribution(); // хорошо

Пишем код максимально просто, без сложных конструкций, чтобы смог прочитать и понять даже джун.

Стараемся не писать функции и методы больше 50 строк.

Документирование кода (JSDoc)

Backend (NestJS)

ОБЯЗАТЕЛЬНО добавлять JSDoc ко всем функциям и методам в следующих местах:

  • ✅ Сервисы (*.service.ts)
  • ✅ Утилиты (utils/*, helpers/*)
  • ✅ Провайдеры (*.provider.ts)
  • ✅ Middleware, Guards, Interceptors, Pipes
  • ✅ Shared packages (packages/*)
  • ❌ Контроллеры (*.controller.ts) — JSDoc не требуется (используется Swagger декораторы)

Формат JSDoc для методов:

/**
* Описание: что делает функция/метод
* @param {Type} paramName - описание параметра
* @param {Type} anotherParam - описание параметра
* @returns {ReturnType} описание возвращаемого значения
* @throws {ErrorType} когда выбрасывается ошибка
*/
async myMethod(paramName: Type, anotherParam: Type): Promise<ReturnType> {
// implementation
}

Пример:

/**
* Вычисляет вознаграждение пользователя за стейкинг NFT
* @param {string} userId - ID пользователя
* @param {number} stakedAmount - Количество застейканных токенов
* @returns {Promise<number>} Сумма вознаграждения в токенах
* @throws {NotFoundException} Если пользователь не найден
*/
async calculateStakingReward(userId: string, stakedAmount: number): Promise<number> {
const user = await this.userService.findById(userId);
if (!user) {
throw new NotFoundException('User not found');
}
return stakedAmount * this.rewardMultiplier;
}

Shared Packages (packages/*)

ОБЯЗАТЕЛЬНО документировать все экспортируемые функции, классы, интерфейсы:

/**
* Интерфейс конфигурации платежной системы
*/
export interface PaymentConfig {
/** Адрес смарт-контракта */
contractAddress: string;
/** Таймаут транзакции в секундах */
transactionTimeout: number;
}

/**
* Форматирует адрес кошелька для отображения пользователю
* @param {string} address - Полный адрес кошелька (0x...)
* @param {number} startChars - Количество символов в начале (по умолчанию 6)
* @param {number} endChars - Количество символов в конце (по умолчанию 4)
* @returns {string} Отформатированный адрес (например: 0x1234...5678)
*/
export function formatWalletAddress(
address: string,
startChars: number = 6,
endChars: number = 4,
): string {
return `${address.slice(0, startChars)}...${address.slice(-endChars)}`;
}

Frontend (Next.js/React)

Рекомендуется добавлять JSDoc к:

  • Сложным утилитам и хелперам
  • Shared функциям и хукам
  • API клиентам

Для простых компонентов JSDoc опционален.

Нейминг

Git

Для именования комитов и веток используем теги:

feature - для нового функционала

fix - для исправленных ошибок

draft - для незаконченных задач

refactoring - для задач по рефакторингу старого кода

Ветки именуем через / , коммиты через :

Пример:

  • коммит - feature: event-handling
  • ветка - feature/event-handling

БД и сервисы

СущностьНейминг
MySQL DB (в самой БД)snake_case
MySQL TypeORM (в коде в ORM)camelCase
Neo4jcamelCase
MongoDBcamelCase
BackendcamelCase
Backend (файлы)kebab-case
FrontendcamelCase