Используешь ли кодогенерацию в проекте
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Используешь ли кодогенерацию в проекте
Да, активно использую кодогенерацию, но осознанно и избирательно. Кодогенерация — мощный инструмент, но её нужно применять правильно, иначе код станет хрупким и сложным в поддержке.
Где использую кодогенерацию
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>
);
}
Инструменты, которые использую
| Инструмент | Назначение | Когда генерировать |
|---|---|---|
| Prisma | ORM + миграции | После изменения schema.prisma |
| GraphQL Codegen | GraphQL типы | После изменения .graphql файлов |
| Swagger/OpenAPI | API документация | При публикации API |
| ts-protoc-gen | Protocol Buffers типы | После изменения .proto файлов |
| tsyringe | DI контейнер | Частично автоматическое, частично вручную |
Лучшие практики
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 контракты), но бизнес-логика и сложные алгоритмы всегда пишутся вручную с должным вниманием к качеству и тестируемости.
Это экономит время, снижает ошибки рутины и позволяет сосредоточиться на том, что действительно важно.