DEV Community

Cover image for Modelando as classes da melhor API de tabelas de campeonato que você já viu!
anastacio_dev
anastacio_dev

Posted on

Modelando as classes da melhor API de tabelas de campeonato que você já viu!

Se você já estudou nem que seja um pouco de orientação a objetos, sabe que o coração desse paradigma está em classificar objetos. É como separar todos os objetos da mesa de acordo com os seus atributos e funcionalidades.

Classificar — ou modelar classes — também é como criar uma forma que irá pegar o nosso punhado de dados e transformá-los em objetos, cada um com seus atributos e funcionalidades, repito.

Pra facilitar, vamos ao JSON que geramos no último texto:

{
  "nomeCampeonato": "String",
  "equipes": [
    {
      "id": "Integer",
      "nome": "String",
      "localizacao": "String",
      "grupo": "String",
      "subGrupo": "String"
    },
  ],
  "formatoCampeonato": {
    "divisaoPorGrupos": "Integer",
    "grupos": [
      {
        "id": "Integer",
        "nome": "String",
        "equipes": ["Integer"],

      },
    ],
    "turnosDentroGrupo": "Integer",
    "turnosEntreGrupos": "Integer",
    "sorteioGrupos": "Boolean"
  },
  "calendarioConfig": {
    "tabelaOtimizada": "Boolean",
    "totalJogosPorDia": "Integer",
    "diasDescanso": "Integer"
  }
}
Enter fullscreen mode Exit fullscreen mode

Dando uma olhada, é possível ver que o JSON já classifica, de alguma forma, nossos objetos.

Segundo o que está posto, temos:

  • Uma lista de equipes, o que nos leva um objeto do tipo "equipe";
  • Um configurador de calendário (esse nome é ruim, mas vamos deixar assim, por hora) que ajusta alguns parâmetros do nosso agendamento de jogos, como quantidade de jogos por dia, período de descanso dos times e a opção de otimização de viagens tratada no nosso primeiro texto
  • E dentro de um objeto chamado "formatoCampeonato", temos uma lista de grupos. E grupo contém uma lista de equipes. Antes que você confunda a cabeça, essa lista de listas é algo como uma lista (grupo A, grupo B, etc...) sendo que cada item dessa lista também é uma lista.
Grupo A Grupo B
Palmeiras Bahia
Cruzeiro Fluminense
Cuiabá Grêmio
Paysandu Náutico

Então, por enquanto temos as seguintes classes mapeadas:

  • Equipe: contento nome da equipe, localização, grupo e subgrupo;
  • Grupo: contendo nome do grupo e a lista de equipes que o preenche;
  • Configurador de calendário (nome bem ruim..., que contém os atributos de dias de descanso para cada equipe, quantidade de jogos por dia e se a tabela será otimizada ou não.

Faltou tratar o objeto formatoCampeonato, que contém dados sobre quantidade de turnos, grupos e se haverá um sorteio de chaves por nossa parte.

Mas bem que poderíamos chamar a classe que forma esse objeto de "Campeonato", não? Afinal, são todos esses dados pertencentes a um campeonato.

E também podemos adicionar a classe tabela. Todo campeonato tem uma tabela de jogos, certo? E é justamente por conta dessa tabela que esse projeto existe.

Logo, podemos definir essa classe:

  • Campeonato: contendo informações de quantidade de grupos, quantidade de turnos disputados dentro do grupo e contra times de fora do grupo e a tabela de jogos.

A tabela é mais um daqueles casos de lista de listas. A tabela, em si, é uma lista de rodadas. E a rodada é uma lista de jogos.

E se temos uma tabela de jogos, também temos a classe Jogo, que contém um time mandante, um visitante, um local e uma data.

Vamos definir, então, tabela, lista e jogo:

  • Tabela: lista de rodadas;
  • Rodada: contento lista de jogos, além do número da rodada;
  • Jogo: contendo informações de time mandante, time visitante, local e data.

Juntando tudo, segue abaixo todas as nossas classes, seguidas de seus atributos.

  • Equipe: contendo nome da equipe, localização, grupo e subgrupo;
  • Grupo: contendo nome do grupo e a lista de equipes que o preenche;
  • Calendário (mudei o nome), que contém os atributos de dias de descanso para cada equipe, quantidade de jogos por dia e se a tabela será otimizada ou não.
  • Campeonato: contendo a quantidade de grupos, a lista de grupos, quantidade de turnos disputados dentro do grupo e contra times de fora do grupo e a tabela de jogos.
  • Tabela: lista de rodadas;
  • Rodada: contento lista de jogos, além do número da rodada;
  • Jogo: contendo informações de time mandante, time visitante, local e data.

Abaixo, o diagrama UML representando nossas classes:

Imagem do diagrama UML que representa a aplicação. Perdoem, parece que o dev.to não tem suporte ao padrão Mermaid, então não consegui criar um diagrama acessível.

Nos próximos textos, podemos começar a implementação. Aqui, usaremos Java e Spring.

Prosseguimos.


Leituras complementares:

Top comments (0)