<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: anastacio_dev</title>
    <description>The latest articles on DEV Community by anastacio_dev (@anastacio_dev).</description>
    <link>https://dev.to/anastacio_dev</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1117850%2F1d117121-121f-4e8e-8cd4-7babd045f8b5.png</url>
      <title>DEV Community: anastacio_dev</title>
      <link>https://dev.to/anastacio_dev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/anastacio_dev"/>
    <language>en</language>
    <item>
      <title>Configurando o projeto da melhor API de tabelas de campeonato que você já viu!</title>
      <dc:creator>anastacio_dev</dc:creator>
      <pubDate>Mon, 11 Nov 2024 15:12:17 +0000</pubDate>
      <link>https://dev.to/anastacio_dev/configurando-o-projeto-da-melhor-api-de-tabela-de-campeonatos-que-voce-ja-viu-dl2</link>
      <guid>https://dev.to/anastacio_dev/configurando-o-projeto-da-melhor-api-de-tabela-de-campeonatos-que-voce-ja-viu-dl2</guid>
      <description>&lt;p&gt;Assumindo que você já preparou o ambiente, vá até o &lt;a href="https://start.spring.io/" rel="noopener noreferrer"&gt;Spring Initializr&lt;/a&gt; e gere um projeto com os parâmetros da imagem abaixo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feq5ti59ocmr3idc8k7oo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feq5ti59ocmr3idc8k7oo.png" alt="Imagem mostra um projeto sendo gerado no Spring Initializr, com os seguintes parâmetros: Project: Maven; Language: Java; Spring Boot: 3.3.5, que é a versão fechada mais recente; preenchimento de group, artifact e name fica a seu cargo; Packaging: Jar; Java: 21; Dependencies: Spring Web &amp;lt;br&amp;gt;
e Spring Data MongoDB" width="800" height="403"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Algumas considerações sobre as dependências:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Vou utilizar MongoDB no projeto, pois creio que faz mais sentido dado ao tipo de dado que iremos produzir. É possível utilizar um banco relacional, também. Sinta-se à vontade;&lt;/li&gt;
&lt;li&gt;Ainda não vou mexer com Spring Security, pois o foco agora é a solução de negócio. No futuro, vamos trabalhar a parte de autenticação. Se você domina o Spring Security, sinta-se à vontade para decidir baixar isso agora ou não;&lt;/li&gt;
&lt;li&gt;Muita gente gosta de usar Lombok para a gestão de &lt;em&gt;getters&lt;/em&gt; e &lt;em&gt;setters&lt;/em&gt;. Particularmente, não gosto e não vou usar. Sinta-se livre para fazer a sua escolha;&lt;/li&gt;
&lt;li&gt;Também não está no escopo atual do projeto lidar com Cloud, conteinerização, orquestração, rastreamento, observabilidade e outras coisas relacionadas a infraestrutura e SRE, por isso não estou baixando nada relativo a esses assuntos. Mais uma vez, sinta-se à vontade para montar a &lt;em&gt;stack&lt;/em&gt; que você se sentir confortável.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Uma vez o projeto baixado, unzipado, dependências instaladas e com o "Hello World" rodado, crie os pacotes abaixo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frxcxhx2dvb95dk8g5c91.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frxcxhx2dvb95dk8g5c91.png" alt="Print mostrando uma árvore com os pacotes que devem ser criados em nomeDoProjeto/source/main/java/com.Tabelao/: controller, model, repository, service" width="357" height="219"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Se você estiver atento, se lembrará que essas pastas estão batendo com o nosso desenho arquitetural feito em um capítulo anterior, exceto pelo "View", que é o front-end e ainda não trararemos.&lt;/p&gt;

&lt;p&gt;Sendo assim, podemos relembrar a utilidade de cada pacote:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Model: onde criaremos os nossos modelos, ou classes de objetos;&lt;/li&gt;
&lt;li&gt;Repository: onde ficará a nossa interface com o banco de dados (leia sobre padrão &lt;a href="https://www.mongodb.com/pt-br/developer/products/mongodb/mongodb-orms-odms-libraries/" rel="noopener noreferrer"&gt;ODM&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Service: onde ficará nossa lógica de negócio, como a geração da tabela e agendamento de jogos, além das validações de dados de entrada e saída;&lt;/li&gt;
&lt;li&gt;Controller: onde cuidaremos dos &lt;em&gt;endpoints&lt;/em&gt; (ou rotas, URLs, URIs, links) de requisição e resposta. É o que chamamos informalmente de API.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No próximo texto tem código. Eu juro! :)&lt;/p&gt;

&lt;p&gt;Prosseguimos!&lt;/p&gt;

</description>
      <category>springinitializr</category>
      <category>spring</category>
    </item>
    <item>
      <title>Preparando o ambiente de desenvolvimento da melhor API de tabelas de campeonato que você já viu!</title>
      <dc:creator>anastacio_dev</dc:creator>
      <pubDate>Mon, 11 Nov 2024 14:37:54 +0000</pubDate>
      <link>https://dev.to/anastacio_dev/preparando-o-ambiente-de-desenvolvimento-da-melhor-api-de-tabelas-de-campeonato-que-voce-ja-viu-2ij5</link>
      <guid>https://dev.to/anastacio_dev/preparando-o-ambiente-de-desenvolvimento-da-melhor-api-de-tabelas-de-campeonato-que-voce-ja-viu-2ij5</guid>
      <description>&lt;p&gt;Antes de começar a codar loucamente, preciso confirmar se você tem domínio sobre o preparo do ambiente de desenvolvimento. O objetivo desta série não é entrar nesse assunto, logo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ou você tem total domínio das ferramentas necessárias antes de iniciar um projeto Java;&lt;/li&gt;
