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

Research direction

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.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
backend
Issue type
Refactor
Difficulty
3/5
Estimated time
1-2 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
48/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.