Ответ
В моей практике разработки на Node.js я избегаю дублирования кода в следующих случаях:
1. Бизнес-логика и валидация
// Плохо: дублирование валидации email
function registerUser(userData) {
if (!userData.email.includes('@')) {
throw new Error('Invalid email');
}
// регистрация
}
function updateUser(userData) {
if (!userData.email.includes('@')) {
throw new Error('Invalid email');
}
// обновление
}
// Хорошо: единая функция валидации
function validateEmail(email) {
const emailRegex = /^[^s@]+@[^s@]+.[^s@]+$/;
return emailRegex.test(email);
}
2. Конфигурация и подключения В Node.js проектах я выношу конфигурацию базы данных, настройки логгера или клиентов внешних API в отдельные модули:
// database.js
const knex = require('knex');
const dbConfig = {
client: 'pg',
connection: process.env.DATABASE_URL
};
module.exports = knex(dbConfig);
// Теперь используется во всех модулях
const db = require('./database');
3. Middleware в Express.js
// Дублирование проверки аутентификации
app.get('/api/profile', (req, res) => {
if (!req.headers.authorization) {
return res.status(401).json({ error: 'Unauthorized' });
}
// логика
});
app.get('/api/settings', (req, res) => {
if (!req.headers.authorization) {
return res.status(401).json({ error: 'Unauthorized' });
}
// логика
});
// Лучше: middleware
const authMiddleware = (req, res, next) => {
if (!req.headers.authorization) {
return res.status(401).json({ error: 'Unauthorized' });
}
next();
};
app.get('/api/profile', authMiddleware, profileHandler);
app.get('/api/settings', authMiddleware, settingsHandler);
Когда дублирование может быть оправдано:
- Простые утилитарные функции в разных контекстах
- Когда абстракция усложнит код больше, чем дублирование
- В прототипах или временных решениях