&lt;li&gt;Ou você anota a lista abaixo, pause a caminhada e vá aprender sobre esses assuntos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Preparar ambiente é chato porque parece que você não está gerando valor (e não está mesmo), mas é o tipo de coisa que você faz uma vez. E com o tempo, passa a ser algo simples de resolver.&lt;/p&gt;

&lt;p&gt;Bora pro checklist. Confira se você possui essas ferramentas e conhecimentos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Lógica de programação básica&lt;/strong&gt;, como &lt;code&gt;if&lt;/code&gt;, &lt;code&gt;while&lt;/code&gt; e essas coisas bem básicas;&lt;/li&gt;
&lt;li&gt;Particularidades da linguagem Java, como gestão de pacotes com &lt;strong&gt;Maven&lt;/strong&gt; (vou usar Maven aqui, o que não te impede de utilizar outro gerenciador), o arquivo &lt;strong&gt;&lt;code&gt;pom.xml&lt;/code&gt;&lt;/strong&gt;, domínio do pacote &lt;strong&gt;Jakarta/Javax&lt;/strong&gt;;&lt;/li&gt;
&lt;li&gt;Particularidades do &lt;strong&gt;Spring Framework&lt;/strong&gt;, como a gestão de &lt;strong&gt;pacotes Spring dentro do &lt;code&gt;pom.xml&lt;/code&gt;&lt;/strong&gt;, uso do &lt;strong&gt;Spring Initializr&lt;/strong&gt; para gerar os projetos;&lt;/li&gt;
&lt;li&gt;Instalação/atualização do &lt;strong&gt;JDK&lt;/strong&gt; na sua máquina. Eu vou usar a &lt;strong&gt;JDK 21&lt;/strong&gt;. Outras versões podem apresentar alguma diferença em alguma funcionalidade, mas qualquer versão da 17 em diante não apresenta mudanças drásticas;&lt;/li&gt;
&lt;li&gt;Instalação do &lt;strong&gt;MongoDB&lt;/strong&gt;, que será o nosso banco de dados. caso você queira utilizar um banco relacional, sinta-se livre, mas aqui adotaremos o Mongo por acreditar que se encaixa melhor com o projeto&lt;/li&gt;
&lt;li&gt;Uso de alguma &lt;strong&gt;IDE&lt;/strong&gt; para facilitar o desenvolvimento. Eu uso o &lt;strong&gt;IntelliJ&lt;/strong&gt;, mas existem outras opções como &lt;strong&gt;Eclispe, VS Code e Netbeans&lt;/strong&gt;; além de IDEs online, como o &lt;strong&gt;Replit&lt;/strong&gt;. Fique a vontade na sua escolha. É possível desenvolver esse projeto confortavelmente em qualquer uma delas (e com algum nível menor de conforto em outras que não citei aqui), mas não vou entrar nos detalhes de configuração de cada IDE e nem indicar o uso preferencial de nenhuma delas. Qualquer problema ou dúvida, pesquise!&lt;/li&gt;
&lt;li&gt;E, por fim, vou assumir que você tem conhecimento em &lt;strong&gt;Git e Github&lt;/strong&gt;. Não é estritamente necessário o uso dessas duas ferramentas, mas é altamente recomendado. Se você não sabe o porquê, então sugiro que pesquise mais sobre elas. Não ficarei dando detalhes sobre como &lt;em&gt;commitar&lt;/em&gt; código, administrar &lt;em&gt;branches&lt;/em&gt; e outras coisas do tipo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Se você chegou ao fim desse texto, é porque ou você já tem domínio de tudo isso ou ainda vai procurar preencher alguma lacuna de conhecimento.&lt;/p&gt;

&lt;p&gt;De qualquer forma, prosseguimos!&lt;/p&gt;

</description>
      <category>maven</category>
      <category>jdk</category>
      <category>ide</category>
      <category>spring</category>
    </item>
    <item>
      <title>Definindo a arquitetura da melhor API de tabela de campeonato que você já!</title>
      <dc:creator>anastacio_dev</dc:creator>
      <pubDate>Sun, 10 Nov 2024 19:57:47 +0000</pubDate>
      <link>https://dev.to/anastacio_dev/definindo-a-arquitetura-da-melhor-api-de-tabela-de-campeonato-que-voce-ja-3kkp</link>
      <guid>https://dev.to/anastacio_dev/definindo-a-arquitetura-da-melhor-api-de-tabela-de-campeonato-que-voce-ja-3kkp</guid>
      <description>&lt;p&gt;&lt;em&gt;Disclaimer: Arquitetura é sempre um assunto polêmico. Há quem defenda que tudo isso caberia bem em um JSP e há quem diga que tudo tem que estar em microsservicos. Nem tão ao céu, nem tão ao inferno: optei aqui por um MVC, que creio que atende bem as expectativas. Vale lembrar que o objetivo principal desse projeto é educativo, então não estou considerando os custos e benefícios de qualquer abordagem considerando a exposição dessa solução ao usuário final. Nesses casos, precisaríamos de outras análises, que não cabem aqui.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Daqui pra frente, estou assumindo que você tem conhecimentos suficientes em Java e Spring para prosseguirmos. E dentro da grande caixa de ferramentas que é o Spring, você deve ter se deparado com o Spring MVC. &lt;/p&gt;

&lt;p&gt;O Spring MVC pertence ao Spring Framework e implementar aplicações web utilizando a arquitetura MVC.&lt;/p&gt;

