Mobile App Development · Dart/Flutter

19 · Arquitetura

Organize o código em camadas — entidade, repositório e serviço — para separar responsabilidades, facilitar manutenção e preparar o terreno para um app Flutter de verdade.

1Objetivo da aula

Até aqui, a maioria dos exercícios resolveu tudo dentro de main(). Isso funciona para scripts pequenos, mas quando o programa cresce — como um app Flutter de verdade — misturar dado, acesso a dado e regra de negócio no mesmo lugar dificulta manutenção, testes e reuso. Nesta aula você vai aprender a separar essas responsabilidades em três camadas simples: entidade, repositório e serviço.

2O que vamos aprender

Entidade

Representa o dado puro, sem lógica de acesso ou regra de negócio. Muda só quando o formato do dado muda.

Repositório

Responsável por fornecer os dados (lista em memória, banco de dados, API...). Quem usa o repositório não precisa saber de onde o dado vem.

Serviço

Contém a regra de negócio, usando o repositório para buscar dados. Muda só quando a regra de negócio muda.

Injeção de dependência

O serviço recebe o repositório pelo construtor em vez de criar um internamente — facilita trocar ou testar com um repositório de mentira (fake).

fold()

Método de coleção que acumula um valor percorrendo cada elemento — usado aqui para somar preços.

Regra de dependência

main() -> Service -> Repository -> Entidade. A dependência sempre aponta para dentro, nunca o contrário.

3Exemplo comentado

// Entidade: representa o dado puro, sem lógica de acesso ou regra de negócio.
class Produto {
  final String nome;
  final double preco;

  Produto(this.nome, this.preco);
}

// Repositório: responsável por fornecer os dados (de uma lista em memória,
// um banco de dados, uma API, etc). Quem usa o repositório não precisa
// saber de onde o dado vem.
class ProdutoRepository {
  final List<Produto> _dados = [
    Produto('Caderno', 12.5),
    Produto('Caneta', 3.0),
  ];

  List<Produto> listar() => _dados;
}

// Serviço: contém a regra de negócio, usando o repositório para buscar dados.
class ProdutoService {
  final ProdutoRepository repository;

  ProdutoService(this.repository);

  double valorTotalEmEstoque() {
    return repository.listar().fold(0, (soma, produto) => soma + produto.preco);
  }
}

void main() {
  // Injeção de dependência: o Service recebe o Repository pronto pelo construtor.
  final repository = ProdutoRepository();
  final service = ProdutoService(repository);

  print('Valor total em estoque: ${service.valorTotalEmEstoque()}');
}

4Saída esperada

Valor total em estoque: 15.5

5Do conteúdo para a prática

6Prática sugerida