Separación de responsabilidades con express.Router

Clase 9 de 27Curso de Backend con Node.js: API REST con Express.js

Resumen

¿Qué es el principio de única responsabilidad?

En el mundo del desarrollo de software, el principio de única responsabilidad, conocido como Single Responsibility Principle (SRP), juega un rol crucial. Este principio establece que cada artefacto o pieza de código debe tener una única responsabilidad. Esto se aplica no solo a métodos, sino también a clases y archivos. Por ejemplo, un método denominado sumar debería estar dedicado exclusivamente a realizar sumas, sin encargarse de ecuaciones complejas u otras operaciones matemáticas.

¿Cómo aplicar este principio en archivos y carpetas?

La práctica de aplicar el principio de única responsabilidad se extiende a la organización de archivos y carpetas dentro de una aplicación. Un enfoque útil es dividir el código basado en la funcionalidad específica de cada parte. Por ejemplo, en una aplicación, cada endpoint podría corresponder a un archivo específico que defina todas las rutas necesarias para ese dominio, como productos o categorías.

¿Cuál es la importancia del nombre de los archivos?

El proceso de nombrar archivos debe seguir un estándar dentro del equipo de desarrollo. Aunque las normas pueden variar dependiendo del equipo, lo importante es la consistencia. Por ejemplo, si estamos trabajando en la carpeta Routes, un archivo nombrado Products.js indica claramente que trata sobre las rutas asociadas a los productos. Alternativamente, se puede usar una nomenclatura más descriptiva como Products.router.js, siempre y cuando el equipo acuerde un estándar uniforme.

¿Cómo implementar el principio en Node.js?

A continuación se presenta un ejemplo de implementación del principio de única responsabilidad al trabajar con rutas en Node.js y Express:

Configuración de rutas específicas

En este fragmento de código, se crea y configura un archivo de rutas para los productos. Esta acción separa la lógica de rutas en módulos individuales:

// Importar Express y Faker
const express = require('express');
const faker = require('faker');

// Crear un router específico para productos
const router = express.Router();

// Definir rutas específicas sin el endpoint completo
router.get('/', (req, res) => {
  res.json({
    products: 'List of products'
  });
});

// Exportar el router como un módulo
module.exports = router;

Centralización y configuración de rutas

En el archivo index.js, se integran todos estos routers modulares para establecer una arquitectura clara:

// Importar el router de productos
const productsRouter = require('./products.router');

// Función para configurar routers en la aplicación
function routesApi(app) {
  // Configurar el endpoint para productos
  app.use('/api/products', productsRouter);
}

// Exportar la función de configuración
module.exports = routesApi;

Por último, en el archivo principal de la aplicación, se invoca esta función para inicializar la configuración de rutas:

const express = require('express');
const routesApi = require('./routes');

const app = express();
const port = 3000;

// Llamar a la función para configurar las rutas
routesApi(app);

app.listen(port, () => {
  console.log('Server running on port', port);
});

¿Qué beneficios aporta el principio de única responsabilidad?

  • Legibilidad: Facilita la comprensión del código ya que cada archivo o método tiene un propósito claro y definido.
  • Mantenibilidad: Al separar la lógica, es más fácil realizar cambios o actualizaciones sin afectar otras partes del sistema.
  • Reutilización: Los módulos bien definidos son más fáciles de reutilizar en otros proyectos o contextos.

Al aplicar este principio, se optimiza la estructura del código, lo cual es esencial para el desarrollo de aplicaciones escalables y fáciles de mantener. Te animamos a continuar practicando estos conceptos para perfeccionar tus habilidades como desarrollador.