&lt;p&gt;Assumindo também que você conhece este padrão (caso não conheça, estou deixando links para tudo isso no fim do texto), serei sucinto: a arquitetura MVC divide nossa aplicação em três camadas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Model (M), onde fica as nossas classes, ou modelos;&lt;/li&gt;
&lt;li&gt;View (V), onde fica o nosso front-end. Note que este projeto vai apenas entregar a API. Não pretendemos (ainda) abordar o front-end. &lt;/li&gt;
&lt;li&gt;Controller (C), onde os endpoints da nossa API serão expostas. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Abaixo, um desenho arquitetural do nosso aplicativo, utilizando o padrão MVC bem simplificado:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdxc7w6k6jq1xwxmbmokw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdxc7w6k6jq1xwxmbmokw.png" alt="Arquitetura do Tabelão, seguindo o padrão MVC puro" width="800" height="637"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para os nosso propósitos, vamos adicionar as camadas de Serviço, que vai abrigar a lógica de negócio, deixando o Controller apenas para tratar a exposição dos endpoints; e vamos adicionar uma camada de Repositório, para lidar com a persistência utilizando uma ORM.&lt;/p&gt;

&lt;p&gt;Na prática, fica assim:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwilrdyd7yezsbsyvemz6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwilrdyd7yezsbsyvemz6.png" alt="Diagrama arquitetural da nossa aplicação, utilizando como base o padrão MVC e adicionando as camadas de serviço e repositório" width="800" height="1071"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Acho que no próximo capítulo já podemos começar com ele... O CÓDIGO!&lt;/p&gt;

&lt;p&gt;Prosseguimos!&lt;/p&gt;




&lt;p&gt;Leituras complementares:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.devmedia.com.br/exemplo/como-comecar-com-spring/73" rel="noopener noreferrer"&gt;O que é Spring&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.devmedia.com.br/introducao-ao-padrao-mvc/29308" rel="noopener noreferrer"&gt;O que é o padrão MVC&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>architecture</category>
      <category>mvc</category>
    </item>
    <item>
      <title>Modelando as classes da melhor API de tabelas de campeonato que você já viu!</title>
      <dc:creator>anastacio_dev</dc:creator>
      <pubDate>Sun, 10 Nov 2024 17:38:14 +0000</pubDate>
      <link>https://dev.to/anastacio_dev/modelando-as-classes-da-melhor-api-de-tabelas-de-campeonato-que-voce-ja-viu-13en</link>
      <guid>https://dev.to/anastacio_dev/modelando-as-classes-da-melhor-api-de-tabelas-de-campeonato-que-voce-ja-viu-13en</guid>
      <description>&lt;p&gt;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. &lt;/p&gt;

&lt;p&gt;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. &lt;/p&gt;

&lt;p&gt;Pra facilitar, vamos ao JSON que geramos no último texto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"nomeCampeonato"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"String"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"equipes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Integer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"nome"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"String"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"localizacao"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"String"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"grupo"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"String"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"subGrupo"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"String"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"formatoCampeonato"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"divisaoPorGrupos"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Integer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"grupos"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Integer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"nome"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"String"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"equipes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Integer"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;

      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"turnosDentroGrupo"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Integer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"turnosEntreGrupos"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Integer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"sorteioGrupos"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Boolean"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"calendarioConfig"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"tabelaOtimizada"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Boolean"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"totalJogosPorDia"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Integer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"diasDescanso"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Integer"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dando uma olhada, é possível ver que o JSON já classifica, de alguma forma, nossos objetos. &lt;/p&gt;

&lt;p&gt;Segundo o que está posto, temos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Uma lista de equipes, o que nos leva um objeto do tipo "equipe";&lt;/li&gt;
&lt;li&gt;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&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Grupo A&lt;/th&gt;
&lt;th&gt;Grupo B&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Palmeiras&lt;/td&gt;
&lt;td&gt;Bahia&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cruzeiro&lt;/td&gt;
&lt;td&gt;Fluminense&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cuiabá&lt;/td&gt;
&lt;td&gt;Grêmio&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Paysandu&lt;/td&gt;
&lt;td&gt;Náutico&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Então, por enquanto temos as seguintes classes mapeadas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Equipe: contento nome da equipe, localização, grupo e subgrupo;&lt;/li&gt;
&lt;li&gt;Grupo: contendo nome do grupo e a lista de equipes que o preenche;&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Faltou tratar o objeto &lt;code&gt;formatoCampeonato&lt;/code&gt;, que contém dados sobre quantidade de turnos, grupos e se haverá um sorteio de chaves por nossa parte. &lt;/p&gt;

&lt;p&gt;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. &lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;Logo, podemos definir essa classe:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;Vamos definir, então, tabela, lista e jogo:&lt;/p&gt;

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

&lt;p&gt;Juntando tudo, segue abaixo todas as nossas classes, seguidas de seus atributos. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Equipe&lt;/strong&gt;: contendo nome da equipe, localização, grupo e subgrupo;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Grupo&lt;/strong&gt;: contendo nome do grupo e a lista de equipes que o preenche;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Calendário (mudei o nome)&lt;/strong&gt;, 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.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Campeonato&lt;/strong&gt;: 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.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tabela&lt;/strong&gt;: lista de rodadas;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rodada&lt;/strong&gt;: contento lista de jogos, além do número da rodada;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Jogo&lt;/strong&gt;: contendo informações de time mandante, time visitante, local e data.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Abaixo, o diagrama UML representando nossas classes:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbqce56if40ypa8khkyu4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbqce56if40ypa8khkyu4.png" alt="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." width="800" height="1140"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nos próximos textos, podemos começar a implementação. Aqui, usaremos Java e Spring. &lt;/p&gt;

