Este artigo é a parte 2 de 5 na série Dart

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?