O projeto ToDoListApp é estruturado seguindo uma abordagem modular, com foco na clareza, separação de responsabilidades e facilidade de manutenção. Cada módulo dentro do projeto é projetado para ser autossuficiente, contendo todas as dependências necessárias para sua execução, incluindo a lógica de negócios, acesso a dados, apresentação e injeção de dependência. Esta abordagem facilita a escalabilidade do projeto e a reutilização de módulos em diferentes partes do aplicativo ou em outros projetos.
A estrutura de pastas do módulo ToDo é dividida em três camadas principais, seguindo os princípios da Arquitetura Limpa (Clean Architecture): Data
, Domain
e Presentation
. Além disso, a injeção de dependência é realizada dentro do próprio módulo, ao invés de ser centralizada em uma camada compartilhada (Shared
). A seguir, detalhei cada parte da estrutura:
Responsável pelo acesso e manipulação dos dados. Inclui:
- Datasource: Define as fontes de dados (por exemplo, APIs, bancos de dados locais) e suas respectivas interfaces (
Protocols
). - Mappers: Contém lógica para mapear dados entre as camadas
Data
eDomain
. - Models: Define os modelos de dados utilizados na camada
Data
. - Repositories: Implementa os repositórios que consomem os
Datasources
e fornecem dados para a camadaDomain
.
Contém a lógica de negócios do módulo. Inclui:
- Entities: Define as entidades do domínio, que são independentes das fontes de dados específicas.
- Repositories: Interfaces dos repositórios, definindo o contrato para o acesso a dados.
- UseCases: Lógica de negócios específica, que opera sobre os dados fornecidos pelos repositórios.
Responsável pela apresentação dos dados ao usuário. Inclui:
- DI (Injeção de Dependência): Configuração das dependências necessárias para o módulo, garantindo a separação entre a criação de objetos e sua utilização.
- Views e ViewModels: Definem a interface do usuário e a lógica de apresentação.
Optamos por realizar a injeção de dependência dentro do próprio módulo ToDo por vários motivos:
- Autonomia: Cada módulo gerencia suas próprias dependências, tornando-o autônomo e facilmente reutilizável em diferentes contextos.
- Encapsulamento: Mantém as dependências do módulo internas, evitando acoplamentos desnecessários com o restante do aplicativo.
- Flexibilidade: Facilita a substituição ou modificação de dependências dentro do módulo sem afetar outros componentes do sistema.