Mais uma Aplicação Elegante do Enum
- Dart 03 – Generics no Dart
- Dart 02 – Exceções, Classes e Mais
- Dart 01 – Introdução
- Enumerações em Dart com Interfaces e Polimorfismo
- Mais uma Aplicação Elegante do Enum
Mais uma Aplicação Elegante do Enum
Uma aplicação bastante elegante de enhanced enums em Dart é na definição de rotas para uso em ferramentas como o GoRoute. Abaixo, apresento uma abordagem clássica utilizando uma classe com constantes nomeadas:
class Route { final String name; final String path; const Route._(this.name, this.path); } abstract final class Routes { // app static const home = Route._('home', '/'); static const events = Route._('events', '/events'); static const favClubs = Route._('favClubs', '/fav_clubs'); static const profile = Route._('profile', '/profile'); // auth static const signIn = Route._('signIn', '/sign_in'); static const signUp = Route._('signUp', '/sign_up'); static const splash = Route._('splash', '/splash'); // user static const userRegister = Route._('userRegister', '/user_register'); static const addresses = Route._('addresses', '/address'); static const addressRegister = Route._('addressRegister', '/address_register'); static const billinginfo = Route._('billinginfo', '/billinginfo'); // clubs static const clubs = Route._('clubs', '/clubs'); static const clubRegister = Route._('clubRegister', '/club_register'); static const schedule = Route._('schedule', '/schedule'); static const registration = Route._('registration', '/registration'); static const manageClub = Route._('manageClub', '/manage_club'); static const clubDetails = Route._('clubDetails', '/club_details'); }
Nesta estrutura, Route
possui um construtor privado, garantindo que novas rotas só possam ser declaradas dentro do mesmo arquivo. Já Routes
é uma classe abstrata e final, o que impede sua instanciação, implementação ou extensão, reforçando a imutabilidade da definição de rotas.
A seguir, uma alternativa moderna e mais enxuta com uso de uma enumeração enriquecida:
enum Routes { // app home('/'), events('/events'), favClubs('/fav_clubs'), profile('/profile'), // auth signIn('/sign_in'), signUp('/sign_up'), splash('/splash'), // user userRegister('/user_register'), addresses('/address'), addressRegister('/address_register'), billinginfo('/billinginfo'), // clubs clubs('/clubs'), clubRegister('/club_register'), schedule('/schedule'), registration('/registration'), manageClub('/manage_club'), clubDetails('/club_details'); final String path; const Routes(this.path); @override String toString() => name; }
Neste caso, cada item do enum representa uma rota e carrega consigo o caminho associado (path
). Isso proporciona maior concisão e leitura mais direta do código, além de facilitar integrações com métodos que utilizam o nome da rota como chave. Isso proporciona maior concisão, leitura mais direta do código e facilita integrações com métodos que utilizam o nome da rota como chave, como no GoRoute
.
Essa enum pode substituir diretamente a antiga classe Routes
, sendo utilizada em qualquer ponto do código onde os caminhos e nomes das rotas forem necessários, sem a necessidade mudanças estruturais.
GoRoute( name: Routes.home.name, path: Routes.home.path, builder: (_, __) => HomePage(), );
Ambas as abordagens são válidas. A escolha entre uma ou outra depende das preferências do time e das necessidades de controle, legibilidade e organização do projeto.
E você, onde mais aplicaria o poder das enumerações enriquecidas em Dart?
Deixe uma resposta