Sobes.tech
Junior

Em que consiste a essência da abstração?

sobes.tech IA

Resposta da IA

A abstração no Flutter, assim como na programação em geral, resume-se a ocultar implementações complexas e fornecer uma interface simplificada para interação. Isso é alcançado criando vistas de alto nível que escondem detalhes subjacentes e permitem trabalhar com conceitos, em vez de implementações específicas.

Ideias principais:

  • Ocultar detalhes: A lógica complexa ou a estrutura de dados é escondida por trás de uma interface simples.
  • Facilitar o uso: O desenvolvedor interage com uma representação abstrata sem se aprofundar nos detalhes de implementação.
  • Aumentar a flexibilidade: Alterações na implementação interna não afetam o código que usa a abstração, desde que a interface permaneça a mesma.
  • Reutilização: Componentes abstratos podem ser utilizados em diferentes partes da aplicação.

Exemplos em Flutter:

  • Widgets: Os widgets são abstrações sobre elementos da interface do usuário. Usamos Container, Row, Column e outros, sem conhecer sua implementação interna em detalhes.
  • Programação assíncrona: Future e Stream abstraem o trabalho com operações assíncronas, escondendo detalhes do gerenciamento de fluxos e eventos.
  • Padrões arquiteturais: O uso de padrões como BLoC, Provider ou Riverpod é uma forma de abstração que separa a UI da lógica de negócio.

Exemplo de código usando abstração:

// Classe abstrata para a fonte de dados
abstract class DataSource {
  Future<String> fetchData();
}

// Implementação que usa HTTP
class HttpDataSource implements DataSource {
  @override
  Future<String> fetchData() async {
    // Aqui vai a lógica complexa de trabalho com requisições HTTP
    return "Dados do HTTP";
  }
}

// Implementação que usa armazenamento local
class LocalDataSource implements DataSource {
  @override
  Future<String> fetchData() async {
    // Aqui vai a lógica complexa de trabalho com armazenamento local
    return "Dados do armazenamento local";
  }
}

// Classe que usa a abstração DataSource
class Repository {
  final DataSource dataSource;

  Repository(this.dataSource);

  Future<String> getData() {
    return dataSource.fetchData();
  }
}

Neste exemplo, Repository interage apenas com a abstração DataSource, sem se preocupar de onde exatamente vêm os dados (HTTP, armazenamento local, etc.). Isso permite trocar facilmente a fonte de dados sem alterar o código de Repository.