Field Notes

Organizacao de backend em camadas com regra de dependencia

Joao Leonardi1 min

Este registro descreve a organizacao de um backend seguindo a regra de dependencia (Martin, 2017): dependencias de codigo apontam apenas para dentro.

Estrutura de camadas

domain/          entidades e regras de negocio
application/     casos de uso
infrastructure/  bancos, servicos externos
presentation/    controladores de API

Regra de dependencia

Camadas internas nao conhecem camadas externas. O dominio nao importa frameworks; a infraestrutura implementa interfaces definidas pelo dominio.

# domain/repositories/user_repository.py
class UserRepositoryInterface(Protocol):
    def save(self, user: User) -> User: ...
 
# infrastructure/repositories/postgres_user_repository.py
class PostgresUserRepository(UserRepositoryInterface):
    def save(self, user: User) -> User:
        # implementacao concreta
        ...

O caso de uso depende da interface, nao da implementacao:

class CreateUserUseCase:
    def __init__(self, repository: UserRepositoryInterface):
        self._repository = repository

Consequencia observada

A inversao de dependencia permite substituir a implementacao de persistencia sem alterar o caso de uso. Em testes, a interface e substituida por um duplo de teste, o que reduz o acoplamento a um banco real.

Referencias

  • Martin, R. C. (2017). Clean Architecture. Prentice Hall.