&lt;p&gt;Prosseguimos.&lt;/p&gt;




&lt;p&gt;Leituras complementares:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.devmedia.com.br/introducao-a-programacao-orientada-a-objetos-em-java/26452" rel="noopener noreferrer"&gt;Criação de classes em orientação a objeto&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://support.microsoft.com/pt-br/topic/criar-um-diagrama-de-classe-uml-de6be927-8a7b-4a79-ae63-90da8f1a8a6b" rel="noopener noreferrer"&gt;Diagramas de classe UML&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>uml</category>
    </item>
    <item>
      <title>Identificando os objetos da melhor API de tabela de campeonatos que você já viu!</title>
      <dc:creator>anastacio_dev</dc:creator>
      <pubDate>Sun, 10 Nov 2024 13:25:11 +0000</pubDate>
      <link>https://dev.to/anastacio_dev/identificando-os-objetos-da-melhor-api-de-tabela-de-campeonatos-que-voce-ja-viu-1607</link>
      <guid>https://dev.to/anastacio_dev/identificando-os-objetos-da-melhor-api-de-tabela-de-campeonatos-que-voce-ja-viu-1607</guid>
      <description>&lt;p&gt;No último texto, finalizamos com uma ideia solta de como poderia ser os nossos JSONs de entrada e saida.&lt;/p&gt;

&lt;p&gt;Fui além e pedi para uma LLM modelar aqueles requisitos em formato JSON, para que as coisas ficassem ainda mais claras. Vamos ver se isso nos ajuda?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"nomeCampeonato"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"String"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"equipes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Integer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"nome"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"String"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"localizacao"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"String"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"grupo"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"String"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"subGrupo"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"String"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"formatoCampeonato"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"divisaoPorGrupos"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Integer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"grupos"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Integer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"nome"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"String"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"equipes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Integer"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;

      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"turnosDentroGrupo"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Integer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"turnosEntreGrupos"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Integer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"sorteioGrupos"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Boolean"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"calendarioConfig"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"tabelaOtimizada"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Boolean"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"totalJogosPorDia"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Integer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"diasDescanso"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Integer"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vamos entender o que a LLM nos trouxe:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Uma lista chamada &lt;code&gt;equipes&lt;/code&gt;, contendo objetos com o nome do time e a sua localização;&lt;/li&gt;
&lt;li&gt;Um objeto chamado &lt;code&gt;formatoCampeonato&lt;/code&gt;, que que define em quantos grupos os times vão se dividir e nos traz, embutidos, um objeto grupo;&lt;/li&gt;
&lt;li&gt;Uma lista chamada &lt;code&gt;grupos&lt;/code&gt;, que contém os grupos onde estão organizadas as equipes. Pense que no Brasileirão, por exemplo, teríamos apenas um objeto desses, com os 20 times. Já na Libertadores, teríamos 8 objetos "grupo", com 4 times cada.&lt;/li&gt;
&lt;li&gt;Dentro de &lt;code&gt;formatoCampeonato&lt;/code&gt; também definimos se, e quantos turnos haverá entre times dentro do mesmo grupo e entre times de grupos diferentes. Lembre que no Paulistão (até 2024), por exemplo, são 4 grupos onde os times jogam um turno contra os times dos outros grupos e não jogam contra os times do próprio grupo. &lt;/li&gt;
&lt;li&gt;
&lt;code&gt;formatoCampeonato&lt;/code&gt; também define se somos nós quem teremos que fazer o sorteio dos grupos ou se o usuário já vai mandar tudo pronto. É por isso que temos os campos de &lt;code&gt;grupo&lt;/code&gt; e &lt;code&gt;subgrupo&lt;/code&gt; lá no objeto &lt;code&gt;equipes&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;E, pra finalizar, o objeto &lt;code&gt;calendarioConfig&lt;/code&gt;, que define questões de calendário, como quantidade de jogos por dia, quantidade de dias de descanso que um time deve ter entre um jogo e outro e o nosso "tempero secreto": a otimização de viagens!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bem, se você já estudou um pouco de orientação a objetos, sabe que esse objetos JSON que modelamos aqui são grandes candidatos a se tornarem as classes do nosso código, certo? &lt;/p&gt;

&lt;p&gt;No próximo texto, vamos analisar se cada objeto JSON desses é elegível para gerar uma classe no nosso backend e também vamos falar um pouco da arquitetura do nosso Tabelão.&lt;/p&gt;

&lt;p&gt;Prosseguimos.&lt;/p&gt;

</description>
      <category>java</category>
      <category>spring</category>
      <category>architecture</category>
      <category>api</category>
    </item>
    <item>
      <title>Analisando os requisitos da melhor API de tabela de campeonato que você já viu</title>
      <dc:creator>anastacio_dev</dc:creator>
      <pubDate>Sat, 09 Nov 2024 19:25:44 +0000</pubDate>
      <link>https://dev.to/anastacio_dev/a-melhor-api-de-tabela-de-campeonato-que-voce-ja-viu-modelando-a-solucao-2oha</link>
      <guid>https://dev.to/anastacio_dev/a-melhor-api-de-tabela-de-campeonato-que-voce-ja-viu-modelando-a-solucao-2oha</guid>
      <description>&lt;p&gt;Vamos começar escrevendo qual é a ideia: &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Receber um conjunto de times e devolver a tabela com todos os jogos entre esses times, as datas das partidas e com a opção da nossa "otimização", que visa reduzir o número de viagens entre os times. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Considerando os requisitos de saída, precisamos ter como entrada não apenas o nome do time, mas outros dados também:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;sua localização, para que possamos planejar as viagens;&lt;/li&gt;
