Arquitectura Hexagonal en REACTJS

Fernando Bernal
4 min readJul 11, 2023

--

Photo by Donny Jiang on Unsplash

La arquitectura hexagonal, también conocida como la arquitectura de puertos y adaptadores, es un patrón de diseño de software que promueve una separación clara y modular entre el núcleo de la lógica de negocio y las capas externas, como la interfaz de usuario y las capas de persistencia de datos. El objetivo principal de esta arquitectura es permitir un desarrollo más flexible, escalable y mantenible al desacoplar los componentes y reducir las dependencias.

La arquitectura hexagonal se basa en tres conceptos clave:

  1. Núcleo (Core): Es el centro de la arquitectura, donde se encuentra la lógica de negocio y las reglas fundamentales. El núcleo no depende de ninguna capa externa y es independiente de la tecnología utilizada.
  2. Puertos (Ports): Representan las interfaces para interactuar con componentes externos, como la interfaz de usuario, servicios externos o la capa de persistencia de datos. Los puertos son definidos por el núcleo y se implementan en las capas externas.
  3. Adaptadores (Adapters): Son las implementaciones concretas de los puertos. Los adaptadores se encargan de la comunicación entre el núcleo y las capas externas. Pueden adaptar los datos recibidos desde el exterior al formato requerido por el núcleo, y viceversa.

Un ejemplo de cómo se podría utilizar la arquitectura hexagonal en el desarrollo de una aplicación frontend con ReactJS sería el siguiente:

  1. Núcleo: En el núcleo de la aplicación, se encontrarían los componentes y la lógica de negocio específica de la aplicación. Aquí se definirían los puertos (interfaces) necesarios para interactuar con la interfaz de usuario y otros servicios externos.
  2. Adaptadores de la interfaz de usuario: Estos adaptadores se encargarían de implementar los puertos definidos en el núcleo y proporcionar la comunicación entre los componentes de ReactJS y el núcleo de la aplicación. Por ejemplo, se podrían tener adaptadores para gestionar la renderización de componentes, la gestión de eventos de usuario y la comunicación con servicios externos a través de API.
  3. Adaptadores de persistencia de datos: Estos adaptadores se utilizarían para interactuar con una capa de persistencia de datos, como una API REST o una base de datos. Se encargarían de traducir las solicitudes y respuestas del núcleo a un formato compatible con la capa de persistencia de datos y viceversa.

La ventaja de utilizar la arquitectura hexagonal en un entorno de frontend con ReactJS es que permite mantener una separación clara entre la lógica de negocio y la interfaz de usuario, lo que facilita la modificación y prueba independiente de ambas partes. Además, al desacoplar el núcleo de las tecnologías externas, se logra una mayor flexibilidad y adaptabilidad a medida que la aplicación evoluciona.

En resumen, la arquitectura hexagonal en el contexto de ReactJS permite crear aplicaciones frontend más modularizadas, escalables y mantenibles, al separar la lógica de negocio del resto de la aplicación y establecer interfaces claras y flexibles para la comunicación entre componentes.

A continuación ponemos un ejemplo de cómo se podría implementar la arquitectura hexagonal en una aplicación frontend utilizando ReactJS.

Núcleo

class UserService {
constructor(userRepository) {
this.userRepository = userRepository;
}

createUser(name, email) {
// Lógica de negocio para crear un usuario
const user = {
name,
email,
};
return this.userRepository.save(user);
}
}

Adaptadores de interfaz de usuario

// uiAdapters.js

import React, { useState } from 'react';

export const CreateUserForm = ({ userService }) => {
const [name, setName] = useState('');
const [email, setEmail] = useState('');

const handleNameChange = (event) => {
setName(event.target.value);
};

const handleEmailChange = (event) => {
setEmail(event.target.value);
};

const handleSubmit = (event) => {
event.preventDefault();
userService.createUser(name, email)
.then((user) => {
// Lógica para manejar la respuesta del núcleo
console.log('Usuario creado:', user);
})
.catch((error) => {
// Lógica para manejar errores
console.error('Error al crear usuario:', error);
});
};

return (
<form onSubmit={handleSubmit}>
<input type="text" placeholder="Nombre" value={name} onChange={handleNameChange} />
<input type="email" placeholder="Email" value={email} onChange={handleEmailChange} />
<button type="submit">Crear Usuario</button>
</form>
);
};

Adaptadores de persistencia de datos

// dataAdapters.js

class UserRepository {
save(user) {
// Lógica para guardar el usuario en la capa de persistencia de datos
return fetch('/api/users', {
method: 'POST',
body: JSON.stringify(user),
headers: {
'Content-Type': 'application/json',
},
})
.then((response) => response.json());
}
}

En este ejemplo, el núcleo contiene la clase UserService, que se encarga de la lógica de negocio para crear un usuario. Los adaptadores de la interfaz de usuario contienen el componente CreateUserForm, que recibe el servicio de usuario y se encarga de la interacción con el usuario y la invocación del método createUser del servicio. Los adaptadores de persistencia de datos contienen la clase UserRepository, que se encarga de enviar la solicitud de creación de usuario a través de una API y devolver la respuesta.

Este es solo un ejemplo básico para ilustrar cómo se podría implementar la arquitectura hexagonal en una aplicación frontend utilizando ReactJS. Dependiendo de la complejidad y los requisitos de tu aplicación, puedes adaptar y ampliar esta estructura para satisfacer tus necesidades específicas.

--

--