Arquitetura Hexagonal

A arquitetura hexagonal ajuda a criar código mais testável e manutenível, isolando a lógica de negócio das dependências externas.

Estrutura

project/
├── domain/
│   ├── models/
│   │   └── user.py
│   └── services/
│       └── user_service.py
├── adapters/
│   ├── in/
│   │   └── web/
│   │       └── user_controller.py
│   └── out/
│       └── persistence/
│           └── user_repository.py
└── main.py

Domain Model

# domain/models/user.py
from dataclasses import dataclass

@dataclass
class User:
    id: int
    name: str
    email: str
    
    def is_valid(self) -> bool:
        return '@' in self.email and len(self.name) > 0

Repository Interface

# domain/repositories/user_repository.py
from abc import ABC, abstractmethod

class UserRepository(ABC):
    @abstractmethod
    def save(self, user: User) -> User:
        pass
    
    @abstractmethod
    def find_by_id(self, user_id: int) -> User:
        pass