Когда не стоит использовать дублирующий код?

«Когда не стоит использовать дублирующий код?» — вопрос из категории Архитектура, который задают на 26% собеседований Node.js Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В моей практике разработки на 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);

Когда дублирование может быть оправдано:

  • Простые утилитарные функции в разных контекстах
  • Когда абстракция усложнит код больше, чем дублирование
  • В прототипах или временных решениях