← Назад к вопросам

Используешь ли кодогенерацию в проекте

1.8 Middle🔥 71 комментариев
#Node.js и JavaScript#Фреймворки и библиотеки

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Используешь ли кодогенерацию в проекте

Да, активно использую кодогенерацию, но осознанно и избирательно. Кодогенерация — мощный инструмент, но её нужно применять правильно, иначе код станет хрупким и сложным в поддержке.

Где использую кодогенерацию

1. Генерация типов из базы данных

Использую инструменты для автогенерации TypeScript типов из БД схемы:

// Вместо ручного писания типов
interface User {
  id: string;
  email: string;
  created_at: Date;
  is_active: boolean;
}

// Генерирую через Prisma
type User = Prisma.UserGetPayload<{}>;
// или через ts-node-codegen
pnpm exec prisma generate

Преимущества:

  • Типы всегда синхронизированы с БД
  • Меньше ошибок при рефакторинге схемы
  • Экономит часы рутинной работы

2. ORM и код доступа к данным

Prisma, TypeORM, Sequelize — это тоже кодогенерация:

// Генерируется Prisma
const user = await prisma.user.findUnique({
  where: { id: userId }
});
// Вместо ручного SQL и маппинга

3. API маршруты и swagger документация

Использую tools для генерации OpenAPI / Swagger из кода:

// @swagger
// /users/{id}:
//   get:
//     description: Get user by ID
//     parameters:
//       - in: path
//         name: id
import { swagger } from @decorators/swagger;

@Get(/users/:id)
@swagger({ tags: [users] })
async getUser(@Param(id) id: string) {
  return await userService.findById(id);
}
// Swagger генерируется автоматически

4. GraphQL schema и resolvers

Когда используешь GraphQL, часто генерируешь TypeScript типы из schema:

npm install @graphql-codegen/cli @graphql-codegen/typescript
# codegen.yml
generate:
  types.ts:
    schema: src/schema.graphql
    plugins:
      - typescript
      - typescript-resolvers

5. Миграции баз данных

Inferring миграции вместо ручного SQL:

# Prisma автоматически создает миграцию
prisma migrate dev --name add_user_email_index
# Генерирует SQL и применяет её

Где НЕ использую кодогенерацию

1. Бизнес-логика

Это всегда пишу вручную. Генерировать бизнес-логику опасно:

// ❌ Плохо: генерировать сложную логику
const calculateDiscount = (/*...*/); // сгенерировано

// ✅ Хорошо: ручная реализация
function calculateDiscount(order: Order, user: User): number {
  if (user.isVIP) return 0.2;
  if (order.total > 1000) return 0.1;
  return 0;
}

2. Сложные SQL запросы

Для оптимизированных запросов пишу вручную:

// ❌ Сгенерированный ORM может быть неоптимален
const orders = await Order.find({ userId }).populate(items);
// SELECT * FROM orders; SELECT * FROM items WHERE order_id IN (...);
// N+1 problem!

// ✅ Ручной оптимизированный SQL
const orders = await db.query(`
  SELECT o.*, json_agg(i.*) as items
  FROM orders o
  LEFT JOIN items i ON i.order_id = o.id
  WHERE o.user_id = $1
  GROUP BY o.id
`, [userId]);

3. UI и компоненты

Генерировать компоненты нежелательно:

// ❌ Сгенерированный компонент жестко привязан к структуре
// ✅ Пишу вручную с нужной гибкостью
export function UserCard({ user, onDelete, onEdit }) {
  return (
    <div>
      <h3>{user.name}</h3>
      <button onClick={() => onEdit(user.id)}>Редактировать</button>
    </div>
  );
}

Инструменты, которые использую

ИнструментНазначениеКогда генерировать
PrismaORM + миграцииПосле изменения schema.prisma
GraphQL CodegenGraphQL типыПосле изменения .graphql файлов
Swagger/OpenAPIAPI документацияПри публикации API
ts-protoc-genProtocol Buffers типыПосле изменения .proto файлов
tsyringeDI контейнерЧастично автоматическое, частично вручную

Лучшие практики

1. Контролируй кодогенерацию

Генерируй в отдельные файлы, не трогай их руками:

// ✅ Хорошо: сгенерированный код в отдельном файле
import type { GeneratedTypes } from ./generated/types;

// Не редактируй generated/types.ts вручную!

2. Версионируй generated код

Добавь в git, чтобы видеть изменения:

git add src/generated/
# Не добавляй в .gitignore!

3. Документируй, как регенерировать

# README.md
## Генерация кода
prisma generate          # типы из БД
graphql-codegen          # GraphQL типы
make generate-all        # все разом

Мой подход

Генерируй инфраструктуру, пиши логику. Использую кодогенерацию для повторяющихся, скучных задач (типы, миграции, API контракты), но бизнес-логика и сложные алгоритмы всегда пишутся вручную с должным вниманием к качеству и тестируемости.

Это экономит время, снижает ошибки рутины и позволяет сосредоточиться на том, что действительно важно.