&lt;li&gt;o modelo do campeonato: serão times em um grupo único, como o Brasileirão? Ou serão times divididos em vários grupos, como a Copa do Mundo?&lt;/li&gt;
&lt;li&gt;o campeonato será em turno e returno, turno único, ou algum modelo misto, como a Champions League, onde apesar de um grupo único, não jogam todos contra todos? Ou como a NBA, onde se joga 4 turnos contra os times do seu grupo e até 3 turnos contra os demais times[1]?&lt;/li&gt;
&lt;li&gt;se houver a divisão por grupos, somos nós quem vamos sortear que time cai em cada grupo ou o usuário já definiu isso? Vamos dar a opção para o usuário;&lt;/li&gt;
&lt;li&gt;o usuário realmente quer uma tabela "otimizada"?. Talvez seja só o campeonato de condomínio, não é mesmo? Vamos oferecer ao usuário a opção de criar uma tabela simples ou uma otimizada, ok?&lt;/li&gt;
&lt;li&gt;quantos jogos podemos agendar por dia? Haverá diferenças de limite de jogos por cada dia da semana (tipo, mais jogos aos fins de semana)?&lt;/li&gt;
&lt;li&gt;&lt;p&gt;e qual é o intervalo de descanso que um time precisa ter entre uma partida e outra?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;E o nome do campeonato, claro.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nota: &lt;em&gt;Nesta fase, em um projeto real, teríamos que obter esses requisitos com o cliente.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Dada as informações acima, podemos inferir que as entradas do nosso sistema serão:&lt;/p&gt;

