devseniorlabpython / devseniorlabpython/hardware-shop

Intermedio | Implementar una Capa de Servicio para la Lógica de Negocio

Abierto
#2 0 comentarios 0 reacciones 0 asignados Ver en GitHub
enhancement
Lenguaje dominante
Python
Estrellas
0
Forks
4
Métricas de merge de PR
Sin PR fusionados en 30 d

Descripción

Nuestro `main.py` actualmente tiene demasiadas responsabilidades: gestiona la interfaz de usuario, valida datos y se comunica directamente con el repositorio. Para mejorar la arquitectura y seguir el principio de Responsabilidad Única, vamos a introducir una capa de servicio.

**Tu Misión:**

Refactorizar el código para crear una capa de servicio (`ProductoService`) que se sitúe entre la interfaz de usuario (`main.py`) y la capa de acceso a datos (`ProductoRepository`).

**Tareas Específicas:**

1. **Crear la Clase `ProductoService`:**
* Crea un nuevo archivo, por ejemplo, `servicios.py`.
* Dentro, define la clase `ProductoService`.
* El constructor de `ProductoService` debe recibir una instancia de `ProductoRepository`. Esto se llama **Inyección de Dependencias** y es una práctica fundamental.
```python
from repositorio import ProductoRepository

class ProductoService:
def __init__(self, repo: ProductoRepository):
self.repo = repo
```

2. **Mover la Lógica de Negocio al Servicio:**
* Crea métodos en `ProductoService` que contengan la lógica de las operaciones. Por ejemplo:
* `crear_producto(self, nombre: str, precio: float, stock: int) -> dict`: Este método validará los datos y, si son correctos, llamará a `self.repo.create(...)`. Podría incluir lógica adicional, como verificar si ya existe un producto con el mismo nombre.
* `obtener_productos(self) -> list`: Simplemente llamará a `self.repo.get_all()`.
* `eliminar_producto(self, id_producto: int) -> bool`: Podría añadir una lógica de confirmación o verificación de stock antes de llamar a `self.repo.delete(...)`.

3. **Simplificar `main.py`:**
* Al inicio de `main()`, crea las instancias necesarias:
```python
from producto_crud import InMemoryProductoRepository
from servicios import ProductoService

repo = InMemoryProductoRepository()
servicio = ProductoService(repo)
```
* Modifica el bucle principal para que las opciones del menú llamen a los métodos del `servicio` en lugar del `repo`. `main.py` ya no debería saber que existe un repositorio.
```python
# Antes: repo.create(...)
# Ahora: servicio.crear_producto(...)
```

**Objetivos de Aprendizaje:**

* Principio de Responsabilidad Única (SRP).
* Arquitectura por capas (Presentación -> Lógica de Negocio -> Acceso a Datos).
* Inyección de Dependencias para desacoplar componentes.
* Escribir un código más limpio, mantenible y fácil de probar.

Guía de contribución

No hay ninguna guía de contribución indexada para este repositorio

Línea de trabajo

Start by reading main.py and producto_crud.py, especially InMemoryProductoRepository and the existing ProductoRepository operations. Then trace how the menu currently validates data and calls the repository. Done means servicios.py contains ProductoService, main.py uses the service rather than the repository directly, and the existing product operations still work through the menu.

Escrito por el modelo de indexación a partir del texto del issue.

Evaluación

Stack tecnológico
python
Área
backend
Tipo de issue
Refactorización
Dificultad
3/5
Tiempo estimado
1-2 días
Estado de actividad
Estancado
Claridad
Bastante claro
Aptitud para principiantes
48/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.