devseniorlabpython / devseniorlabpython/hardware-shop

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

Open
#2 0 comments 0 reactions 0 assignees View on GitHub
enhancement
Dominant language
Python
Stars
0
Forks
4
PR merge metrics
No merged PRs in 30d

Description

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.

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.