&lt;p&gt;Entradas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Um conjunto de equipes e suas localizações &lt;/li&gt;
&lt;li&gt;a forma do campeonato ( quantos turnos haverá entre times do mesmo grupo? E contra times dos demais grupos? Aliás, haverá divisão por grupos?&lt;/li&gt;
&lt;li&gt;Havendo a divisão por grupos, somos nós quem faremos o sorteio ou receberemos os grupos já definidos?&lt;/li&gt;
&lt;li&gt;O usuário quer uma tabela otimizada? Sim ou não?&lt;/li&gt;
&lt;li&gt;Total de jogos permitidos por dia&lt;/li&gt;
&lt;li&gt;Dias de descanso que um time;precisa ter entre um jogo e outro;&lt;/li&gt;
&lt;li&gt;E o nome do campeonato.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;E a saída será:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O nome do campeonato&lt;/li&gt;
&lt;li&gt;Os grupos (ou o grupo, caso seja um só)&lt;/li&gt;
&lt;li&gt;A tabela de jogos, contendo todos os jogos com suas respectivas datas&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Aqui já dá pra imaginar dois JSONs, um com os dados de entrada e outro com os dados de saída, certo?&lt;/p&gt;

&lt;p&gt;E, pra cada tópico, já dá pra imaginar um objeto, ok? &lt;/p&gt;

&lt;p&gt;E como objetos sempre nos levam a falar de classes, então já estamos bem perto dele... O código. &lt;/p&gt;

&lt;p&gt;Assuntos para o próximo texto. Prosseguimos.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;[1] Por curiosidade, entenda o regulamento da NBA com esse texto no &lt;a href="https://blog.jrnba.com.br/o-que-sao-as-conferencias-na-nba-e-como-elas-funcionam/" rel="noopener noreferrer"&gt;blog deles&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>api</category>
      <category>java</category>
      <category>spring</category>
      <category>ai</category>
    </item>
    <item>
      <title>Porque eu estou criando a melhor API de tabela de campeonato que você já viu</title>
      <dc:creator>anastacio_dev</dc:creator>
      <pubDate>Sat, 09 Nov 2024 17:43:12 +0000</pubDate>
      <link>https://dev.to/anastacio_dev/hj-4572</link>
      <guid>https://dev.to/anastacio_dev/hj-4572</guid>
      <description>&lt;h2&gt;
  
  
  Uma conversa sobre as motivações e as regras de negócio, para contextualizar o leitor
&lt;/h2&gt;

&lt;p&gt;Uma coisa que me encanta desde criança são &lt;strong&gt;tabelas de campeonatos&lt;/strong&gt;. Sempre fiquei doido com a ideia de conseguirem fazer com que 20 times jogassem todos contra todos, sem repetições, e tudo batia perfeitamente.&lt;/p&gt;

&lt;p&gt;Me lembro, desde criança, rabiscando em papel cruzamentos de jogos e tentando fazer a coisa dar certo. &lt;strong&gt;Eu era uma criança estranha&lt;/strong&gt;, eu sei.&lt;/p&gt;

&lt;p&gt;Mas mal sabia eu que aquele era o meu primeiro contato com algoritmos... Quem diria.&lt;/p&gt;

&lt;p&gt;Cresci, e na adolescência, conheci a NBA. E então &lt;strong&gt;a minha mente explodiu!&lt;/strong&gt; Trinta equipes, divididas em seis grupos jogando entre si, jogando contra adversários dos outros grupos, confrontos que poderiam se repetir até quatro vezes... E o pior: tudo isso, 82 jogos para cada time, tinham que ser jogados em seis meses. Isso dá por volta de 14 jogos por mês: jogo dia sim, dia não.&lt;/p&gt;

&lt;p&gt;Se você acha o calendário do futebol brasileiro maluco, tem que conhecer a NBA, meu parça. Jogar em dias seguidos (o famoso e infame "back-to-back") é coisa comum.&lt;/p&gt;

&lt;p&gt;Só que nessa bagunça, algo me pegou: os times costumam fazer o que chamamos de "trips", que são sequências de jogos fora de casa, objetivando aproveitar ao máximo as viagens. &lt;/p&gt;

&lt;p&gt;Imagine, por exemplo, o New York Knicks. Uma viagem ida e volta para Los Angeles, para enfrentar os Lakers, Estamos falando de 4 mil quilômetros, ou 6 horas pra ir, e mais 4 mil quilômetros pra voltar. Isso equivale a uma viagem entre Porto Alegre e Belém do Pará, pra você ter ideia.&lt;/p&gt;

&lt;p&gt;Imagine então que temos não apenas os Lakers em Los Angeles, mas também os Clippers. E ainda os Warriors em São Francisco e os Kings em Sacramento. Seriam quatro viagens cansativas à California! &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbemr003rkrxuih0e88di.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbemr003rkrxuih0e88di.png" alt="Mapa dos Estados Unidos indicando a localidade de cada time da NBA: 30 times viajando distâncias continentais. Como reduzir horas de viagem?" width="800" height="409"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Mas, na NBA, essas viagens repetitivas são evitadas ao máximo. Os Knicks iriam à LA uma vez e jogaria contra os 4 times de uma vez só. Uma semana corrida, cansativa, tendo em compensação o alívio de não precisar voltar mais à Cidade dos Anjos, a menos que tenha que disputar a final do campeonato por lá.&lt;/p&gt;

&lt;p&gt;Imagina a complexidade disso! Trinta times espalhados por todo o território dos EUA (29, na verdade, porque temos o Toronto Raptors. Isso mesmo, um time canadense na liga!) e a necessidade de fazê-los todos cruzarem esse país continental e dar a todos — equilibradamente, por questões de isonomia — o ônus e o bônus das longas viagens para enfrentar os adversários mais longínquos? &lt;/p&gt;

&lt;p&gt;Por exemplo: quando os Knicks forem a Los Angeles enfrentar os Lakers, os demais times da California, citados anteriormente, precisam estar ali por perto para receberem os nova iorquinos naquela semana. Não pode acontecer de os Clippers estarem viajando pelo Texas, os Warriors pela Costa Leste e os Kings pela região de Chicago. &lt;/p&gt;

&lt;p&gt;Tudo tem que se encaixar. Não basta um simples cruzamento como o que acontece no Brasileirão, por exemplo. &lt;/p&gt;

&lt;p&gt;Daí surgiu o comichão: &lt;strong&gt;como criar um algoritmo que, dado um número de equipes e sua localização, consiga agendar essas viagens longas e partidas consecutivas fora de casa, fazendo essa otimização logística?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Nisto consiste o projeto &lt;strong&gt;Tabelão&lt;/strong&gt;. Quando finalizado, nossa API vai &lt;strong&gt;receber um número de times, sua localização, mais algumas especificações que trataremos em outros textos, e vai devolver uma tabela completa de uma temporada, com a otimização logística de viagens,&lt;/strong&gt; tentando aproveitar ao máximo as viagens longas que um time fará.&lt;/p&gt;

&lt;p&gt;Obviamente que o campeonato do condomínio, por exemplo, não precisa desse nível de otimização. Por isso que não encontrei essa funcionalidade em nenhum gerador de tabelas de campeonatos nas lojas de aplicativos para celulares. &lt;/p&gt;

&lt;p&gt;Aliás, antes de iniciar, precisamos alinhar expectativas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Isto não é um SaaS. (Não ainda, pelo menos, rsrs)&lt;/strong&gt; Logo, não estou me preocupando com MVP, validações com clientes, precificação, demandas comerciais e outras questões de negócio. A conversa aqui é técnica. Desde ferramentas e &lt;em&gt;design patterns&lt;/em&gt; até algoritmos de &lt;em&gt;machine learning&lt;/em&gt; que poderemos utilizar para alcançar a solução. Tudo aqui é perseguindo fins educacionais. &lt;/li&gt;
&lt;li&gt;Se, no fim, tudo ficar muito bom e aparecer um comprador, também não reclamo. Vamos conversar, hehehe.&lt;/li&gt;
&lt;li&gt;E eu acredito que esse estudo teria grande valia para resolver problemas mais "mundanos", como roteamento de transporte de cargas, por exemplo. Quem sabe este não seria um bom &lt;em&gt;spin-off&lt;/em&gt; do Tabelão?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Isto posto, vamos aos próximos capítulos.&lt;/p&gt;

&lt;p&gt;Prosseguimos.&lt;/p&gt;




&lt;p&gt;Leitura adicional: saiba mais sobre a complexidade do quebra cabeça que é o calendário da NBA lendo &lt;a href="https://bolapresa.com.br/o-jogo-do-calendario-da-nba/" rel="noopener noreferrer"&gt;esse post do blog Bola Presa&lt;/a&gt;&lt;/p&gt;

</description>
      <category>api</category>
      <category>java</category>
      <category>spring</category>
      <category>ai</category>
    </item>
    <item>
      <title>8 coisas que existem dentro de um CRUD (pelo menos)</title>
      <dc:creator>anastacio_dev</dc:creator>
      <pubDate>Sun, 25 Feb 2024 22:12:59 +0000</pubDate>
      <link>https://dev.to/anastacio_dev/8-coisas-que-tem-dentro-de-um-crud-pelo-menos-589p</link>
      <guid>https://dev.to/anastacio_dev/8-coisas-que-tem-dentro-de-um-crud-pelo-menos-589p</guid>
      <description>&lt;p&gt;Esse post pode ser considerado básico para alguns, mas existem pessoas que querem aprender e nem sabem por onde começar ou quais termos pesquisar. Esse post é pra você.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é um CRUD?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;CRUD&lt;/strong&gt; é o conjunto de operações básicas do mundo dev. &lt;strong&gt;É o acrônimo para Create (criar), Read (ler), Update (Atualizar) e Delete (deletar)&lt;/strong&gt; dados. &lt;/p&gt;

&lt;p&gt;Um CRUD é a alma de qualquer sistema. Não interessa a IA quântica das galáxias que você usar. Se você quer registrar usuários, operações, compras, pedidos, postagens, comentários e qualquer outra coisa, o CRUD estará lá.&lt;/p&gt;

&lt;p&gt;Logo, saber lidar com um CRUD é um ótimo primeiro passo para quem quer aprender &lt;em&gt;backend&lt;/em&gt;. Se você sabe fazer um CRUD, você já deu o primeiro passo.&lt;/p&gt;

&lt;p&gt;Mas, no mundo real, um CRUD é muito mais que automatizar queries SQL para controlar o que entra e sai de um banco de dados. E este texto é sobre isso. Vamos dar uma olhada em pelo menos 8 coisas que tem dentro de um CRUD?&lt;/p&gt;

&lt;h2&gt;
  
  
  O que tem dentro de um CRUD, afinal?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Autenticação
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--t3jIzfgK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://media1.tenor.com/m/G3008nJfz8MAAAAd/casteloratimbum.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--t3jIzfgK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://media1.tenor.com/m/G3008nJfz8MAAAAd/casteloratimbum.gif" alt="" width="640" height="470"&gt;&lt;/a&gt; &lt;br&gt;
A autenticação é como o porteiro do prédio. "Cara, crachá!" para saber quem pode ou não ter acesso as operações do CRUD. &lt;/p&gt;

&lt;p&gt;Você pode depositar um valor na minha conta bancária, mas não pode sacar, não é mesmo? &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A autenticação cuida de quem pode operar cada uma das operações CRUD.&lt;/strong&gt; Um administrador do sistema pode muito mais do que um simples leitor, certo?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O assunto aqui é SEGURANCA!&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pesquise sobre "como funciona autenticação na linguagem ou framework X". Cada uma dessas linguagens tem suas próprias ferramentas e padrões de autenticação.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Integração
&lt;/h3&gt;

&lt;p&gt;É aqui que cuidamos das famosas &lt;strong&gt;APIs, ou Interfaces de Programação de Aplicações.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Toda vez que você usa dados ou algoritmos que não estão em seu poder, você integra uma ferramenta externa via API. Desde um algoritmo de processamento de dados no Python até uma ferramenta de pagamento do PagSeguro no seu e-commerce.&lt;/p&gt;

&lt;p&gt;O segredo aqui é fazer com que duas coisas diferentes se encaixem harmonicamente. E, para isso, &lt;strong&gt;existem diversos padrões, como REST, gRPC, GraphQL,&lt;/strong&gt; entre outros. &lt;/p&gt;

&lt;p&gt;Linguagens costumam ter frameworks que abstraem a parte difícil, mas é indispensável entender coisas como protocolos HTTP, por exemplo.&lt;/p&gt;

&lt;p&gt;Pesquise por "Como minha linguagem lida com":&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;REST&lt;/li&gt;
&lt;li&gt;GraphQL&lt;/li&gt;
&lt;li&gt;gRPC&lt;/li&gt;
&lt;li&gt;Protocolos HTTP&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Persistência
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4InYa48V--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://media1.tenor.com/m/VuWKxeNCOiEAAAAd/parks-and-rec.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4InYa48V--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://media1.tenor.com/m/VuWKxeNCOiEAAAAd/parks-and-rec.gif" alt="" width="640" height="468"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Persistir dados não é nada mais que salvar essas dados em um banco.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Assim como tudo em programação, boas almas do Senhor já deixaram meio caminho andado com seus frameworks, mas eu desafio você a tentar usar o Spring JPA, por exemplo, sem ter sólidas noções de modelagem de banco de dados...&lt;/p&gt;

&lt;p&gt;Falo por mim: tive que dar uma boa revisitada em conceitos tidos como básicos para saber onde e quais dependências injetar (e já vamos falar sobre "dependências").&lt;/p&gt;

&lt;p&gt;Então, a primeira coisa a pesquisar são os tópicos básicos em banco de dados, depois sim, pesquise sobre frameworks.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Modelo entidade-relacionamento&lt;/li&gt;
&lt;li&gt;SQL&lt;/li&gt;
&lt;li&gt;SQL x Bancos NoSQL&lt;/li&gt;
&lt;li&gt;SGBDs e suas diferenças &lt;/li&gt;
&lt;li&gt;Como a minha linguagem lida com ORMs&lt;/li&gt;
&lt;li&gt;Como a minha linguagem lida com Migrations&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Padrões de Projeto (ou Design Patterns)
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk1smws8go9n2uuess4tv.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk1smws8go9n2uuess4tv.gif" alt="Image description" width="640" height="640"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sem querer falar mal, mas se Javascript foi sua primeira linguagem, pode ter sido que você tenha aprendido que basta escrever toda a sua lógica dentro do arquivo "script.js" e tudo funcionará.&lt;/p&gt;

&lt;p&gt;E funciona mesmo. Mas a que custo!&lt;/p&gt;

&lt;p&gt;Quando for necessário corrigir um bug ou inserir uma feature, você não vai querer varrer um arquivo de quatro mil linhas, escrito por outra pessoa, sem saber se é aquela linha com o comentário "apagar" que está sustentando todo o sistema em pé.&lt;/p&gt;

&lt;p&gt;É para salvar nossas vidas que os &lt;strong&gt;padrões de projetos existem. MVC, MVVM, Factory, DTO são apenas alguns deles&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Se quiser ir além, pode pesquisar também sobre &lt;strong&gt;arquitetura de software&lt;/strong&gt;, para entender o que são coisas como &lt;strong&gt;DDD, Event Driven, Arquitetura em pipeline, camadas, microkernel, microsservicos&lt;/strong&gt;... Para um iniciante, basta saber que esses termos existem, para você não ficar boiando nas discussões "do Olimpo" entre os seniores. Não se preocupe tanto em aprender as minúcias, por enquanto.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Padrões de projetos utilizados na minha linguagem.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. Dependências
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wQG8-FbZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://media1.tenor.com/m/N_b6y7Ym0b0AAAAd/java-schmiby.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wQG8-FbZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://media1.tenor.com/m/N_b6y7Ym0b0AAAAd/java-schmiby.gif" alt="De forma alguma! Nem pense!" width="518" height="640"&gt;&lt;/a&gt;&lt;br&gt;
Como tenho repetido por todo o texto, muitas das soluções que utilizamos no nosso código não são nossas. E &lt;strong&gt;todo o código que emprestamos de alguém é uma dependência.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;E sobre dependências, duas coisas são importantes: o gerenciamento e a injeção. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gerenciar dependências&lt;/strong&gt;, na prática, é um arquivo que funciona como &lt;strong&gt;um caderninho onde anotamos todo o código que é emprestado&lt;/strong&gt;. Com o detalhe de que seu código não reconheceria uma função de uma dependência que não estivesse anotada lá.&lt;/p&gt;

&lt;p&gt;Já a &lt;strong&gt;injeção de dependências é a forma como você insere o código de uma biblioteca alheia dentro do seu&lt;/strong&gt;. Importante entender como cada linguagem resolve isso.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gerenciamento de dependências na minha linguagem&lt;/li&gt;
&lt;li&gt;Injeção de dependências na minha linguagem.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  6. Testes
&lt;/h3&gt;

&lt;p&gt;O mundo dos testes é gigante e da pra escrever textos inteiros sobre. Mas creio que, para o início, basta entender o que são &lt;strong&gt;testes unitários, testes de integração&lt;/strong&gt;, sua importância e como a sua linguagem lida com isso. Sempre há frameworks e bibliotecas que adiantam nosso trabalho.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Testes unitários &lt;/li&gt;
&lt;li&gt;Testes de integração &lt;/li&gt;
&lt;li&gt;Ferramentas e frameworks de testes para a minha linguagem&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  7. Regras de negócio
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--S3MIfQn8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://media1.tenor.com/m/P05ZGAEc05AAAAAC/kellykapoor-business.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--S3MIfQn8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://media1.tenor.com/m/P05ZGAEc05AAAAAC/kellykapoor-business.gif" alt="" width="244" height="244"&gt;&lt;/a&gt;&lt;br&gt;
O que difere um CRUD do outro são as regras de negócio. Todo sistema existe, e só existe para atender uma necessidade. Cadastrar usuários, produtos, pedidos, entregas... E para cada negócio, as regras mudam. &lt;/p&gt;

&lt;p&gt;Em uma rede social, por exemplo, eu posso ver o que os meus colegas estão postando. Mas, em um banco, eu poderia ver quanto dinheiro eles estão depositando?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Regras de negócio precisam atender as especificações não apenas do tipo negócio, clientes, usuários, mas da legislação vigente em cada pais, por exemplo.&lt;/strong&gt; Alguns filmes classificados como "livres" no Brasil sequer podem ser exibidos em países árabes. Como será que a Netflix lida com isso?&lt;/p&gt;

&lt;p&gt;E também tem a questão de coisas que só existem em localidades especificas, como o PIX ou os endereços doidos de Brasília, por exemplo.&lt;/p&gt;

&lt;h3&gt;
  
  
  8. Infraestrutura
&lt;/h3&gt;

&lt;p&gt;Uma vez escrito, onde seu CRUD vai rodar? Se for pra rodar só na sua máquina, então tá tudo certo.&lt;/p&gt;

&lt;p&gt;Mas se tiver que rodar em rede, você vai precisar de ferramentas como Docker, para "containerizar" seu código; Kubernetes, para orquestrar esses contêineres e entender sobre Cloud e qual cloud você pretende utilizar. Além de git e github, para manter os ciclos de integração e entrega, o famoso CI/CD.&lt;/p&gt;

&lt;p&gt;Mas uma vez: vá aos poucos. Para fazer o básico aqui, o básico já basta.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Git&lt;/li&gt;
&lt;li&gt;Github&lt;/li&gt;
&lt;li&gt;Docker&lt;/li&gt;
&lt;li&gt;Kubernetes&lt;/li&gt;
&lt;li&gt;Cloud&lt;/li&gt;
&lt;li&gt;CI/CD&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Quando ouvimos "é só um CRUD", podemos partir de algo bem simples, como um código que lê algo do console e salva em um banco de dados até um backend robusto.&lt;/p&gt;

&lt;p&gt;Meu primeiro CRUD na vida foi um código VBA que lia algumas coisas numa "msgbox" e salvava dentro de uma planilha. Simples assim. Mas o caos em que aquilo se tornou me fez entender a necessidade de muitos dos conceitos que apontei nesse texto.&lt;/p&gt;

&lt;p&gt;Creio que este pode ser um bom guia para iniciantes. Nenhum assunto aqui foi esgotado. Dá pra se aprofundar em muitas coisas. Mas creio que esse seja um bom início.&lt;/p&gt;

</description>
      <category>crud</category>
      <category>backend</category>
    </item>
  </channel>
</rss>
