Article image
Daniel Melonari
Daniel Melonari26/06/2024 16:55
Compartilhe

Strategy Pattern e Princípios SOLID em Dart

    O Strategy Pattern é um padrão de projeto comportamental que permite que um algoritmo ou comportamento seja selecionado em tempo de execução. Isso é útil quando há vários algoritmos relacionados, mas o algoritmo específico a ser usado não é conhecido até o tempo de execução.

    Implementação do Strategy Pattern

    Em Dart, o Strategy Pattern pode ser implementado usando interfaces e classes abstratas. A interface define o método que todos os algoritmos devem implementar, enquanto as classes abstratas fornecem implementações específicas desses métodos.

    Por exemplo, considere a seguinte interface para o algoritmo de filtragem de produtos:

    abstract class ProductFilterStrategy {
    List<Product> filter(List<Product> products);
    }
    

    Essa interface define um método filter() que recebe uma lista de produtos e retorna uma lista filtrada.

    Agora, podemos criar classes que fornecem implementações específicas do método filter():

    class FilterByPriceStrategy implements ProductFilterStrategy {
    final double price;
    
    FilterByPriceStrategy(this.price);
    
    @override
    List<Product> filter(List<Product> products) {
      return products.where((product) => product.price <= price).toList();
    }
    }
    class FilterByCategoryStrategy implements ProductFilterStrategy {
    final int category;
    
    FilterByCategoryStrategy(this.category);
    
    @override
    List<Product> filter(List<Product> products) {
      return products.where((product) => product.category == category).toList();
    }
    }
    class FilterByAvailabilityStrategy implements ProductFilterStrategy {
    @override
    List<Product> filter(List<Product> products) {
      return products.where((product) => product.isAvailable).toList();
    }
    }
    

    Essas classes definem os algoritmos específicos de filtragem por preço, categoria e disponibilidade, respectivamente.

    Utilização do Strategy Pattern

    O aplicativo pode então usar essas estratégias para filtrar a lista de produtos:

    // Cria uma lista de produtos
    List<Product> products = [...];
    
    // Cria uma instância da estratégia de filtragem por preço
    ProductFilterStrategy filterByPriceStrategy = FilterByPriceStrategy(2000);
    
    // Filtra a lista de produtos usando a estratégia de filtragem por preço
    List<Product> filteredProducts = filterByPriceStrategy.filter(products);
    

    Princípios SOLID

    O Strategy Pattern pode ser usado para implementar os seguintes princípios SOLID:

    • Princípio da Responsabilidade Única (SRP): Cada classe deve ter uma única responsabilidade. No exemplo acima, a interface ProductFilterStrategy define a responsabilidade de filtrar uma lista de produtos, enquanto as classes FilterByPriceStrategy, FilterByCategoryStrategy e FilterByAvailabilityStrategy fornecem implementações específicas dessa responsabilidade.
    • Princípio da Abertura/Fechamento (OCP): As classes devem ser abertas para extensão, mas fechadas para modificação. Isso significa que novas funcionalidades podem ser adicionadas ao sistema sem modificar as classes existentes. No exemplo acima, a interface ProductFilterStrategy está aberta para extensão, pois permite que novas estratégias de filtragem sejam adicionadas sem modificar a interface.
    • Princípio da Substituição de Liskov (LSP): As subclasses devem ser substituíveis por suas superclasses. Isso significa que qualquer lugar onde uma superclasse é esperada, uma subclasse pode ser usada sem causar problemas. No exemplo acima, as classes FilterByPriceStrategy, FilterByCategoryStrategy e FilterByAvailabilityStrategy são subclasses da interface ProductFilterStrategy, e podem ser usadas em qualquer lugar onde uma instância de ProductFilterStrategy é esperada.
    • Princípio da Inversão de Dependência (DIP): As classes devem depender de abstrações, e não de implementações concretas. No exemplo acima, a classe GetProductsUseCase depende da interface ProductFilterStrategy, e não de uma implementação específica como FilterByPriceStrategy.

    Conclusão

    O Strategy Pattern é um padrão de projeto poderoso que pode ser usado para melhorar a flexibilidade e a extensibilidade do código. Ao usar o Strategy Pattern, os algoritmos podem ser facilmente alterados e personalizados sem afetar o restante do código.

    Além disso, o Strategy Pattern pode ajudar a implementar os princípios SOLID, o que pode tornar o código mais fácil de manter e testar.

    Compartilhe
    Comentários (0)