devseniorlabpython / devseniorlabpython/hardware-shop

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

Offen
#2 0 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen
enhancement
Vorherrschende Sprache
Python
Sterne
0
Forks
4
PR-Merge-Kennzahlen
Keine gemergten PRs in 30 T.

Beschreibung

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.

Beitragsleitfaden

Für dieses Repository ist kein Beitragsleitfaden indexiert

Rechercherichtung

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.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
python
Bereich
backend
Issue-Typ
Refactoring
Schwierigkeit
3/5
Geschätzter Aufwand
1-2 Tage
Aktivitätsstatus
Veraltet
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
48/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.