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