devseniorlabpython / devseniorlabpython/hardware-shop
Intermedio | Implementar una Capa de Servicio para la Lógica de Negocio
- 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