Стиль кода
Структура кода
Код стараемся писать депларативно там где это возможно. Приветствуется реактивность.
Пишем максимально понятный и читаемый код, используем полные названия переменных и функций:
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 |
| Neo4j | camelCase |
| MongoDB | camelCase |
| Backend | camelCase |
| Backend (файлы) | kebab-case |
| Frontend | camelCase |