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:

Image of Timescale

Timescale – the developer's data platform for modern apps, built on PostgreSQL

Timescale Cloud is PostgreSQL optimized for speed, scale, and performance. Over 3 million IoT, AI, crypto, and dev tool apps are powered by Timescale. Try it free today! No credit card required.

Try free

Top comments (0)

Billboard image

The Next Generation Developer Platform

Coherence is the first Platform-as-a-Service you can control. Unlike "black-box" platforms that are opinionated about the infra you can deploy, Coherence is powered by CNC, the open-source IaC framework, which offers limitless customization.

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay